Task 4 求数组的连续子数组的最大和(团队合作)

小组成员:李敏、刘子晗

 

1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可。我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能。先要定义数组长度和上下限的变量,然后通过if语句对用户所给出的长度和数值进行判断看是否合法,如果不合法要重新输入。最后再加上之前求和的相应代码即可。

2.出现的问题:我们达成协议后,李敏负责编程,我负责测试。开始写程序,在写判断数值是否满足int整型范围的时候出现了错误,我在测试的时候发现她把小于号错写成了大于号,然后加以改正。还出现了几个细节的符号错误。最后我对她写的程序的代码规范提出了一些建议,比方说变量名称规范,括号单独占一行以及要有空格等。都加以改正后就完成了全部工作。

3.源代码:

//求数组中连续子数组的最大和(测试后)
//刘子晗   2015/3/29
#include <iostream>
#include <time.h>
using namespace std;

void main()
{
    int arr[1000];
    int length,MAX,MIN;
    char ifContinue = 'Y';
    srand((unsigned)time(NULL));

    while (ifContinue == 'Y')
    {
        cout << "请输入数组长度length:" ;
        cin >> length;
        cout << "请输入此数组的最小值MIN和最大值MAX:";
        cin >> MIN >> MAX;

        //检测数组范围的上下限数值是否合法
        if( MIN > MAX||MIN <= -2147483648 ||  MAX >= 2147483647)
        {
            cout << "输入的数字不合法,请重新输入:" << endl;
            cin >> MIN >> MAX;
        }

        //检测数组长度的合法性
        if (length == 0)
        {
            cout << "数组长度不能为零,请重新输入:";
            cin >> length;
        }
        else if(length >= 1000 || length > MAX - MIN)//保证数组中没有重复的数
        {
            cout << "数组长度过长,请输入1000以内的数组长度:";
            cin >> length;
        }
        //检测数组长度的合法性


        cout << "生成的数组为:"<< endl;
        for (int i = 0;i < length; i++)
        {
            arr[i] = rand()%( MAX - MIN + 1 ) + MIN;//生成一个随机数组
            cout << arr[i] << "   ";
        }    
        cout << endl;

        //依次按数组的顺序求出当前子数组的最大和
        int tran = arr[0]; 
        int sum = tran; 
        for (int j = 1; j < length; j++) 
        { 
            tran = max(arr[j],tran + arr[j]);
            sum = max(sum, tran); 
        } 
        //考虑到数组的连续(即数组可形象化为一个圈),故分别从数组首端和末端同时进行以求出两端还未相遇前的各自的最大子数组之和
        int i,j,sum1 = arr[0]; 
        for (i = 1; i < length && sum1 + arr[i] > sum1; i++) 
        {
            sum1 += arr[i]; 
        }
        tran = arr[length]; 
        for (j = length - 1; j >= 1 && tran + arr[j] > tran; j--) 
        {
            tran += arr[j]; 
        }
        //依次比较两端数组还未相遇前的两个最大子数组之和的和与之前按数组顺序求出的最大子数组之和
        if ( i < j && sum1 + tran > sum) 
        {
            sum = sum1 + tran; //取两种情况下的最大字数组之和即可
        }

        cout << "该数组的连续子数组之和的最大值为:"  << sum << endl;

        cout << "是否继续测试?请输入:(Y/N)" << endl;
        cin >> ifContinue ;
    }
    
}

4.测试截图:

 

5.总结:(1)通过两个人结对合作,我体会到了“1+1>2”,因为两个人肯定有至少两种想法,通过比较良好的合作可以分工从而提高工作效率;在遇到问题时,可以共同查找资料快速找到解决办法;当然我们也有好几次意见出现不统一的情况,这时就需要及时沟通,如果有对错之分,就可以及时改正,否则就加以改善。以后的学习和工作中想必会有很多的合作,处理好和队友之间的关系,明确分工及时交流的确可以是自己的水平提高地更快,还可以开阔自己的思维。

(2)这个程序我把重点放到了测试和代码规范上,由于平时习惯了写C++,我自己的不足之处主要有:不太爱写注释,变量和参数名有时不按规范,希望自己以后多加注意。

另外老师一直强调Java的重要,所以在网上找了关于Java的代码规范,方便以后对照

相关链接:http://www.infoq.com/news/2014/02/google-java-coding-standards

附图:

 

posted @ 2015-03-29 17:28  mengxiangjialzh  阅读(237)  评论(0编辑  收藏  举报