问题描述:
设计思想:
首先,此个小程序我会用一个另外的类来完成主要求和。类中第一个方法就是输入,输入数组的长度和数组内的数据;第二个方法来完成子数组求和,首先最大数赋值为数组最后一个数,然后我用while语句循环遍历一次数组算出结果,其中处理过程为:遍历的数如果是正数,首先判断前一个数是否为正,正加上前一个数赋值给此数,然后判断次数是否大于最大数;如果是负数,然后判断是否大于最大数,大则赋值给最大数,否则就加上前一个数赋值给次数。依次循环完毕输出。
出现的问题:
大致写完求和方法后,不能输出结果。调试发现:负数情况下,少考虑了负数不大于最大值的可能。第二次发现有一个bug,比如8 9 -1 2 3的最大值则是17,应该是21。
可能的解决方案(多选):
遍历时如果为负数,则要加上前一个数,这样才能避免上面出现的bug。
源代码:
//课堂测试 //范亚雷 2016.04.05 //import javax.swing.JOptionPane; import java.util.*; class Maxout{ int[] list=new int[10]; int max; int length; Maxout(){} public void Input(){ System.out.println("请输入数组的长度:"); Scanner a=new Scanner(System.in); length=a.nextInt(); Scanner sca=new Scanner(System.in); System.out.println("请依次数组内的数:"); //输入 for(int i=0;i<length;i++) { list[i]=sca.nextInt(); } if(length==0||length<0) //数组为0,报错 {System.exit(0);} max=list[length-1]; //System.out.println(max); } public void Largest(){ //求最大子数组和 while(length>1){ if(list[length-2]>=0) { if(list[length-1]>=0) { list[length-2]=list[length-2]+list[length-1]; //System.out.println("1:"+max); //Largest(); } if(list[length-2]>=max) { max=list[length-2]; //System.out.println("2:"+max); length--; //Largest(); } else {length--;} } else { if(list[length-2]>=max) { max=list[length-2]; //System.out.println("4:"+max); length--; //Largest(); } else { list[length-2]=list[length-2]+list[length-1]; length--; } } } if(length<2) { System.out.println("子数组的和最大为为:" + max); //输出max } } } public class OutMax { public static void main(String[] args){ Maxout m=new Maxout(); m.Input(); m.Largest(); } }
结果截图:
总结:
此次编写,出现来了各种可能出现的情况没有考虑充分,对于各种情况的处理分析不够,导致编写的方法不太正确,出现了小问题。因此在编写程序时,要分析清楚各种可能的出现,再去进行编写。