要求:
1 按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
2 按 自动运行 键, 在 GUI 看到程序自动运行,并自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
3 最好有一个 倒带 / 回滚 的键, 让用户可以看清楚关键的几步。
代码:
package test0425;
import java.util.Scanner;
public class shuzukeshihua {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
//定义数组长度和数组
//输入数组长度
System.out.println("请输入数组的长度:");
int size=sc.nextInt();
int a[]=new int[size];
int sum=0;
int curr=0;
//输入数组的内容
System.out.println("请输入数组内容:");
for(int i=0;i<size;i++) {
a[i]=sc.nextInt();
}
System.out.println("输入1单步执行,否则连续执行");
int q=0;
q=sc.nextInt();
if(q==1) {
//有负有正
for(int i=0;i<size;i++) {
System.out.println("第"+(i+1)+"步");
curr=curr+a[i];
System.out.println("第"+(i+1)+"个子数组的总和:"+curr);
if(curr<0) {
curr=0;
}else {
if(sum<curr) {
sum=curr;
}
}
System.out.println("第"+(i+1)+"个子数组下,当前的最大子数组之和"+sum);
System.out.println("当前已检查了前"+(i+1)+"个元素");
System.out.println(" ");
System.out.println("输入1为继续,0为退出");
int g=0;
g=sc.nextInt();
if(g==0) {
break;
}
else if(g==1){
System.out.println("继续执行!");
}
}
//若全是是负数
if(sum==0) {
System.out.println("全为负数");
int sum1=a[0];
for(int i=0;i<size-1;i++) {
if(sum1>a[i+1]) {
sum1=sum1;
}
else {
sum1=a[i+1];
}
System.out.println("第"+(i+1)+"步");
System.out.println("当前的最大值:"+sum1);
System.out.println(" ");
}
sum=sum1;
}
System.out.println("连续子数组的最大值为:"+sum);
}
else//连续
{
//有负有正
for(int i=0;i<size;i++) {
System.out.println("第"+(i+1)+"步");
curr=curr+a[i];
System.out.println("第"+(i+1)+"个子数组的总和:"+curr);
if(curr<0) {
curr=0;
}else {
if(sum<curr) {
sum=curr;
}
}
System.out.println("第"+(i+1)+"个子数组下,当前的最大子数组之和"+sum);
System.out.println("当前已检查了前"+(i+1)+"个元素");
System.out.println(" ");
}
//若全是是负数
if(sum==0) {
int sum1=a[0];
for(int i=0;i<size-1;i++) {
if(sum1>a[i+1]) {
sum1=sum1;
}
else {
sum1=a[i+1];
}
System.out.println("第"+(i+1)+"步");
System.out.println("当前的最大值:"+sum1);
System.out.println(" ");
}
sum=sum1;
}
System.out.println("连续子数组的最大值为:"+sum);
int huigun=0;
System.out.println("输入回滚步骤:");
huigun=sc.nextInt();
if(huigun>=1&&huigun<=size)
{//输入的回滚步骤属于正常范围
if(sum<=0) {//全为负数的回滚
int sum1=a[0];
for(int i=0;i<size-1;i++) {
if(sum1>a[i+1]) {
sum1=sum1;
}
else {
sum1=a[i+1];
}
if(i+1==huigun) {
System.out.println("第"+(i+1)+"步");
System.out.println("当前的最大值:"+sum1);
System.out.println(" ");
}
}
sum=sum1;
}
else {//有负有正的回滚
curr=0;
for(int i=0;i<huigun;i++) {
curr=curr+a[i];
if(i+1==huigun)
{
System.out.println("第"+(i+1)+"步");
System.out.println("第"+(i+1)+"个子数组的总和:"+curr);
}
if(curr<0) {
curr=0;
}else {
if(sum<curr) {
sum=curr;
}
}
if(i+1==huigun)
{
System.out.println("第"+(i+1)+"个子数组下,当前的最大子数组之和"+sum);
System.out.println("当前已检查了前"+(i+1)+"个元素");
System.out.println(" ");
}
}
}
}
}
}
}
运行截图:
可以选择单步或者连续执行
单步过程:输入1继续,0退出
连续过程:
在连续过程下可以输入回滚:手动输入回滚到第几步