• 计算与软件工程课程 作业三


    这个作业要求在哪里 第三周作业
    我在这个课程的目标是 通过练习单元测试巩固所学的“两人合作”这章内容
    此作业在哪个具体方面帮我实现目标 代码编写更加规范专业
    其他参考文献 《构建之法》和 参考代码
    作业正文 https://i-beta.cnblogs.com/posts/edit;postId=12461182)

    一、单元测试(数组中最大子数组的和)

    用类/函数来实现
    需求:希望返回 3 种信息
    最大子数组的和
    最大子数组开始的下标
    最大子数组结束的下标
    从文本文件中读输入的数据,熟悉文件操作, 文件有两种数据
    第一个数字:这次测试中有多少个数据, 数字后面是冒号。
    后续数字: 每个数据的值,用逗号隔开
    比如
    文件内容:
    17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
    输出
    sum = 71

    二、具体代码

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    int getmax(int array[],int length)
    {
        int sum = 0;    //记录当前连续子数组的最大和
        int max = 0;   //记录当前数组连续几个元素的和(当其值小于0时,重新对其赋值;【即:抛弃前面的所有元素】)
        int startIndex = 0; //记录子数组(和最大)的起始位置
        int endIndex = 0;   //记录子数组(和最大)的终止位置
        int newStartIndex = 0;  //记录子数组(和最大)的新的起始位置
        for (int i = 0; i < length; i++)    //遍历整个目标数组
        {
            if (max < 0)   //如果max < 0;则要对max重新赋值
            {
                max = array[i];    //对max重新赋值
                newStartIndex = i;  //暂时记录子数组(和最大)的新的起始位置(要看后续的sum 和 max是否发生交换)
            }
            else
            {
                max += array[i];   //如果max >= 0;则要继续将此时的数组元素(array[i])加入到max中
            }
            if (sum < max) //如果此时 sum < max;则表示此时的子数组和大于之前的子数组和
            {
                sum = max; //将大的子数组和max赋值给sum
                startIndex = newStartIndex; //子数组(和最大)的新的起始位置起作用了
                endIndex = i;   //子数组(和最大)的终止位置(只要发生交换就说明endIndex发生变化)
            }
        }
        return max;
    }
    
    int getstartIndex(int array[],int length)
    {
        int sum = 0;    //记录当前连续子数组的最大和
        int max = 0;   //记录当前数组连续几个元素的和(当其值小于0时,重新对其赋值;【即:抛弃前面的所有元素】)
        int startIndex = 0; //记录子数组(和最大)的起始位置
        int endIndex = 0;   //记录子数组(和最大)的终止位置
        int newStartIndex = 0;  //记录子数组(和最大)的新的起始位置
        for (int i = 0; i < length; i++)    //遍历整个目标数组
        {
            if (max < 0)   //如果temp < 0;则要对temp重新赋值
            {
                max = array[i];    //对max重新赋值
                newStartIndex = i;  //暂时记录子数组(和最大)的新的起始位置(要看后续的sum 和 max是否发生交换)
            }
            else
            {
                max += array[i];   //如果max >= 0;则要继续将此时的数组元素(array[i])加入到max中
            }
            if (sum < max) //如果此时 sum < max;则表示此时的子数组和大于之前的子数组和
            {
                sum = max; //将大的子数组和max赋值给sum
                startIndex = newStartIndex; //子数组(和最大)的新的起始位置起作用了
                endIndex = i;   //子数组(和最大)的终止位置(只要发生交换就说明endIndex发生变化)
            }
        }
        return startIndex;
    }
    int getendIndex(int array[],int length)
    {
        int sum = 0;    //记录当前连续子数组的最大和
        int max = 0;   //记录当前数组连续几个元素的和(当其值小于0时,重新对其赋值;【即:抛弃前面的所有元素】)
        int startIndex = 0; //记录子数组(和最大)的起始位置
        int endIndex = 0;   //记录子数组(和最大)的终止位置
        int newStartIndex = 0;  //记录子数组(和最大)的新的起始位置
        for (int i = 0; i < length; i++)    //遍历整个目标数组
        {
            if (max < 0)   //如果max < 0;则要对max重新赋值
            {
                max = array[i];    //对max重新赋值
                newStartIndex = i;  //暂时记录子数组(和最大)的新的起始位置(要看后续的sum 和 max是否发生交换)
            }
            else
            {
                max += array[i];   //如果max >= 0;则要继续将此时的数组元素(array[i])加入到max中
            }
            if (sum < max) //如果此时 sum < max;则表示此时的子数组和大于之前的子数组和
            {
                sum = max; //将大的子数组和max赋值给sum
                startIndex = newStartIndex; //子数组(和最大)的新的起始位置起作用了
                endIndex = i;   //子数组(和最大)的终止位置(只要发生交换就说明endIndex发生变化)
            }
        }
        return endIndex;
    }
    
    
    int main()
    {
        int length,i=0;
        cout<<"请输入个数:";
        cin>>length;
        cout<<"请输入数组:";
        int array[1000]={0};
        for(i=0;i<length;i++)
        {
            cin>>array[i];
        }
            cout<<"最大子数组的和为:"<<getmax(array,length)<<endl;
        cout<<"最大子数组起始下标:"<<getstartIndex(array,length)<<endl;
        cout<<"最大子数组结束下标:"<<getendIndex(array,length)<<endl;
        system("pause");
        return 0;
    }
    

    三、代码运行结果

    运行结果图

    四、码云链接

    (https://gitee.com/sun_si_jiao/secondwarehouse/tree/master/)

    五、《构建之法》第三章读后感

    这一部分主要讲的是两人合作的重要性,第一小节介绍的是代码规范和复审,复审的意思是看代码是否在“代码规范”的框架内正确地解决了问题,第二小节就如何复审引入了结对编程模式,因为每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误,所以通过结对编程,两位程序员可以随时复审和交流,降低程序错误率,这样就省下了很多修改和测试的时间,进而提高了软件开发的总体效率,但作者也提出结对编程并不适用于所有情况,比如处于探索阶段的项目、验证测试需要运行很长时间等等一些特殊情况。

  • 相关阅读:
    【数论】 快速幂
    【时间复杂度】你还在担心时间复杂度太高吗?
    【数据结构】 最小生成树(三)——prim算法
    【数据结构】 最小生成树(二)——kruskal算法
    node.js初识11
    node.js初识10
    node.js初识09
    node.js初识08
    node.js初识07
    node.js初识06
  • 原文地址:https://www.cnblogs.com/sunsijiao/p/12461182.html
Copyright © 2020-2023  润新知