zoukankan      html  css  js  c++  java
  • 第三次软件工程作业——两题

    题目一

    一、Github网址:

    https://github.com/Rafael-Gu/The-3rd-Homework/tree/master/Q1

    老师!!!老师!!!这是我问题一的作业!!!第二问我也做了,也是同一个网址。。。第一题是Q1的文件夹里面!!!


    二、问题描述

    题目(1):最大连续子数组和(最大子段和)
    问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
    -- 引用自《百度百科》


    三、流程图

    流程图如下:


    四、程序源代码

    程序源代码如下:

    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    
    int sum(int *a,int j)
    {
    	int last = 0, ans = 0, i = 0;
    	for (i = 1; i <= j; i++)
    	{
    		last = max(0, last) + a[i];
    		ans = max(ans, last);
    	}
    	return ans;
    }
    
    int main()
    {
    	return 0;
    }
    

    五、条件组合覆盖测试

    首先,程序中含有一个for循环,其中for的条件中有一个条件需要满足i=j此条件,其中for调用了一次max函数,而max函数的具体逻辑如下:

    由这两个流程图可知,此处有两个条件需要进行考虑,一个是for中的i<=j;另一个是max函数中的判定条件。


    六、单元测试代码:

    namespace 作业三
    {		
    	TEST_CLASS(UnitTest1)
    	{
    	public:
    		
    		TEST_METHOD(TestMethod1)
    		{
    			int a[] = { -1,-6,-3,-5,-1 };
    			Assert::AreEqual(sum(a, 5), 0);
    		}
    		TEST_METHOD(TestMethod2)
    		{
    			int *a = 0;
    			Assert::AreEqual(sum(a, 0), 0);
    		}
    		TEST_METHOD(TestMethod3)
    		{
    			int a[] = { -1,-6,-5,-3,-5,-2,6 };
    			Assert::AreEqual(sum(a, 7), 6);
    		}
    		TEST_METHOD(TestMethod4)
    		{
    			int a[] = { 0,-2,2,5,-9,0,7,5,13,-4,-6 };
    			Assert::AreEqual(sum(a, 11), 25);
    		}
    		TEST_METHOD(TestMethod5)
    		{
    			int a[] = { 1,-2,3,-4,5,-6,7,-8 };
    			Assert::AreEqual(sum(a, 8), 7);
    		}
    	};
    }
    

    此组数据,我采用了全为负数、正负数交替输入的几种类型,对程序进行单元测试,单元测试结果全部正确。


    老师!老师!这是我另外做的问题一!问题二我也做了!问题一真的比问题二难啊!

    这次作业学会了如何进行条件组合判定,以及强化了单元测试的操作

    题目二

    GitHub地址:
    https://github.com/Rafael-Gu/The-3rd-Homework

    一、题目要求

    题目(2):下表为某商场每日营业额与应收税率的对照表,请编写一小程序根据该商场每日营业额计算其实际应缴纳税费。

    营业额X (¥) 1000≤X<5000 5000 ≤X<10000 X≥10000
    税率 5% 8% 10%

    二、程序设计

    1、测试代码如下:

    namespace UnitTest1
    {		
    	TEST_CLASS(UnitTest1)
    	{
    	public:
    		
    		TEST_METHOD(TestMethod1)
    		{
    			float x = 5000.00f;
    			float i = 200.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			x = 1000.00f;
    			i = 00.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			x = 10000.00f;
    			i = 600.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			x = 2000.00f;
    			i = 50.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			x = 6000.00f;
    			i = 280.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			x = 12000.00f;
    			i = 800.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			
    		}
    
    		TEST_METHOD(TestMethod2)//侧重于测试异常情况
    		{
    			float x = NAN;
    			float i = 0.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    			x = INFINITY;
    			i = 0.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    		}
    
    		TEST_METHOD(TestMethod3)
    		{
    			float x = -1;
    			float i = 0.00f;
    			Assert::AreEqual(jisuan(x), i, 0.01f);
    		}
    
    	};
    }
    

    2、关于代码的思考

    关于本题,我一开始只是将题目中的要求按照想法编了出来,我先对x先进行1000,5000,10000的输入,因为这三个数是关于交税的分界点,所以对这三个数进行测试,检查结果是否有误。然后找同学(大佬)来帮忙,作为浮点数x可能存在异常输入(NAN,INF),结果发现测试结果有误,发现程序中没有对这两个数进行考虑,导致单元测试没有通过。此外,对浮点数x进行负数输入进行单元测试,因为,负数在<1000的考虑范围之内,所以单元测试并未出现异常。程序代码如下:

    #include <stdio.h>
    #include <cmath>
    
    float jisuan(float x)
    {
    	if (isnan(x))
    		return 0;
    	if (isinf(x))
    		return 0;
    	if (x < 1000)
    		return 0;
    	else if (x < 5000) 
    		return (x - 1000)*0.05;
    	else if (x < 10000)
    		return 200 + (x - 5000)*0.08;
    	else 
    		return 600 + (x - 10000)*0.1;
    }
    
    int main()
    {
    	float x;
    	scanf_s("%f", &x);
    	if (x < 1000)printf("0
    ");
    	else if (x < 5000) printf("%.2f
    ", (x - 1000)*0.05);
    	else if (x < 10000)printf("%.2f
    ", 200 + (x - 5000)*0.08);
    	else printf("%.2f
    ", 600 + (x - 10000)*0.1);
    		return 0;
    }
    

    3、流程图

    三、覆盖标准测试

    对于本次代码可知满足条件语句覆盖、判定覆盖、条件覆盖,其中,对于判定/条件覆盖,本代码中,每一个浮点数x都有一个对应的区间可带入到对应的函数中进行计算,得出最终的答案。条件组合覆盖满足条件,则是由边界点带入都有唯一一个函数带入得出答案。

    1、判定/条件覆盖测试

    x=NAN x=INF x<1000 1000≤x<5000 5000≤x<10000 ≥10000
    return 0 return 0 return 0 return (x - 1000)*0.05 return 200 + (x - 5000)*0.08 return 600 + (x - 10000)*0.1

    2、样例测试




    如上图可知,本次作业完成。

    通过本次作业,我更加熟悉了单元测试的使用,同时也让我知道了如何更好地去进行程序测试,同时也提醒我要对输入值的范围和形式要考虑的更加周全。

  • 相关阅读:
    让Android模拟器速度飞起来_Eclipse+BlueStacks调试Android应用【2012-10-30】
    开源镜像站-Android镜像
    字符编码的几篇文章
    [C/C++]_[Unicode转Utf8,Ansi转Unicode,Ansi文件转Utf8文件]
    MSVC下快速Unicode I/O
    edltplus使用正则表达式替换多余空行
    修改CMD的编码
    windows 安裝 gcc 編譯器
    CF369 C(递归 + 回溯)
    VIM支持系统剪切板
  • 原文地址:https://www.cnblogs.com/g12280809t/p/10742263.html
Copyright © 2011-2022 走看看