在原来数组问题的基础上:
用户这时候有两个选择
2.1 按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
2.2 按 自动运行 键, 在 GUI 看到程序自动运行,并自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
代码简单实现如下:
package array;
import java.util.Scanner;
import java.io.*;
import java.math.BigDecimal;
public class array1 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
System.out.println("请输入数组的长度");
int n=sc.nextInt();
int array[]=new int[n];
int array2[]=new int[n];
System.out.println("请依次输入数组的每个值");
for(int i=0;i<n;i++) {
array[i]=sc.nextInt();
}
for(int i=0;i<n;i++) {
array2[i]=0;
}
int max;
int[] array3=new int[2*n-1];
for(int j=0;j<n;j++) {
array3[j]=array[j];
}
for(int i=n;i<2*n-1;i++)
array3[i]=array[i-n];
for(int i=0;i<2*n-1;i++) {
System.out.print(array3[i]+" ");
}
/*当前最大子数组,从哪个到哪个,你检查了几个子数组了,还差几个。*/
System.out.print("\n");
int num=0;//数组个数。
System.out.println("输入0开始");
int number=sc.nextInt();
if(number==0) {
for(int i=0;i<n;i++) {
max=array3[i];
int sum=0;
//System.out.print("abc"+max+" ");
int temp=i;
//for(int j=i;j<2*n-1;j++) {
for(int j=i;j<=n-1+i;j++) {
num++;
sum=sum+array3[j];
if((max<sum)&&(j-i+1<=n)) {
temp=j;
//System.out.println("123"+temp);
max=sum;
}
System.out.println("输入0执行下一步");
int number1=sc.nextInt();
if(number1==0) {
System.out.println("当前执行第"+num+"步,当前正在计算第"+num+"个子数组,"+"从数"+array3[i]+"开始,"+"从数"+array3[j]+"结束,"+"当前最大子数组和为"+max+",最大子数组范围"+array3[i]+"到"+array3[temp]);
}
else {
System.out.println("输入有误,程序退出");
System.exit(0);
}
}
array2[i]=max;
//System.out.println("def"+max);
}
}
else {
System.out.println("输入有误,程序退出");
System.exit(0);
}
int k=array2[0];
for(int i=0;i<n;i++) {
System.out.println("ghi"+array2[i]);
}
for(int i=0;i<n;i++) {
if(array2[i]>k) {
k=array2[i];
}
}
/*1 2 3 4 5 1 2 3 4
* n+n-1
*6 -7 9 -3 5
* 1 1+n
* 2 2+n
* 1 2 3 4 1 2 3
* 2 3 4 1
* 3 4 2 1
* */
System.out.println("最大值"+k);
}
}
截图:
总结:自己只是简单地实现了一个用户通过不断按0键清楚地看到程序执行每一步的过程。
但是并不能同时实现按 单步执行 键(最好用不同的颜色标识不同的状态。没有实现这点儿)和按 自动运行 键(自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
然后自己后面学会的话,后续会再改进和补充