数组编程题

1、(游戏:豆机)豆机,也称为梅花瓶或髙尔顿瓶,它是一个用来做统计实验的设备,是用英国科学家瑟弗兰克斯髙尔顿的名字来命名的。它是一个三角形状的均匀放置钉子(或钩子)的直立板 子,如图所示

 

球都是从板子口落下的。每当球碰到钉子,它就有 50%的机会落向左边或落向右边。在板子底部的槽子中都会累积一堆球。

编写程序模拟豆机。程序应该提示用户输入球的个数以及机器的槽数。打印每个球的路 径模拟它的下落。例如:在图 7-13b中球的路径是 LLRRLLR, 而在图 7-13c中球的路径是 RLRRLRR。使用条形图显示橹中球的最终储备量。下面是程序的一个运行示例:

提示:创建一个名为 slots的教组。教组 slots 中的每个元素存储的是一个槽中球的个数。每 个球都经过一条路径落入一个槽中。路径上 R的个數表示球落下的槽的位置。例如:对于路径 LRLRLRR 而言,球落到 slots[4]中,而对路径 RRLLLLL 而言,球落到 slots[2]中。

题目分析:

 代码思想:

 

import java.util.Arrays;
import java.util.Scanner;

public class Class32 {
    public static void main(String args[]){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter the number of balls to drop:");
        int balls=scanner.nextInt();//输入球的个数
        System.out.print("Enter the number of slots in the bean machine:");
        int[] arr=new int[scanner.nextInt()];   //槽子数组
        String s1="";
        for(int i=0;i<balls;i++){   //遍历每个球
            for(int j=0;j<arr.length-1;j++){//行数是槽子的个数-1
                int n=(int)(Math.random()*10);
                if(n<5){    //小于5为左
                    s1+='L';
                }else{
                    s1+='R';
                }
            }
            System.out.println(s1);
            int count=0;
                for(int a=0;a<s1.length();a++){
                    if(s1.charAt(a)=='R'){
                        count++;//R个数为count
                    }
                }
                arr[count]+=1;
            s1="";  //清空s1,为下一次遍历做准备
        }
        System.out.println("各个槽子中的球数为:"+Arrays.toString(arr));
        //找数组的最大值
        int max=0;
        for(int c=0;c<arr.length;c++){
            if(arr[c]>max){
                max=arr[c];
            }
        }
            System.out.println("最大值为:"+max);//数组的最大值找到
        System.out.println("最终球在槽子中的发布如下所示:");
        int top=max;
        int l=0;
        for(int k=0;k<top;k++) {
            for (l = 0; l < arr.length; l++) {
                if (arr[l] == max) {
                    arr[l]-=1;//将数组最大值-1
                    System.out.print("0");
                }else{
                    System.out.print(" ");
                }
            }
            max=max-1;//此时数组最大值-1,更新数组的最大值
            System.out.println();
        }
    }
}

