软工课堂练习


今天的软工课上进行了程序单元检测的学习

一个完整的应用是由十个上百个程序组合而成,所以当出现错误时很难发现问题出现在哪里。

代码完善的过程中不可或缺的三个要素就是代码的美观,注释和元素的命名

美观就是合理的缩进和换行,注释就是每写完一步都要进行解释说明,元素的命名需要统一和符合其用法。

以上都是一个合格的码农养成习惯,方便自己日后进行改动,方便其他人看懂。


简单的课上练习:求一维数组的子数组最大值

首先了解原理——子数组是数组内连续的任意数量的单位的集合

收集信息——连续,任意数量

思考对策——最简单的方法就是把数组的所有字数组列出来并求和比大小,需要设置子数组开始位置,子数组容量,循环遍历,子数组和存入新数组等等

实践思考——依照对策完成的程序,是需要额外占据空间存数,存入的数只有一个是需要的,其他的都会废弃;

改进方法——增加监视哨兵,遍历后都与监视哨比较,替换监视哨留下最大值

实践思考——遍历次数中有很多并连续地和哨兵比较也无法改变哨兵值,比如[-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();

只能解决整形问题,如果有浮点型,小数点被默认为非数字字符并将浮点数拆分,这也是日后解决的问题所在

相关