• 计算与软件工程 作业三


    作业要求 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.可测试性
  • 相关阅读:
    The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
    HDU 5299 Circles Game
    UVALive
    算法笔记--匈牙利算法
    算法笔记--Splay && Link-Cut-Tree && fhq _treap
    P2685 [TJOI2012]桥
    2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
    ACM-ICPC2018南京赛区 Mediocre String Problem
    Project Euler 345: Matrix Sum
    算法笔记--manacher算法
  • 原文地址:https://www.cnblogs.com/youmine/p/12451670.html
Copyright © 2020-2023  润新知