输出结果:

 2、(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值:

public static int[] eliminateDuplicates(int[] list)

编写一个测试程序,读取 10 个整数,调用该方法,然后显示结果。下面是程序的运行示例:

import java.util.Arrays;
import java.util.Scanner;
public class Class30 {
    public static void main(String args[]){
        //边读边删
        way1();
        //读完再删
        way2();
    }
//方法1
    public static void way1( ){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter ten numbers:");
        int[] arr=new int[0];
        for(int i=0;i<10;i++){
            int number=scanner.nextInt();
            //如果数组中不包含这个数字就存到一个新的数组中:即容量+1,然后给扩容后的这个数组中最后一个元素赋值
            if(!isContains(arr,number)){
                arr=resize(arr,arr.length+1);//获得新数组
                arr[arr.length-1]=number;   //更新数组内的最后一个元素
            }
            //如果包含这个数字,角标i++直接跳过这个数字
        }
        System.out.println(Arrays.toString(arr));
    }
    //判断指定数组是否包含指定元素
    public static boolean isContains(int[] arr,int key){
        for(int i=0;i<arr.length;i++){
            if(arr[i]==key){
                return true;
            }
        }
        return false;
    }
    //重置数组,相当于创建一个新数组
    public static int[] resize(int[] arr,int newLen){
        int[] newArr=new int[newLen];
        for(int i=0;i<arr.length;i++){
            newArr[i]=arr[i];
        }
        return newArr;
    }
    //方法2
    public static void way2(){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter ten numbers:");
        int[] arr=new int[10];
        for(int i=0;i<arr.length;i++){
            arr[i]=scanner.nextInt();
        }
        int size=arr.length;    //size为有效长度,以便于后期维护size
        for(int i=0;i<size;i++){
            //当前数字和后面的挨个比
            for(int j=i+1;j<size;j++){
                //如果有相等,就将重复数字的后面所有数字往前移动
                if(arr[i]==arr[j]){
                    for(int k=j+1;k<size;k++){
                        arr[k-1]=arr[k];
                    }
                    size--;//每次移动后重置有效长度
                }
            }
        }
        for(int i=0;i<size;i++){
            System.out.print(arr[i]+" ");
        }
    }

}

 3.俩个矩阵相乘

参考定义:

 

import java.util.Scanner;
public class Home33 {
    public static void main(String args[]){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter matrix1 2*3:");
        double[][] arr1=new double[2][3];
        for(int i=0;i<arr1.length;i++){
            for(int j=0;j<arr1[0].length;j++){
                arr1[i][j]=scanner.nextInt();
            }
        }
        System.out.print("Enter matrix2 3*2:");
        double[][] arr2=new double[3][2];
        for(int i=0;i<arr2.length;i++){
            for(int j=0;j<arr2[0].length;j++){
                arr2[i][j]=scanner.nextInt();
            }
        }

        double[][] arr=multiplyMatrix(arr1,arr2);   //返回的数组赋值给arr,目的打印
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr[0].length;j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }

         public static double[][] multiplyMatrix(double[][] a,double[][] b){
                double sum=0;
             double[][] arr=new double[a.length][b[0].length];
                //对新数组里面元素的值进行赋值
                    for(int i=0;i<arr.length;i++){
                        for(int j=0;j<arr[0].length;j++){
                            for(int k=0;k<b.length;k++){    //k控制累加的次数,k为a的列或者b的行
                                arr[i][j]+=a[i][k]+b[k][j];     //参考矩阵相乘公式
                            }
                        }
                    }
                return arr; //返回一个数组
         }
}

4.猜字游戏

import java.util.Random;
import java.util.Scanner;

public class Class34 {
	//1.先生成一组单词
	public static String[] words= {"computer","since","this","double","decide"};
	//随机抽取一个单词
	public static String word=null;
	//创建该单词的状态数组
	public static boolean[] state=null;
	//当前轮猜错的次数
	public static int missed=0;
	
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		Random random=new Random();
		word=words[random.nextInt(words.length)];
		state=new boolean[word.length()];
		
	//开始输入字符猜单词
		while(true) {
			String password=getPassWord();	//接收最新的猜单词结果
			System.out.print("Enter a letter in word "+password+":");
			String letter=scanner.nextLine();	//输入一个字母
			changWordsState(letter);	//修改状态数组
			if(isEnd()) {
				System.out.println("The word is "+word+".You missed "+missed+" time");//结束时打印猜单词游戏的结果(单词+错误次数)
				System.out.println("Do you want to guess another word?Enter y or n:");//提示是否继续
				if(scanner.nextLine().equals("y")) {
					word=words[random.nextInt(words.length)];
					state=new boolean[word.length()];
					missed=0;
				}else{
					break;
				}
			}
		}
	}
	//判断是否结束
	private static boolean isEnd() {
		for(int i=0;i<state.length;i++) {
			if(state[i]==false) {	//状态数组存在false则没有结束
				return false;
			}
		}
		return true;
	}
	private static void changWordsState(String letter) {
		boolean isExist=false;
		for(int i=0;i<word.length();i++) {
			if((word.charAt(i)+"").equals(letter)) {//letter是一个字符串对象,所以要将指定角标元素拼接成字符串来比较
				isExist=true;
				if(state[i]==false) {
					state[i]=true;
				}else {
					System.out.println("\t"+letter+" is already in the word");
					return;
				}
			}
		}
		if(!isExist) {
			missed++;	//累加错误次数
			System.out.println("\t"+letter+" is not in the word");
		}
	}
	public static String getPassWord() {
		String password="";
		for(int i=0;i<word.length();i++) {
			if(state[i]==true) {	//如果有这个字母就返回字母
				password+=word.charAt(i);
			}else {
				password+="*";	//如果没有这个字母返回密文
			}
		}
		return password;
	}
}

 5.五子棋

