一.题目:求一个二维整数数组中最大子数组的和
二.设计思想:
定义一个五行五列的二维数组,可以有正有负
通过两个子函数实现,一个求一维最大子数组和,一个求相应列下标二维元素相加和并作比较(一.)通过上次的一位数组求最大值,可以先求出每一行最大连续子数组的和(二.)记下上下边界元素的下标(三.)每一行都有一个最大子数组,将它对应的相同列下标的元素相加,得到i个子数组和存到一个一维数组b中(四.)通过循环比较数组b中元素的大小,找到最大值sum过程:
我和郭瑾慧同学交流了课上各自的想法,通过讨论最后确定这个设计思想,但是我们的编程基础都不好,关于一些算法的实现是边学边写的。
通过这次的结对项目,关于一个目的的实现要先分成小的目的,最后再整合到一起
程序:
#include<stdio.h>
#define M 5#define N 5int MAXarr(int m,int n, int array[M][N]);//整合到一维数组int maxx(int *arr, int len) ;//求最大和int main(){ int arr[M][N] = { { -15, -21, 5, -12, 5 }, { -7, 21, 20, 30, 12 }, { 21, 0, -1, 13, 45 }, { 12, 10, 20, -10, -18 }, {12, 45, -9, 21, 6} }; printf( "最大子数组和:"); printf("%d", MAXarr(M, N, arr) ); return 0;}int maxx(int *a, int len){ int m[100]={0},f=0,x=0; int Y; m[x]=0; while(f<100) { if(a[f]>0) {m[x]=a[f]+m[x];
f=f+1; } else {x=x+1;
m[x]=0; if(a[++f]>0) { m[x]=a[f]+m[x]; } f++; } } Y=m[0]; for(int r=0;r<f;r++) { if(m[r]>Y) { Y=m[r]; } r++; } return Y;}
int MAXarr(int m,int n, int array[M][N])
{ int i, j, h, max, sum=-100000 ; int b[100]; for (i = 0; i < n; i++) { for (h = i; h < n; h++) { for (j = 0; j<n; j++) { b[j] += array[h][j]; } max = maxx(b, j); if (max>sum) sum = max; } } return sum;}最后结果是0
时间记录日志
学生:黎雯 郭瑾慧 日期:2018/10/21
教师:王建民 课程:软件工程
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 | C | U |
10/18 | 9:50 | 10:35 |
| 45 | 上课 |
|
|
|
| 10:40 | 11:25 |
| 45 | 上课 |
|
|
|
| 20:00 | 20:50 |
| 50 | 作业 | 讨论设计思路 |
|
|
10/20 | 19:20 | 21:00 | 5 | 95 | 作业 | 初步编写程序 |
|
|
10/21 | 08:40 | 14:00 | 40 | 270 | 作业 | 编程序求二维整型数组最大连续子数组和
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
项目缺陷总结
日期 | 姓名 | 黎雯 郭瑾慧 | 修复时间 |
|
|
|
|
|
|
描述 | |||||||||
10/20 | 不知道如何压缩子数组 | 70 |
|
|
|
|
|
| |
10/21 | 关于列下标相同的元素如何相加 | 110 |
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
作业号 | 日期 | 过程 | 估计数据 | 实际数据 | 累计数据 | ||||||||
| 时间 | 单元 | 时间 | 单元 | 时间 | 单元 | 平均值 | 最大值 | 最小值 | ||||
1 | 10/18 | 设计思路 | 30 |
| 50 |
| 30 | 1 | 30 | 30 | 30 | ||
| 描述:设计思路 | ||||||||||||
2 | 10/20 | 编写程序 | 100 |
| 95 |
|
|
|
|
|
| ||
| 描述:编写程序求二维整数组最大连续子数组和 | ||||||||||||
3 | 10/21 | 编写程序 | 240 |
| 270 |
|
|
|
|
|
| ||
| 描述:编写程序求二维整数组最大连续子数组和 |