求最大子数组并单步显示
题目介绍:
1.设计并实现一个系统,让一个普通用户就能通过单步执行的方式看到你的算法是如何工作的。
用户可以自行定义数组的大小。
2. 用户这时候有两个选择
按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
分析:该题目主要是在原先求最大子数组的程序基础上添加if语句,可以单步执行;主要要求是对源程序(求最大子数组)流程熟悉
源代码:
package shuzu; import java.util.Scanner; public class T { public static void main(String[] args) { /** * 键盘输入数组 */ int[] a = null; System.out.println("请输入数组长度:"); Scanner sc = new Scanner(System.in); int len = 0; try { len = Integer.parseInt(sc.nextLine()); } catch (Exception e) { } a = new int[len]; System.out.println("数组长度为" + a.length); System.out.println("请输入数组:"); for(int i=0;i<a.length;i++) { a[i]=sc.nextInt(); } System.out.println("您输入的数组为:"); for(int i=0;i<a.length;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++) {//所有子数组存入二维数组中:以第i个开头的子数组们存入第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++) {//所有子数组存入二维数组中:以第i个开头的子数组们存入第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+"个元素"); } } }; } }
首先键盘输入数组:
键入1继续:
继续按1直到结束: