计算与软件工程 作业三
这个作业要求在哪里 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
我在这个课程的目标是 | 提高编程能力,掌握单元测试 |
此作业在那个具体方面帮我实现目标 | 要求参考《构建之法》设计单元测试,运行单元测试 |
其他参考文献 | https://blog.csdn.net/WKalpa/article/details/88883314 https://www.cnblogs.com/njzy123456/p/9755642.html https://www.jianshu.com/p/388b02c126fd |
作业正文 | https://www.cnblogs.com/tang-yuan-yuan/p/12433514.html |
单元测试
数组中最大子数组的和。
•用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
从文本文件中读输入的数据,熟悉文件操作, 文件有两种数据
第一个数字:这次测试中有多少个数据, 数字后面是冒号。
后续数字: 每个数据的值,用逗号隔开
比如
文件内容:
17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
输出
sum = 71
程序运行截图
设计单元测试,运行单元测试
•开始:所有单元测试都失败
•改进程序,加入正确的逻辑,看到有单元测试通过,并且看到代码覆盖率的增加
•重复, 直到所有单元测试都通过,代码覆盖率达到满意的结果。
单元测试的代码没有编译成功,查了很多资料还是没有解决
码云链接:https://gitee.com/tang_yuan-yuan/git-tang/tree/master/作业二
博客作业
过去两年半我们学习许多门课,大一开始学习计算机应用软件(MS Office)(后来考了二级证书)和C++语言编程。大二学习了Java语言,会做一些简单的图形界面,还学习了数据结构课程,了解了计算机数据的基本知识。大三学习了数据库,操作系统,ASP,MATLAB科学计算等课程会做出简单的页面,但深觉我们学的都是皮毛,经验仍很浅薄。
今后学习中还是希望能熟练掌握C++及Java。
预习
代码规范和代码复审
1.我们讲的“代码规范”可以分成两个部分。
(1)代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。
(2)代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C/C++/Java/C#),但是也有通用的原则,这里主要讨论通用的原则。
2.复审的目的在于:
(1)找出代码的错误。如:
a. 编码错误,比如一些能碰巧骗过编译器的错误。
b. 不符合项目组的代码规范的地方。
(2)发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。
(3)发现算法错误,比如使用的算法不够优化。
(4)发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。
(5)发现可能改进的地方。
(6)教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。
结对编程
1.结对编程中有两个角色:
(a)驾驶员(Driver)是控制键盘输入的人。
(b)领航员(Navigator)起到领航、提醒的作用。
2.结对编程有如下的好处:
(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
3.如何结对编程?
(1)驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
(2)领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖程度;是否需要和如何重构;帮助驾驶员解决具体的技术问题。
(3)驾驶员和领航员不断轮换角色,不宜连续工作超过一小时。领航员要控制时间。
(4)主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。没有“我的代码”、“你的代码”或“她的代码”,只有“我们的代码”。
(5)只有水平上的差距,没有级别上的差异。尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。
不适合结对编程的情况——
代码
maxsubarray.cpp
#include <iostream>
#include <cstdio>
using namespace std;
//枚举法,分别计算子数组和,比较大小
int maxsum(int a[], int n, int &start, int &end)
{
int max = 0;
start = 0;
end = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
// [i,j]数组
int sum = 0;
for (int t = i; t <= j; t++) {
sum += a[t];
}
if (sum > max) {
max = sum;
start = i;
end = j;
}
}
}
return max;
}
int main()
{
int max = 0;
int start = 0;
int end = 0;
int n, i = 0;
cout << "请输入数组个数:";
cin >> n;
cout << "请输入数组:";
int a[100000] = { 0 };
for (i = 0; i < n; i++)
{
cin >> a[i];
}
max = maxsum(a, n, start, end);
cout << "最大子数组的和为:" << max << endl;
cout << "起始下标为:" << start << endl;
cout << "结束下标为:" << end << endl;
system("pause");
}
UnitTest1.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include "F:/大学/VS2017程序/maxsubarray/maxsubarray/maxsubarray.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
int a[] = { -1,2,-1,4 };
int start = 0;
int end = 0;
Assert::AreEqual(5,1,3, maxsum(a, 17, start, end));
}
};
}