软件工程 第三次作业
作业三
作业题目——单元测试
- 数组中最大子数组的和。
用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
从文本文件中读输入的数据,熟悉文件操作, 文件有两种数据
第一个数字:这次测试中有多少个数据, 数字后面是冒号。
后续数字: 每个数据的值,用逗号隔开
比如
文件内容:
17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
输出
sum = 71
设计单元测试,运行单元测试
- 开始:所有单元测试都失败
- 改进程序,加入正确的逻辑,,看到有单元测试通过,并且看到代码覆盖率的增加
- 重复, 直到所有单元测试都通过,代码覆盖率达到满意的结果。
解决思想
求一组数组的最大子数组有暴力求解、分治算法还有一种线性算法。暴力求解的时间复杂度为O(n^2),分治算法的时间复杂度为O(nlog2n),而线性算法的时间复杂度为O(n)。但是暴力求解的代码最容易理解,也易于写出运行成功。
附录代码
- 暴力求解
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<cstdlib>
using namespace std;
int maxsubset(int *a,int len){
int summax=INT_MIN;
int i,j,k;
for(i=0;i<len;i++)
for(j=i;j<len;j++){
int temp=0;
for(k=i;k<=j;k++)
temp+=a[k];
if(temp > summax) summax=temp;
}
return summax;
}
int main(){
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
cout<<"the maxsubset:"<<maxsubset(a,16)<<endl;
system("pause");
return 0;
}
运行结果
码云地址:
https://gitee.com/jiang_zi_yi/codes/new
博客作业
回顾我在信息与计算科学专业两年多以来,先从计算机基础开始然后到C++,数据结构,java,操作系统和MySql数据库等,逐渐深入对程序语言的学习。但就对于我个人而言,我的能力是远远不足的,对于较长的,要求比较多,功能比较全面的程序没有办法独立完成。不能把自己的思想完全用程序语言表达出来,程序常常出现逻辑错误。所以在今后的学习过程中,要多动手,多总结,对于比较好的,典型的程序结构进行积累,丰富自己的编程知识,提高自己的能力。多尝试,多运行,有问题及时反馈,及时解决,充分利用好身边的网络书籍资源。