Java基本功练习八(多维数组[二维、三维、模拟评卷系统、九宫格验证])
2014-12-10 20:18
671 查看
学习完一维数组,再进行多维数组的学习会更加容易。多维数组可以解决更为复杂的问题,在用法上与一维数组也有很多类似的地方。下面先从二维数组的基本用法展示开始讲解,然后再进行升级。
示例一:二维数组的基本操作。
运行效果如图所示:
实现的源代码如下:
示例二:显示二维空间所有距离最短的点对。程序要求输入二维点的个数,及每个二维点,然后求出这些二维点相互之间距离最短的所有点对。
运行效果如右所示:
实现的源代码如下图所示:
示例三:三维数组猜生日的小程序。即问用户五个问题,只需回答Yes或No,就可猜出用户生日的日期。
运行效果如图所示:
实现的源代码如下所示:
示例四:模拟评卷系统,输出学生的排名。程序要求输入学生人数8和题目数10,并随机产生每个学生的答案;再给出正确答案进行改卷,最后统计每个学生做对题目的数目,进行排名输出。
运行效果如图所示:
实现源代码如下:
示例五:九宫格的一种验证方法。即是验证某一种输入是否满足九宫格的要求,满足显示”Valid solution“,否则显示”Invalid solution“。
运行效果如图所示:
实现的源代码如下所示:
总结:多维数组的灵活运用可以解决很多复杂的问题。
示例一:二维数组的基本操作。
运行效果如图所示:
实现的源代码如下:
package Blog; import java.util.Scanner; public class blogTryProject { //二维数组基本操作 public static void main(String[] args) { Scanner input = new Scanner(System.in); int[][] matrix = new int[5][5]; System.out.println(matrix.length+" rows and " +matrix[0].length+" columns"); //随机产生5*5数组 for(int row = 0;row < matrix.length;row++){ for(int columns = 0;columns < matrix[row].length;columns++){ matrix[row][columns] = (int)(Math.random()*20); System.out.printf("%3d ",matrix[row][columns]); } System.out.println(); } //按列求和 for(int columns = 0;columns < matrix[0].length;columns++){ int total = 0; for(int row = 0;row < matrix.length;row++) total += matrix[row][columns]; System.out.println("Sum for column "+columns+" is "+total); } //按行求和 for(int row = 0;row < matrix.length;row++){ int total = 0; for(int columns = 0;columns < matrix[row].length;columns++) total += matrix[row][columns]; System.out.println("Sum for row "+row+" is "+total); } //求最大的一行 int maxSum = 0; int indexOfMax = 0; for(int columns = 0;columns < matrix[0].length;columns++){ maxSum += matrix[0][columns]; } for(int row = 1;row < matrix.length;row++){ int maxThisRow = 0; for(int columns = 0;columns < matrix[0].length;columns++) maxThisRow += matrix[row][columns]; if(maxThisRow > maxSum){ maxSum = maxThisRow; indexOfMax = row; } } System.out.println("Row "+indexOfMax+" has the maximun sum of "+maxSum); //随意打乱数组的元素 for(int row = 1;row < matrix.length;row++){ for(int columns = 0;columns < matrix[0].length;columns++){ int i = (int)(Math.random()*matrix.length); int j = (int)(Math.random()*matrix[i].length); int temp = matrix[row][columns]; matrix[row][columns] = matrix[i][j]; matrix[i][j] = matrix[row][columns]; } } //打印打乱后的数组元素 for(int row = 1;row < matrix.length;row++){ for(int columns = 0;columns < matrix[0].length;columns++) System.out.printf("%3d",matrix[row][columns]); System.out.println(); } } }学会了二维数组的基本用法,就要检验一下是否掌握了,以示例二的题目进行检验。
示例二:显示二维空间所有距离最短的点对。程序要求输入二维点的个数,及每个二维点,然后求出这些二维点相互之间距离最短的所有点对。
运行效果如右所示:
实现的源代码如下图所示:
package Blog; import java.util.Scanner; public class blogTryProject { //找出距离最短的所有点对 public static void main(String[]args){ Scanner input = new Scanner(System.in); System.out.print("Enter the number of points: ");//输入点个数 int numberOfPoints = input.nextInt(); double[][]points = new double[numberOfPoints][2];//输入每个点 System.out.print("Enter "+numberOfPoints+" points: "); for(int i = 0;i <points.length;i++){ points[i][0] = input.nextDouble(); points[i][1] = input.nextDouble(); } int[] p1 = new int[numberOfPoints];//目标点下标数组 int[] p2 = new int[numberOfPoints]; int ii = 0,jj = 0; double shortestDistance = distance(points[0][0],points[0][1], points[1][0],points[1][1]);//初始化点对距离 //找出最短距离值 for(int i = 0;i < points.length;i++){ for(int j = i+1;j <points.length;j++){ double distance = distance(points[i][0],points[i][1], points[j][0],points[j][1]); if(shortestDistance > distance) shortestDistance = distance; } } //记录最短距离点对下标 for(int i = 0;i < points.length;i++){ for(int j = i+1;j <points.length;j++){ double distance = distance(points[i][0],points[i][1], points[j][0],points[j][1]); if(shortestDistance == distance){ p1[ii++] = i; p2[jj++] = j; shortestDistance = distance; } } } //打印最短距离点对 for(int i = 0;i < ii;i++){ System.out.println("The closest two points are "+"("+points[p1[i]][0]+","+ points[p1[i]][1]+") and ("+points[p2[i]][0]+","+points[p2[i]][1]+")"); } } public static double distance(double x1,double y1,double x2,double y2){ return Math.sqrt((x2-x1)*(x2-x1)+(y1-y2)*(y1-y2)); } }学完了二维数组,再看看三维数组的几个例子。
示例三:三维数组猜生日的小程序。即问用户五个问题,只需回答Yes或No,就可猜出用户生日的日期。
运行效果如图所示:
实现的源代码如下所示:
package Blog; import java.util.Scanner; public class blogTryProject { //猜生日的小程序 public static void main(String[]args){ int day = 0; int answer; int[][][] dates = { {{ 1, 3, 5, 7}, { 9,11,13,15}, {17,19,21,23}, {25,27,29,31}}, {{ 2, 3, 6, 7}, {10,11,14,15}, {18,19,22,23}, {26,27,30,31}}, {{ 4, 5, 6, 7}, {12,13,14,15}, {20,21,22,23}, {28,29,30,31}}, {{ 8, 9,10,11}, {12,13,14,15}, {24,25,26,27}, {28,29,30,31}}, {{16,17,18,19}, {20,21,22,23}, {24,25,26,27}, {28,29,30,31}}}; Scanner input = new Scanner(System.in); System.out.println("例如你的生日是25日!如实回答以下5个问题。"); for(int i = 0;i < 5;i++){ System.out.println("Is your birthday in Set"+(i+1)+"?"); for(int j = 0;j < 4;j++){ for(int k = 0;k < 4;k++) System.out.printf("%4d",dates[i][j][k]); System.out.println(); } System.out.print("Enter 0 for No and 1 for Yes: "); answer = input.nextInt(); if(answer == 1) day += dates[i][0][0]; } System.out.println("Your birthday day is "+day); } }学完三维数组,相应的给出一个示例作为练习。
示例四:模拟评卷系统,输出学生的排名。程序要求输入学生人数8和题目数10,并随机产生每个学生的答案;再给出正确答案进行改卷,最后统计每个学生做对题目的数目,进行排名输出。
运行效果如图所示:
实现源代码如下:
package Blog; import java.util.Scanner; import java.util.Arrays; public class blogTryProject { //多选题测验评分,并排名输出 public static void main(String[]args){ final int NUMBER_OF_STUDENT = 8;//学生数目 final int NUMBER_OF_TIMU = 10;//题目数目 char[][] student = new char[NUMBER_OF_STUDENT][NUMBER_OF_TIMU];//打印学生答案 student = printStudentAnswer(NUMBER_OF_STUDENT,NUMBER_OF_TIMU); char[] key = {'D','B','D','C','C','D','A','E','A','D'};//打印正确答案 printCorrectAnswer(NUMBER_OF_TIMU,key); int[] count = new int[NUMBER_OF_STUDENT];//模拟改卷,并评分 count = printGaiJuanPingFen(student,key,count); int[] bianHaoOfStudent = new int[NUMBER_OF_STUDENT];//学生排名输出 printPaiMing(bianHaoOfStudent,count); } public static char[][] printStudentAnswer(int numS,int numT){ System.out.println("学生给出的题目答案如下"); System.out.print(" 题号:"); for(int i = 0;i < numT;i++) System.out.printf("%d ",i); System.out.println(); char[][] student = new char[numS][numT]; for(int i = 0;i < student.length;i++){ System.out.printf("Student %2d ",i); for(int j = 0;j < student[0].length;j++){ char c = (char)('A'+Math.random()*('E'-'A'+1)); student[i][j] = c; System.out.printf("%2c",student[i][j]); } System.out.println(); } return student; } public static void printCorrectAnswer(int numT,char[] key){ System.out.print("题目正确答案:"); for(int i = 0;i < numT;i++) System.out.printf("%c ",key[i]); System.out.println(); } public static int[] printGaiJuanPingFen(char[][] student,char[] key,int[] count){ for(int i = 0;i < student.length;i++){ for(int j = 0;j < student[0].length;j++){ if(student[i][j] == key[j]) count[i]++; } System.out.printf("Student %2d 做对了 %2d 道题\n",i,count[i]); } return count; } public static void printPaiMing(int[] bianHaoOfStudent,int[] count){ for(int i = 0;i < bianHaoOfStudent.length;i++) bianHaoOfStudent[i] = i; insertSort(count,bianHaoOfStudent);//排名函数 for(int i= 0;i < count.length;i++) System.out.println("Student "+bianHaoOfStudent[i]+" 排名第 "+(i+1) +" (做对"+count[i]+"题)"); } public static void insertSort(int[] chars,int[] bianHaoOfStudent){ System.out.println("成绩排名如下:"); for(int i = 1;i < chars.length;i++){ for(int j = 0;j < i;j++){ if(chars[i] > chars[j]){ int temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; int temp1 = bianHaoOfStudent[i]; bianHaoOfStudent[i] = bianHaoOfStudent[j]; bianHaoOfStudent[j] = temp1; } } } } }作为练习,童鞋们可以将此题改为任意个学生,任意个题目,手工录入正确答案,然后考虑并列的排名。请童鞋们自行练习!
示例五:九宫格的一种验证方法。即是验证某一种输入是否满足九宫格的要求,满足显示”Valid solution“,否则显示”Invalid solution“。
运行效果如图所示:
实现的源代码如下所示:
package Blog; import java.util.Scanner; import java.util.Arrays; public class blogTryProject { //九宫格简化版本,验证输入的答案是否正确 public static void main(String[]args){ Scanner input = new Scanner(System.in); int[][] grid =readASolution(); System.out.println(isValid(grid) ? "Valid solution" : "Invalid solution"); } public static int[][] readASolution(){ Scanner input = new Scanner(System.in); System.out.println("Enter a SuDu puzzle solution:"); int [][] grid = new int[9][9]; for(int i = 0;i < 9;i++) for(int j = 0;j < 9;j++) grid[i][j] = input.nextInt(); return grid; } public static boolean isValid(int[][] grid){ //检查每行是否包含1到9 for(int i = 0;i < 9;i++) if(!is1To9(grid[i])) return false; //检查每列是否包含1到9 for(int j = 0;j < 9;j++){ int[] column = new int[9]; for(int i = 0;i < 9;i++) column[i] = grid[i][j]; if(!is1To9(column)) return false; } // for(int i = 0;i < 3;i++){ for(int j = 0; j < 3;j++){ int k = 0; int[] list = new int[9]; for(int row = i*3;row < i*3 + 3;row++) for(int column = j*3;column < j*3 +3;column++) list[k++] = grid[row][column]; if(!is1To9(list)) return false; } } return true; } public static boolean is1To9(int[] list){ int[] temp = new int[list.length]; System.arraycopy(list, 0, temp, 0, list.length); java.util.Arrays.sort(temp); for(int i = 0;i < 9;i++) if(temp[i] != i + 1) return false; return true; } }
总结:多维数组的灵活运用可以解决很多复杂的问题。
相关文章推荐
- Java基本功练习九(多维数组强化一[五子棋、九个正面和背面、矩阵相乘])
- Java基本功练习十(多维数组强化二【悬挂的四子棋】)
- java例程练习(数三退一[用数组模拟])
- Java基本功练习七(一维数组强化[豆机问题、八皇后问题])
- Java基础编程小练习---(数组)学生成绩管理系统
- Java数组之二维数组、多维数组(迷宫实例)
- java打字系统模拟打字练习采用JFrame+IO文件操作+线程源码
- Java基础-二维和三维数组
- JAVA----关于数组模拟链表的练习总结
- C++程序员学Java系列之十三:多维数组之二维数组
- java 二维数组,三维数组 ,糊糙数组,多维数组示例代码
- java中用数组模拟的酒店管理系统
- java自学笔记9:异常练习(模拟借书系统)
- java例程练习(数三退一[用数组模拟])
- Java基本功练习五(一维数组相关操作[声明、创建、乱序、排序、查找]和方法的重载举例[浅议])
- Java基本功练习十六(继承和多态【继承多态覆盖练习、多重继承、数组线性表ArrayList、银行账户类升级】)
- Java基本功练习二十(图形【时钟模拟、绘制弧形多边形折线段、显示图像、消息显示面板等】)
- Java数组之二维数组与多维数组(基础详解)
- 《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)
- Java基础练习之用数组写一个员工管理系统