import java.util.Scanner;
class WuZiQi{
    /*
    1.创建一个棋盘
    2.对棋盘进行初始化
    3.打印棋盘
    4.开始游戏
    */

    //1.定义全局变量
    public static String[][] board=null;	//棋盘字符数组
    public static Scanner scanner=new Scanner(System.in);

    public static void main(String[] args){
        
        initBoard();//定义棋盘
       
        printBoard();//打印棋盘
       
        startGame();//开始游戏
    }
    public static void startGame(){
        int player=0;	//先计数从0开始,奇偶交替下棋
        while(!isGameOver()){	//下棋的前提条件是游戏没有结束
            if(player%2==0){//黑方
                System.out.println(">>>黑方下棋:");
                if(!xiaqi("O")){	//如果不成功,当前玩家继续下棋
                    continue;	//重新下棋 
                }
            }else{//白方
                System.out.println(">>>白方下棋:");
                if(!xiaqi("X")){
                    continue;
                }
            }
            player++;	//	更新 
        }
        System.out.println(">>>游戏结束!!");
    }
//判断结束
//默认从第一个棋子开始遍历寻找,所以只判断当前棋子的右,右下,下,右上
    public static boolean isGameOver(){
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board.length;j++){
                if(!board[i][j].equals("+")){
               	//有一个方向为5个棋则返回true,否则继续判断其它方向
                    //向右
                    if(j<11){
                        boolean flag=true;
                        for(int dy=1;dy<=4;dy++){
                            if(board[i][j]!=board[i][j+dy]){
                                flag=false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向下
                    if(i<11){
                        boolean flag=true;
                        for(int dx=1;dx<=4;dx++){
                            if(board[i][j]!=board[i+dx][j]){
                                flag=false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //右下
                    if(i<11&&j<11){
                        boolean flag=true;
                        for(int d=1;d<=4;d++){
                            if(board[i][j]!=board[i+d][j+d]){
                                flag=false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //右上
                    if(i>3&&j<11){
                        boolean flag=true;
                        for(int d=1;d<=4;d++){
                            if(board[i][j]!=board[i-d][j+d]){
                                flag=false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    } 
                }
            }
        }
        return false;	//此时说明四个方向都没有成连棋,表示没有结束,返回false
    }
    //填充棋子
    public static boolean xiaqi(String chess){
        System.out.print(">>>请输入x坐标:");
        int x=scanner.nextInt()-1;
        System.out.print(">>>请输入y坐标:");
        int y=scanner.nextInt()-1;
        if(board[x][y].equals("+")){
            board[x][y]=chess;//更新棋子
            printBoard();//重绘
            return true;
        }else{
            System.out.println(">>>棋子已存在,请重新下棋!");
            return false;
        }
    }
    public static void printBoard(){	//打印
        System.out.print("   ");
        for(int i=1;i<=board.length;i++){
            System.out.printf("%-3d",i);	//i表示棋盘的列所对应数字
        }
        System.out.println();
        for(int i=0;i<board.length;i++){
            System.out.printf("%-3d",i+1);	//i=1+1表示棋盘的行所对应数字
            for(int j=0;j<board[i].length;j++){
                System.out.print(board[i][j]+"  ");
            }
            System.out.println();
        }
    }
    public static void initBoard(){	//定义
        board=new String[15][15];	//创建一个15*15的棋盘
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                board[i][j]="+";
            }
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值