计算与软件工程作业三

问题 链接
作业要求 第三周作业
实现目标 能够设计单元测试并运行,提高对代码的测试能力
其他参考文献 (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)。

posted @ 2020-03-11 13:52  Meinhof  阅读(153)  评论(5编辑  收藏  举报