计算与软件工程作业三
问题 | 链接 |
---|---|
作业要求 | 第三周作业 |
实现目标 | 能够设计单元测试并运行,提高对代码的测试能力 |
其他参考文献 | (https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html)(https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html) |
gitee | 仓库 |
单元测试
数组中最大子数组的和。
用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
要想在 VS2017 里对 C++项目进行单元测试,首先要新建一个测试项目。右键单击解决方案,可以添加一个新建项目,在类型里选择【单元测试】,在项目创建成功后,为单元测试项目 UnitTest 增加对原项目的引用,以实现调用原项目函数接口的功能。
光设置引用还不够,接下来需要手动设置一下测试项目的附加依赖项。选中单元测试项目,右键点击选择【属性】,在打开的左侧菜单栏中选择 【配置属性】- 【链接器】-【输入】,在【附加依赖项】的下拉选择框中选择【<编辑...>】,将被测试项目产生的所有 obj 文件路径写到附加依赖项中,如下图所示:
加入“Array.h”头文件,并输入测试代码,就可以进行单元测试,在单元测试运行完毕后,VS的左侧会弹出一个测试结果窗口。绿色代表通过,红色代表失败。
代码
//Array.cpp
//计算数组中任何连续子数组的最大和,并打印最大子数组(求开始和结束下标)
//思路:
// 当数组有正有负时,i=0遍历数组,从大于0的那个元素开始,记录此时的下标为shart(最大子数组起始下标),从start开始遍历剩下的元素,若元素和num大于max的值则更新max,
// 且将此时的下标赋值给end(最大子数组终止下标),当num小于0则说明后面出现的(如果出现)最大子数组不可能包含这些元素,所以退出内层循环,继续外层循环,找下一个大于
// 0的数组元素,且外层循环的i变量此时变为temp+1,继续下面的循环。注意内层循环当temp>=length时,说明内层循环已经把所有数组元素都遍历结束,所以外层循环可以直接break。
#include <stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int getmax(int data[], int length)
{
int temp = 0, start = 0, end = 0, i = 0, num = 0, max = 0, flag = 0;
while (i < length)
{
if (data[i] > 0)
{
temp = i;
while (temp < length)
{
num += data[temp];
if (num < 0) //当num<0时退出这个循环
{
num = 0;
i = temp + 1;
break;
}
if (num > max) //不加=说明若存在多个最大子数组时取第一个,加上=说明取最后一个
{
start = i;
max = num;
end = temp;
}
temp++;
}
if (temp >= length) //当temp已经循环到数组最后一位,则结束整个外层循环
break;
}
else
{
i++;
flag++; //用来记录负数出现的次数
}
}
if (flag == length) //数组全为负数的情况
{
int max = data[0];
for (i = 1; i < length; i++)
{
if (data[i] > max)
{
max = data[i];
}
}
return max;
}
cout <<start<<" "<<end << " ";
cout << endl;
return max;
}
int main()
{
int data[] = { -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61 };
int length = sizeof(data) / sizeof(int);
cout << getmax(data, length) << endl;
return 0;
}
//Array.h
#pragma once
int getmax(int data[], int length);
//UnitTest2.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include"../Array/Array.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest2
{
TEST_CLASS(UnitTest2)
{
public:
TEST_METHOD(TestMethod1)
{
int data[] = { -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61 };
int length = sizeof(data) / sizeof(int);
getmax(data,length);
Assert::IsTrue(getmax(data, length));
}
};
}
git bash
博客作业
在进入大学之后,在大一先学习了MS Office基本操作以及C++的基础知识,对编程有了一定的了解;在大二学习了数据结构,对编程有了更进一步的了解,特别学习了数组、栈、队列、树、链表、散列表等知识,还学习了Java语言,比C++更容易理解些;在大三又继续使用MATLAB软件,与数学建模,数值分析息息相关,使用更为方便,可以用来解决一系列数学问题,同时还学习了数据库和操作系统,以及ASP.NET,了解到关于网站的设计,前台与后台的操作。
在之后的学习中,我还需要完善自己写编程的能力,能够自己独立写代码并解决其过程中遇到的问题。
预习
代码规范可以分成两个部分:
(1)代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。
(2)代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C/C++/Java/C#),但是也有通用的原则,这里主要讨论通用的原则
代码复审形式:
(1)自我复审:用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处。
(2)同伴复审:简便易行。
(3)团队复审:有比较严格的规定和流程,用于关键的代码,以及复审后不再更新的代码。覆盖率高——有很多双眼睛盯着程序。但是有可能效率不高(全体人员都要到会)
复审的目的在于:
(1)找出代码的错误。如:
a. 编码错误,比如一些能碰巧骗过编译器的错误。
b. 不符合项目组的代码规范的地方。
(2)发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。
(3)发现算法错误,比如使用的算法不够优化。
(4)发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。
(5)发现可能改进的地方。
(6)教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。
结对编程的好处:
(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。