计算与软件工程 作业三

作业要求 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454
课程目标 了解熟悉软件开发过程中的每一个步骤,为以后的学习工作打下坚实的基础;
学习科学的测试方法,为以后写出更完美的代码做准备;
学会需求分析说明书和规格说明书的书写。
实现目标的方面 用C++编写用类/函数来实现数组中最大子数组的和,并将所写代码进行单元测试,为代码的编写与综合测试提供了经验
其他参考文献 https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html
https://www.cnblogs.com/SivilTaram/p/software_pretraining_cpp.html
https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
作业正文 https:////www.cnblogs.com/youmine/p/12451670.html
码云链接:https://gitee.com/yang_li_na/test

单元测试

数组中最大子数组的和

(```

 #include<iostream>
 #include<cstdlib>
 using namespace std;
 bool g_InvalidInput = false;
 int getMaxSum(int *a, int len, int start, int end)
 {
 if (a == NULL || len <= 0)
 {
    g_InvalidInput = true;
    return 0;
 }  
 g_InvalidInput = 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 getstart(int *a, int len, int start, int end)
{
if (a == NULL || len <= 0)
{
    g_InvalidInput = true;
    return 0;
}  
g_InvalidInput = 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 getend(int *a, int len, int start, int end)
{
if (a == NULL || len <= 0)
{
    g_InvalidInput = true;
    return 0;
}  
g_InvalidInput = 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 smax,start,send;
int a[]={-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61};
smax=getMaxSum(a,17,0,16);
cout<<"最大的子数组和为:"<<smax<<endl;
start=getstart(a,17,0,16);
cout<<"最大的子数组开始下标为:"<<start<<endl;
send=getend(a,17,0,16);
cout<<"最大的子数组结束下标为:"<<send<<endl;
system("pause");
return 0;
 }
![运行结果](https://images.cnblogs.com/cnblogs_com/youmine/1659514/t_200309132604%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.PNG)

### **设计单元测试,运行单元测试**
(```

     #include "stdafx.h"
     #include "CppUnitTest.h"
     #include"array.cpp"

     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,getMaxSum(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,getstart(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,getend(a,17,0,16));
		}
	};
     }
