软工课堂练习
今天的软工课上进行了程序单元检测的学习
一个完整的应用是由十个上百个程序组合而成,所以当出现错误时很难发现问题出现在哪里。
代码完善的过程中不可或缺的三个要素就是代码的美观,注释和元素的命名
美观就是合理的缩进和换行,注释就是每写完一步都要进行解释说明,元素的命名需要统一和符合其用法。
以上都是一个合格的码农养成习惯,方便自己日后进行改动,方便其他人看懂。
简单的课上练习:求一维数组的子数组最大值
首先了解原理——子数组是数组内连续的任意数量的单位的集合
收集信息——连续,任意数量
思考对策——最简单的方法就是把数组的所有字数组列出来并求和比大小,需要设置子数组开始位置,子数组容量,循环遍历,子数组和存入新数组等等
实践思考——依照对策完成的程序,是需要额外占据空间存数,存入的数只有一个是需要的,其他的都会废弃;
改进方法——增加监视哨兵,遍历后都与监视哨比较,替换监视哨留下最大值
实践思考——遍历次数中有很多并连续地和哨兵比较也无法改变哨兵值,比如[-5,1,2]遍历时容量为1时数组[2]最大,容量为2时[-5,1]与哨兵比较就无法改变其值。这样的情况还有许多,造成的后果就是时间浪费。
改进方法——设置两个监视哨,数组只有一个数时本身最大。两个或以上时,从第二个开始,第i个的最大和它之前i-1个中最大值比较,留下最大值在参与下一个i的循环。
实践思考——基本时间复杂度和空间复杂度都解决。但这知识一个合格的程序,还不能称作是应用。
所以对于从程序到应用的转换,还需要以下思考
数组是用户输入的,数据的类型不能保证并且数据大小有限。
数据不只是输入的形式,还有文件。
一维数组的解决,能否拓展到二维数组
……
今天解决了文件问题,并简单避免了数据类型不符(空数组,非数字字符)的情况
public class One_Max { public static int Max(int list[],int n) { if(n==1) { return list[0]; } int nStart=list[0]; int nAll=list[0]; for(int i=1;ii) { if(list[i]>nStart+list[i]) { nStart=list[i]; } else { nStart=nStart+list[i]; } if(nStart>nAll) { nAll=nStart; } } return nAll; } public static void main(String args[]) { int list[]=new int[100]; Scanner sc=null; try { sc = new Scanner(new FileInputStream("C:/Users/26981/Desktop/other/66.txt")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } int i=0; String num[]=new String[100]; num[i]=""; while(sc.hasNext()) { while(sc.hasNext()) { String st=sc.next(); st=st.trim(); for(int j=0;j ) { if(st.charAt(j)>=48&&st.charAt(j)<=57||st.charAt(j)=='-') { num[i]+=st.charAt(j); if(j==(st.length()-1)){ list[i]=Integer.parseInt(num[i]); i++; num[i]=""; } } else { list[i]=Integer.parseInt(num[i]); i++; num[i]=""; } } } } System.out.println(Max(list,list.length)); sc.close();
只能解决整形问题,如果有浮点型,小数点被默认为非数字字符并将浮点数拆分,这也是日后解决的问题所在