• 软件工程课堂练习——结队开发二


    结队人员:信1201-1班 曹美娜 盖相庚

    这次的题目要求是在将上次实现的一位数组变成二维数组,然后找到所有子矩阵中各元素和的最大值。

    一、设计思路

     我们是在上次实现一维数组的基础上做的更改,难点是怎么将所有二维子数组都遍历到,并找到他们和的最大值。所以我们的设计思路如下:

    应题目要求首先从“xx.txt”中读取出二维数组比如:

       1   2   3

       4   5   6

       1   2  3

    我们将数组第一行取出放到一个新的数组sumarry[][]中,然后第一行和第二行的和取出放到sumarry[][]中,然后是第一、二、三行的和放入,接着将第二行放入,和上次相同将二三行的行放入,最后再将第三行放入sumarry[][]中,形成一个新的数组,如下

    1  2  3

    5  7  9

    6  9  12

    4  5  6

    5  7  9

    1  2  3

    然后和上次做的找到一位数组中和的最大值相同,把每一行看成一个一位数组找到最大的和,依次比较每一行的最大值,最后找到他们中的最大值即为我们要找到的二维数组中所有子矩阵中各元素和的最大值。

    二、源代码

    //程序开发者:曹美娜 盖相庚
    //   开发时间:2015/3/23
    
    #include "stdafx.h"
    #include "fstream.h"
    #include "iostream.h"
    #include "stdio.h"
    #define N 50
    #define M 50
    
    void readarry(int arry[][N],int &line,int &row)            //读取txt文件中的二维数组
    {
        ifstream infile("a.txt");
        if(!infile)
            cout<<"读取失败!"<<endl;
        else
        {
            infile>>line>>row;
            for(int i=0;i<line;i++)
            {
                for(int j=0;j<row;j++)
                {
                    infile>>arry[i][j];
                }
            }
        }
    }
    
    int maxarry(int arry[][N],int line,int row)       //找到二维数组中子矩阵中元素和的最大值
    {
        int max[N];
        printf("以上数组经变形后:
    ");
        for(int l=0;l<line;l++)                
        {
            int max1=-1000;
             for(int j=0;j<row;j++)
            {
                int sum=0;        
                for(int i=j;i<row;i++)
               {
                    sum=sum+arry[l][i];
                    if(sum>=max1)
                    {
                        max1=sum;
                    }
               }
                            
             }
                 max[l]=max1;
                 
                printf("第%d集合所有子数组的和的最大值为:%d
    ",l+1,max1);
        }
        int fmax=max[0];
        for(int q=0;q<line;q++)
        {
            if(max[q]>fmax)
              fmax=max[q];
        }
         printf("所以次二位数字中子数组中各元素的和的最大值为:%d
    ",fmax);
            
            return 0;
    }
    
    void show(int arry[][N],int line,int row)      //显示数组
    {
        printf("从“a.txt”文件中读取的数组为:
    ");
        for(int i=0;i<line;i++)
        {
            for(int j=0;j<row;j++)
            {
                printf("	%d	",arry[i][j]);
            }
            printf("
    ");
        }
    }
    
    void reacharry(int arry[][N],int line,int row)      //组成一个新数组
    {
        int sumarry[M][N];
        int sumline,sumrow;
        int z;
        for(int r=0;r<row;r++)
        {
            z=0;
            for(int i=0;i<line;i++)
            {
                for(int q=line;q>0;q--)
                {
                    int sum=0;
                    for(int j=i;j<=line-q+i;j++)
                    {
                        sum=sum+arry[j][r];
                    }            
                    sumarry[z][r]=sum;
                    z++;            
                }
            }
        }
        sumline=z-1;
        sumrow=r;    
        maxarry(sumarry,sumline,sumrow);      //将得到的新数组交给maxsrry(),找到最后结果
    
    }
    
    
    int main(int argc, char* argv[])
    {
        int arry[M][N];
        int line,row;                 //行,列
        readarr(arry,line,row);
        show(arry,line,row);
        reacharry(arry,line,row);
        
       return 0;
    }

    三、实验心得

      由于这次是在一位数组的基础上改的题目,所以再和小伙伴讨论时思维总是在在一位数组那里,受到了限制,想着用类似上道题目的方法来实现,不过遇到了麻烦,就是如何将所有子矩阵都包含在内,不过在上课期间曹坤同学得想法给了我们思路,最后我们的小程序在我和盖盖同学的努力下完成,程序还有很多不足的地方,比如只是返回子矩阵的和的最大值,而没能返回对应的这个子矩阵,表示比较遗憾,以后我们有机会会完善的。再编程过程中我也有遇到麻烦,比如上面的那几个for循环嵌套,就一度把我整蒙,想了好长时间,最后还是在小伙伴的帮助下缕清楚。结队开发还是给了我很大帮助的,平实都是自己闷头敲代码,一旦出现逻辑上的错误自己是很难找到的,而且两个人都全身心的投入进去,把自己的想法和观点摆出来,会发现问题很容易解决,而且效率会更高。

    四、工作照

      

  • 相关阅读:
    nginx设置缓存策略
    http缓存原理理解
    promise教程
    vue项目发布到github演示
    vue路由嵌套子路由不渲染
    hihocoder 1403 1407 1415 后缀数组*3 最长公共子串/最长不重叠重复出现的子串/最长k次重复子串
    hdu 4691 后缀数组+rmq 求子串lcp
    hdu1506+ luogu 1440 单调栈/单调队列裸题
    codeforces 873F 后缀数组+单调栈(fastio)
    HihoCoder
  • 原文地址:https://www.cnblogs.com/caomeina/p/4366913.html
Copyright © 2020-2023  润新知