设计思路:
之前还有一个课堂练习,是用户输入一个整数组,求其中最大子数组之和,我借鉴的其他同学的代码,仅在此基础上修改的。
运用try,catch使得用户不必在输入数组之前输入数组的长度,但是需要一个除整数以外的数来结尾。一共使用了3个循环,运用一个循环得出每个数组中最大子数组之和的最大值,一个是用来
计算最大子数组之和,最后一个用来实现数组的前移。第一个循环中包着另外两个循环。
总的来说,是在之前课堂练习的基础上增加了将一个数组中的每个数做一次最前面的数,从中求出最大值。
程序代码:
1 import java.util.InputMismatchException; 2 import java.util.Scanner; 3 public class Maxshuzu { 4 public static void main(String args[]) 5 { 6 int jishuqi=0; 7 //定义一个最大值 8 int MAX=0; 9 //定义一个数组shuzu[100],之中100可修改 10 int shuzu[]=new int[100]; 11 Scanner in=new Scanner(System.in); 12 System.out.print("请输入一组数,以一个非整数结尾:"); 13 //输入,以除整数外的任何东西结尾 14 while(true) 15 { 16 //验证输入是否合法,以此为循环条件的结束 17 try 18 { 19 shuzu[jishuqi]=in.nextInt(); 20 } 21 catch(InputMismatchException e) 22 { 23 break; 24 } 25 26 jishuqi++; 27 } 28 //此循环是为了得出每个数组中最大子数组之和的最大值 29 for(int m=0;m<jishuqi;m++) 30 { 31 int maxsum=0,sum=0; 32 //计算最大子数组之和 33 for(int i=0;i<jishuqi;i++) 34 { 35 if(sum<0) 36 { 37 sum=0; 38 } 39 sum+=shuzu[i]; 40 if(sum>maxsum) 41 { 42 maxsum=sum; 43 } 44 } 45 //实现数组的前移 46 int a=shuzu[0]; 47 for(int n=0;n<jishuqi-1;n++) 48 { 49 shuzu[n]=shuzu[n+1]; 50 } 51 shuzu[jishuqi-1]=a; 52 53 if(maxsum>MAX) 54 { 55 MAX=maxsum; 56 } 57 } 58 //输出结果 59 System.out.println("子数组的最大值为:"+MAX); 60 } 61 }
结果截图:
程序总结
程序改完之后,结果不对,不能快速发现问题所在,究其原因,原来是没有将个模块做单元测试。代码上的原因是定义最大值时将其定义在循环之外了。