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

    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. 具体要求

    • 请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例
    • 请利用自动测试工具对程序进行测试
    • 请将程序运行结果和自动测试分析结果截图附到博客中

    本题是acm的入门题,解法有很多,可以暴力,动态规划,采用不同的解法会带来不同的时间和空间的代价,这里列举一个动态规划的算法,时间复杂度为O(n),空间复杂度为O(1)。算法思想方面,这题属于一个思维题。将子段分成两段考虑就可以解决。如果左端的子段和是负的,对于最终的子段和的左段一定不会包含这段,因为右段和是一个或一段正数,会比左边的这段大,就会抛弃这段负数的和。在遍历数组时候每次记录一次最大的子段和,一旦在某个位置子段和为负,就会将子段重新开始。本题的测试平台可以选择OJ,51nod就挂了一个一模一样的题,但是那个题要考虑数据范围。最后的子段和有可能爆int,所以在选择数据类型的时候,用c++应该使用long long。用java 选择long,但是不能选择int。

    程序流程图如下图

    对于程序,采用判定/条件覆盖的方法测试

    程序中一共有三处判定

    maxn < sum或maxn >= sum
    sum< 0或 sum >=0
    i >= arr.length或i < arr.length
    

    设置样例{-2,2},可以同时在多次循环中达到6个条件各有一种可能性。而且这个样例是最好的覆盖样例,可以覆盖所有的路径,将每个判定中每一个条件true和false都执行一次,将每一个判定的true和false都执行一次。即小又全,而且没有重复的检验。就可以达到判定/条件覆盖效果,为了程序的健壮性,设置了多组样例 {-2, 11,-4, 13, -5, -2} {1, 7, -10} {1, -2, -5, -10} {-5,-2, -10} {-1,-2, 2} {-2, 2} 这里列举了6个样例,而且程序已经通过了OJ平台的大样例的测试。如果不会使用OJ平台,可以自己用O(n2)的算法写个对数器比对一下程序的正确性。

    代码测试结果如下图

    代码托管地址

  • 相关阅读:
    centos7配置静态IP地址
    Linux和Windows的区别
    Linux就该这么学——文件的特殊权限
    Linux就该这么学——文件权限与归属
    Linux就该这么学——用户身份与能力
    Linux就该这么学——计划任务服务程序
    Linux就该这么学——流程控制语句
    Linux就该这么学——编写SHELL脚本
    Linux就该这么学——初识vim编辑器
    Linux就该这么学——重要的环境变量
  • 原文地址:https://www.cnblogs.com/cheng0000jing/p/10738562.html
Copyright © 2011-2022 走看看