```)

![创建单元测试](https://images.cnblogs.com/cnblogs_com/youmine/1659514/t_200309132630%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%951.PNG)
![测试代码](https://images.cnblogs.com/cnblogs_com/youmine/1659514/t_200309132618%E6%B5%8B%E8%AF%95cpp.PNG)
![测试成功](https://images.cnblogs.com/cnblogs_com/youmine/1659514/o_200309132643%E8%BF%90%E8%A1%8C%E6%88%90%E5%8A%9F.PNG)

#博客园作业
学习计算机相关知识也有两年了,所以将所学的语言进行汇总总结:

语言类别|技能评价
-------|--------
MS Office|掌握还是初级,生活中简单的操作没有问题。但是二级考试时,较细的知识点没有掌握,尤其是Excel部分
C++|简单的一些程序代码,较多是有公式的一类,如:求正方形或长方形的面积等
Java|对于循环类的程序代码处理比C++要好一些,并且通过了Java二级考试
matlab|对于一些简单的运算程序可以编写出来,常常在数学建模中根据模型计算出结果;也可以在老师讲出部分代码的基础上再根据公式进行修改得出。但是对于用matlab画图是比较困难的
Asp.net(C#)|了解比较初级,对于表面操作比较好,比如链接数据库,做出登录,注册页面等等。但是如果要通过代码实现一些操作时比较困难,比如用三层架构链接数据库等

对于现在所学的语言技能,都处于半懵半懂的状态,掌握不是很好。
除了IT行业,现在所学的软件对其他职业来说比较少用,但是在平常工作中matlab可以帮忙计算画图等等,C++或者Java可以编出简单的程序,做出动画等等与众不同,类似于之前做的四则运算的题目,减少了不少的找题目以及计算出结果的工作量……我现在所学的语言技能能在我的工作中减轻我的工作量,也提高了效率。
写出程序代码并实现,且光靠一个人的力量是不够的,团队力量比较重要,在之前的学习中,与个人单独实现程序相比,和同学合作完成程序代码的效率更高,而且集思广益代码更丰富更全能,从中我明白合作的力量,与同事、同学的合作将事倍功半。
为了工作时能够更出色,所以在之后的学习中,我要将基础的语言掌握,并且跟着老师的指导,提高自己编写代码的能力,可以将语言运用到中等程度。

#预习
###两人合作
*代码规范与代码复审*
·“代码规范”可以分成两个部分。
(1)代码风格规范。主要是文字上的规定。
(2)代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面。
1.1 代码风格的原则是:简明,易读,无二义性。

代码风格|具体要求
-------|-------
缩进|4个空格,在VS2005和其他的一些编辑工具中都可以定义Tab键扩展成为几个空格键。不用 Tab键的理由是Tab键在不同的情况下会显示不同的长度。
行宽|行宽必须限制,但是以前有些文档规定的80字符行宽太小了(以前的计算机/打字机显示行宽为80字符),现在时代不同了,可为100字符。
括号|在复杂的条件表达式中,用括号清楚地表示逻辑优先级。
断行与空白的{ }行|格式A:if (condition)<br>DoSomething(); <br>else<br>DoSomethingElse();<br>格式B:if (condition)<br>DoSomething(); <br>else <br>DoSomethingElse();<br>格式C:if ( condition) {<br>DoSomething(); <br>} else {<br>DoSomethingElse();<br>}<br>格式D:if ( condition) <br>{<br>DoSomething(); <br>}<br>else <br>{<br>DoSomethingElse();<br>}
分行|不要把多行语句放在一行上。<br>a = 1; b = 2;           // bogus<br>if (fFoo) Bar();       // bogus<br>更严格地说,不要把不同的变量定义在一行上。<br>Foo foo1, foo2;         // bogus
命名|命名的目的是让程序员一眼就能看出变量的类型,int、byte、char、bool
下划线问题|下划线用来分隔变量名字中的作用域标注和变量的语义,如:一个类型的成员变量通常用m_来表示。<br>大小写问题|Pascal——所有单词的第一个字母都大写;<br>Camel——第一个单词全部小写,随后单词随Pascal格式,这种方式也叫lowerCamel。<br>一个通用的做法是:所有的类型/类/函数名都用Pascal形式,所有的变量都用Camel形式。<br>类/类型/变量:名词或组合名词,如Member、ProductInfo等。<br>函数则用动词或动宾组合词来表示,如get/set; RenderPage()。
注释|复杂的注释应该放在函数头,很多函数头的注释都是解释参数的类型等的,注释(包括所有源代码)应只用ASCII字符,不要用中文或其他特殊字符,它们会极大地影响程序的可移植性。

1.2 代码设计规范

代码设计|具体要求
-------|--------
函数|现代程序设计语言中的绝大部分功能,都在程序的函数(Function, Method)中实现,关于函数最重要的原则是:只做一件事,但是要做好。
goto|函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。
错误处理|1、参数处理:在DeBug版本中,所有的参数都要验证其正确性。在正式版本中,从外部(用户或别的模块)传递过来的参数要验证其正确性。<br>2、断言:Assert (p != NULL)
如何处理C++中的类|1.类<br>2.Class vs. Struct<br>3.公共/保护/私有成员Public、Private和Protected<br>4.数据成员<br>5.虚函数Virtual Functions<br>6.构造函数Constructors<br>7.析构函数<br>8.New和Delete<br>9.运算符(Operators)<br>10.异常(Exceptions)<br>11.类型继承(Class Inheritance)

·代码复审
定义:看代码是否在“代码规范”的框架内正确地解决了问题。

名称|形式|目的
---|---|---
自我复审|自己 vs. 自己|用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处
同伴复审|复审者 vs. 开发者|简便易行
团队复审|团队 vs. 开发者|有比较严格的规定和流程,用于关键的代码,以及复审后不再更新的代码。<br>覆盖率高——有很多双眼睛盯着程序。但是有可能效率不高(全体人员都要到会)

代码复审的核查表:
1.概要部分
2.设计规范部分
3.代码规范部分
4.具体代码部分
5.效能
6.可读性
7.可测试性
posted @ 2020-03-09 21:24  易young  阅读(213)  评论(8编辑  收藏  举报