软工3

软工第三次作业

1.题目选择

这次作业一共列出两道题可供选择,我选择了第一道题来作为我的本次作业。
题目(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。
-- 引用自《百度百科

2.完成题目

  • 写出可运行的完整代码之后提交至GitHub
    • 代码如下:
include<iostream>
using namespace std;
int MaxSum(int n,int a[])  
{  
    int sum = 0;  
    int b;  
    for(int i = 1; i <= n; i++)  
    {  
        if(b > 0)  
            b += a[i];  
        else  
            b = a[i];  
        if(b > sum)  
            sum = b;  
    }  
    return sum;  
}  
int main()  
{  
    int n,a[100],m,maxsum;  
    cout<<"请输入整数序列的元素个数n:"<<endl;  
    cin>>n;  
    cout<<"请输入序列中各元素的值a[i](一共"<<n<<"个)"<<endl;  
    for(m=0;m<n;m++)  
        cin>>a[m];  
    int b[100];  
    for(m=0;m<n;m++)  
        b[m+1]=a[m];  
    maxsum=MaxSum(n,b);  
    cout<<"整数序列的最大子段和是:"<<maxsum<<endl;  
    system("pause");  
    }
  • 运行结果如图:

  • 提交至Github地址链接

  • 白盒测试中几种覆盖的区别如下:

    • 比较常用的逻辑覆盖测试方法有:语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖。
        1、语句覆盖(Statement Coverage)
        语句覆盖的含义是,在测试时,运行被测程序后,程序中被执行到的可执行语句的比率。
        语句覆盖=(至少被执行一次的语句数量)/可执行的语句总数。
        *语句覆盖是最弱的一种覆盖方式。
        2、判定覆盖(Decision Coverage)
        判定覆盖也叫分支覆盖(Branch Coverage),含义是:在测试时,运行被测程序后,程序中所有判断语句的取真分支和取假分支被执行到的比率。
        判定覆盖=(判定结果被评价的次数)/判定结果的总数。

  3、条件覆盖(Condition Coverage)
  条件覆盖的含义是:在测试时,运行被测程序后,所有判断语句中每个条件的可能取值(真值和假值)出现过的比率。
  条件覆盖=(条件操作数值至少被评价一次的数量)/(条件操作数值得总数)

  4、判定条件覆盖(Decision Condition Coverage)
  判定条件覆盖也叫分支条件覆盖(Branch Condition Coverage)它的含义是:在测试时,运行被测程序后,所有判断语句中每个条件的所有可能值(为真为假)和每个判断本身的判定结果(为真为假)出现的比率。
  判定条件覆盖=(条件操作数值或判定结果至少被评价一次的数量)/(条件操作数值总数+判定结果总数)
  *判定条件覆盖率实际上就是判定覆盖率和条件覆盖率的组合。

  5、条件组合覆盖(Condition combination coverage)
  条件组合覆盖的含义是,在测试时,运行被测程序后,所有语句中子条件所有可能的取值结果组合出现过的比率。
  条件组合覆盖=(至少被执行到一次的条件组合)/总的可能的条件组合数。
  *条件组合覆盖是除路径覆盖以外,最强的一种覆盖方式。

  • 正确画流程图的步骤:
    为便于识别,绘制流程图的习惯做法是:
    圆角矩形表示“开始”与“结束”
    矩形表示行动方案、普通工作环节用
    菱形表示问题判断或判定(审核/审批/评审)环节
    用平行四边形表示输入输出
    箭头代表工作流方向

  • 本次我选择的是判定条件覆盖,框图如下

  • 进行单元测试
    在linux下使用gtest单元测试,测试代码以及结果都已图片展示:

#include"test.h"
#include<iostream>
int MaxSum(int n,int a[])  
{  
    int sum = 0;  
    int b = 0;  
    for(int i = 0; i < n; i++)  
    {  
        if(b > 0)  
            b += a[i];  
        else  
            b = a[i];  
        if(b > sum)  
            sum = b;  
    }  
    return sum;  
} 

#ifndef _TEST_H

#define _TEST_H

int MaxSum(int n,int a[]);

#endi

#include"test.h"
#include"gtest/gtest.h"
TEST(c,d){
    int a[6]={-2,11,-4,13,-5,-2};
    EXPECT_EQ(20,MaxSum(6,a));

}
TEST(t,d){
    int b[6]={-2,-1,-3,-6};
    EXPECT_EQ(0,MaxSum(4,b));
}



posted @ 2018-03-26 16:53  liililiu  阅读(298)  评论(1编辑  收藏  举报