题目:设计并实现一个系统,让一个普通用户就能通过单步执行的方式看到你的算法是如何工作的。
要求:
- 用户用你的程序读入一个数组文件 (就像我们以前做过的那样),显示初始状态 (就像围棋打谱程序那样)
- 用户也可以自行定义数组的大小,或者要求随机生成一个数字矩阵。
- 用户这时候有两个选择
- 按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
- 按 自动运行 键, 在 GUI 看到程序自动运行,并自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
- 这时最好有一个 倒带 / 回滚 的键, 让用户可以看清楚关键的几步。
设计思路:
要清楚的了解查找最大子数组的流程,在程序流程中将运行步骤打印出来,利用for循环和if语句进行操作
源代码:
package jinyun.com; import java.util.Scanner; public class Shuzu { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //输入数组长度 int n; System.out.println("一请输入数组的长度"); n=sc.nextInt(); //输入数组 int[] a=new int [n]; System.out.println("请输入"+n+"个 整数"); for(int i=0;i<n;i++) { a[i]=sc.nextInt(); } //显示数组内容 System.out.println("检测到您输入了:"+n+"个整数"); System.out.println("输入的数组为:"); for(int i=0;i<n;i++) { System.out.println(a[i]+" "); } //求最大子数组 int num=0;//记录检查数组个数 int x=a.length; int b[][]=new int[x][x];//存子数组 int c[]=new int[x];//存二维数组每一行的最大值 for(int i=0;i<x;i++) {//所有子数组存入二维数组中 int f=0; System.out.println("继续请输入1,否则请按0"); Scanner scan = new Scanner(System.in); try { f = Integer.parseInt(scan.nextLine()); } catch (Exception e) { } if(f==1) { for(int j=i;j<x;j++) {//求出二维数组的一行 int sum=0; for(int s=i;s<=j;s++){//求每一个子数组 sum+=a[s]; } num++; b[i][j]=sum;//存子数组 int m=i+1;int y=j+1; System.out.println("从第"+m+"个元素起"+"到第"+y+"个元素和为:"+b[i][j]); } } } for(int i=0;i<x;i++) {//i为行 for(int j=0;j<x;j++) {//j为列 if(b[i][j]>c[i]) { c[i]=b[i][j]; } } } int s=0; for(int i=0;i<c.length;i++) { if(s<c[i]) { s=c[i]; } }; System.out.println("最大子数组:"+s); System.out.println("当前检查子数组个数:"+num); int h[][]=new int[x][x]; for(int i=0;i<x;i++) { for(int j=0;j<x;j++) {//求出二维数组的一行 int sum=0; for(int g=i;g<=j;g++){ sum+=a[g]; } h[i][j]=sum;//存子数组 if(h[i][j]==s) { int m=i+1;int y=j+1; System.out.println("最大子数组为第"+m+"个元素起"+"到第"+y+"个元素"); } } }; } }
实验结果:

浙公网安备 33010602011771号