zoukankan      html  css  js  c++  java
  • 计算与软件工程作业三

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

  • 相关阅读:
    QT常用技巧--程序延时
    python中zip()函数的用法
    numpy.random.choice(a, size = None, replace = True, p = None)用法
    Python keras.layers .ZeroPadding2D() 详解
    Socat 入门笔记
    echo命令的使用
    Type Error('keyword argument not understood: ', 'interpolation') 解决方案
    Pytorch 包下载
    双边滤波Matlab代码
    hihocoder 第170周 Word Construction (dfs+剪枝)
  • 原文地址:https://www.cnblogs.com/yzzzw/p/12462010.html
Copyright © 2011-2022 走看看