计算软件工程 作业三
这个作业要求在哪里 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
我在这个课程的目标是 | 熟悉软件开发过程的步骤;实现简单的软件开发,对软件进行测试、维护和管理。 |
此作业在哪个具体方面帮我实现目标 | 本次作业是运用c++编写一个简单的求数组最大值,并进行测试。软件工程与单纯编写代码是不同的。 |
其他参考文献 | 参见 《构建之法》第二章单元测试的内容 以及 https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html |
作业正文 | 码云 |
单元测试
题目:数组中最大子数组的和。
具体要求:
用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
从文本文件中读输入的数据,熟悉文件操作, 文件有两种数据
第一个数字:这次测试中有多少个数据, 数字后面是冒号。
后续数字: 每个数据的值,用逗号隔开
比如
文件内容:
17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
输出
sum = 71
实现这个类 (MSA)
可以用 C++, Java, C#,Python class 等
类开始是空的,返回都是简单的数值,例如 0.
测试包括测试文件读入与计算(测试过程通过程序新建一个文件,内容可以为上述数字,测试完后得删除文件)
设计单元测试,运行单元测试
求最大子数组代码如下
#include<iostream>
#include<cstdlib>
using namespace std;
bool m = false;
int MaxSum(int *a, int len, int start, int end){
if (a == NULL || len <= 0){
m = true;
return 0;
}
m = false;
start = 0;
end = 0;
if (1 == len)return a[0];
int curSum = a[0]; //当前子数组和
int maxSum = curSum; //子数组最大和
for (int i = 1; i < len; i++){
if (curSum > 0)curSum += a[i];
else if(a[i] > curSum){ //确定子数组起始位置
start = i;
curSum = a[i];} //即使数组全为负,也能得到最大值
if (curSum > maxSum){
maxSum = curSum;
end = i;
}
}
return maxSum;
}
int Start(int *a, int len, int start, int end){
if (a == NULL || len <= 0){
m = true;
return 0;
}
m = false;
start = 0;
end = 0;
if (1 == len)return a[0];
int curSum = a[0]; //当前子数组和
int maxSum = curSum; //子数组最大和
for (int i = 1; i < len; i++){
if (curSum > 0)curSum += a[i];
else if(a[i] > curSum){ //确定子数组起始位置
start = i;
curSum = a[i]; //即使数组全为负,也能得到最大值
}
if (curSum > maxSum){
maxSum = curSum;
end = i;
}
}
return start;
}
int End(int *a, int len, int start, int end){
if (a == NULL || len <= 0){
m = true;
return 0;
}
m = false;
start = 0;
end = 0;
if (1 == len)return a[0];
int curSum = a[0]; //当前子数组和
int maxSum = curSum; //子数组最大和
for (int i = 1; i < len; i++){
if (curSum > 0) curSum += a[i];
else if (a[i] > curSum){ //确定子数组起始位置
start = i;
curSum = a[i]; //即使数组全为负,也能得到最大值
}
if (curSum > maxSum){
maxSum = curSum;
end = i;
}
}
return end;
}
int main(){
int maxsum,start,end;
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
maxsum=MaxSum(a,17,0,16);
cout<<"最大的子数组和为:"<<maxsum<<endl;
start=Start(a,17,0,16);
cout<<"最大的子数组开始下标为:"<<start<<endl;
end=End(a,17,0,16);
cout<<"最大的子数组结束下标为:"<<end<<endl;
system("pause");
return 0;
}
单元测试:对软件设计的最小单元进行正确性检测的测试,将可能存在的错误在最小范围内发现解决。
单元测试目的:发现模块内部逻辑,语法,算法,功能等错误。
单元测试代码如下:
#include "1.1.h"
#include "pch.h"
#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
int a[] = { -32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61 };
Assert::AreEqual(111, MaxSum(a, 17, 0, 16));
}
TEST_METHOD(TestMethod2)
{
// TODO: 在此输入测试代码
int a[] = { -32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61 };
Assert::AreEqual(12, Start(a, 17, 0, 16));
}
TEST_METHOD(TestMethod3)
{
// TODO: 在此输入测试代码
int a[] = { -32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61 };
Assert::AreEqual(16, End(a, 17, 0, 16));
}
};
}
博客作业
前两年在老师的带领下学习了C++,Java,asp.net(c#),MATLAB,MS Office,数据库mysql。大一学习了基本的MS Office的知识,后来在考计算机二级时又再次加深额巩固基本的Excel和Word等的操作以及一些基础的计算机方面的综合知识。学习的第一门语言是C++,能够编写一些小型的简单程序,大二的时候基于C++学习了数据结构,代码的结构和认知仅有加深。第二门语言的学习是Java,了解到Java的一些简单语法,定义等,大致了解到其与C++在内存分配、函数、运行方式等方面不同。数值分析、数学建模等课程使用到MATLAB,用于计算数学,。关于数据库能构建表格并且简单与asp.net前端操作相结合。
目前所掌握的语言中,掌握的相对熟悉一点的是C++,目前最大的编写行数是400行,其他的编写熟练度不是很高,代码相对简单。目前只是能编写一些C++的代码,但离一个完整的软件等差距较大,所需了解、掌握、操作练习的还有很多,如果以现在的能力如果加入计算机行业,将会被饿死。接下来一年将在老师的带领下,继续加强C++的大规模编写并与团队合作,以及本专业的特色:MATLAB的学习。
预习
两人合作:
. 代码规范
. 代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。
.代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C/C++/Java/C#),但是也有通用的原则,这里主要讨论通用的原则。
. 代码审复
名 称 | 形 式 | 目 的 |
---|---|---|
自我复审 | 自己 vs. 自己 | 用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处 |
同伴复审 | 复审者 vs. 开发者 | 简便易行 |
团队复审 | 团队 vs. 开发者 | 有比较严格的规定和流程,用于关键的代码,以及复审后不再更新的代码。 |