• 合作项目2


    结组成员:信1201-1柴珏辉 信1201-2邓锐

    一、要求

    1、题目:

    返回一个二维数组中最大子数组的和。

    2、要求:

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    程序要使用的数组放在一个叫 input.txt 的文件中,  文件格式是:

    数组的行数,

    数组的列数,

    每一行的元素,  (用逗号分开)

    每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数

    将上述题目的各个结果转换成图形界面显示。

    3、结对开发要求: 

        两人结对完成编程任务。

        一人主要负责程序分析,代码编程。

        一人负责代码复审和代码测试计划。

       发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。   

    二、设计思路

    使用枚举法,遍历所有数据((x,y)代表第x行第y列的数),从(1,1)列开始,到(1,2)时(1,1)+(1,2);到(2,1)时(1,1)+(2,1);到(2,2)时(1,1)+(1,2)+(2,1)+(2,2)……以此类推,计算出这样组成的所有子数组的和,求出其中的最大值及其对应的子数组。数组随机产生,一定范围内可改变行列数。不过写入文件并读取未实现。

    三、程序代码

     1 #include<iostream.h>
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<time.h>
     5 #define N 3   //行数
     6 #define M 5   //列数
     7 void qiuhe(int a[N][M],int &he,int i,int j,int k,int l) //求两个顶点数所确定的矩阵之和,[i,j]为第一个数的下标,[k,l]为第二个数的下标
     8 {
     9     int c,b;
    10     he=0;
    11     for(c=i;c<=k;c++)
    12     {
    13         for(b=j;b<=l;b++)
    14         {
    15             he=he+a[c][b];
    16         }
    17     }
    18 }
    19 void display(int a[N][M],int i,int j,int k,int l)  //输出两个顶点数所确定的矩阵,[i,j]为第一个数的下标,[k,l]为第二个数的下标
    20 {
    21     int b,c;
    22     for(c=i;c<=k;c++)
    23     {
    24         for(b=j;b<=l;b++)
    25         {
    26             cout<<a[c][b]<<" ";
    27         }
    28         cout<<endl;
    29     }
    30 }
    31  void main()
    32  {
    33      int a[N][M];
    34      srand((unsigned)time(NULL));
    35      int i,j,k,l,hang1=0,hang2=0,lie1=0,lie2=0,max=a[0][0],he=0;
    36      for(i=0;i<N;i++)         //对二维数组中的数随机生成
    37      {
    38          for(j=0;j<M;j++)
    39          {
    40              a[i][j]=rand()%20-10;         
    41          }
    42      }
    43      for(i=0;i<N;i++)
    44      {
    45          for(j=0;j<M;j++)           //前两个循环遍历第一个顶点数
    46          {
    47              for(k=i;k<N;k++)
    48              {
    49                  for(l=j;l<M;l++)    //后两个循环遍历第二个顶点数
    50                  {
    51                      qiuhe(a,he,i,j,k,l);
    52                      if(he>max)
    53                      {
    54                          max=he;
    55                          hang1=i;
    56                          hang2=k;
    57                          lie1=j;
    58                          lie2=l;
    59                      }
    60                  }
    61              }
    62          }
    63      }
    64      cout<<"原数组:"<<endl;
    65      display(a,0,0,N-1,M-1);
    66      cout<<"最大子数组(两个顶点坐标("<<hang1<<","<<lie1<<""<<""<<hang2<<","<<lie2<<"))"<<endl;
    67      display(a,hang1,lie1,hang2,lie2);
    68      cout<<"和为:"<<max<<endl;
    69  }

    截图:

    四、测试

    将代码随机产生数组内容部分去掉,改为固定数组,通过修改其中数据进行测试。

    1.测试数据

    0,0,0,0,0

    0,0,0,0,0

    0,0,0,0,0

    2. 测试数据

    1,2,3,4,5

    6,7,8,9,10

    11,12,13,14,15

    3.测试数据

    -1,-2,-3,-4,-5

    -6,-7,-8,-9,-10

    -11,-12,-13,-14,-15

    五、心得体会

    这次关键问题在于对简单算法的思考。我们开始想到了遍历的方法,即把每种可能性都计算出来再找最大,但是这种方法实现起来势必耗费时间,尤其在数据量加大的时候。我们一时间陷入僵局,暂停了一两天。随后我们从网上搜索了一些方法,又交流了看法,觉得所能想到的简便的算法都有不足之处,最终还是采用遍历的方法,但数组存在txt文件中未实现。他负责编写完程序,然后我复审,最后又一起讨论修改。我改变数据进行了测试。

    这次难度提升,对合作也有了进一步的考验。过程中出现过几次分歧,比第一次合作要大些,不过也是互相阐述清楚后综合,小组正在逐步默契。

    结组成员照片:

  • 相关阅读:
    yarn/npm 设置镜像地址
    vmware 安装的虚拟机没有网络
    idea + spring-boot 开发时热更新(hotreload)
    @ConfigurationProperties(prefix = "server-options") 抛出 SpringBoot Configuration Annotation Processor not configured 错误
    使用 @ConfigurationProperties 注解 提示 "Spring Boot Configuration Annotation Processor not found in classpath"
    idea 中 spring-boot 项目使用 lombok 编译报错找不到 log
    install docker
    Install Ubuntu on Windows Subsystem for Linux
    解决 js aysnc await try-catch 地狱
    spring-boot rest controller 使用枚举作为参数,重写反序列化实现任意值转枚举类型
  • 原文地址:https://www.cnblogs.com/dr73/p/4364263.html
Copyright © 2020-2023  润新知