软件测试作业5:计算下列代码片段的 Halstead 复杂度的11项内容

作业5

1、 计算下列代码片段的 Halstead 复杂度的11项内容:

if (month < 3) {
  month = month + 12;
  year = year - 1;
}
return dayray((int)(day + (month + 1) * 26/10 + year 
  + year / 4 + 6 * (year/100) + year / 400) % 7);

答:

  • Halstead 复杂度根据程序源代码中语句行的操作符和操作数的
    数量计算程序复杂性。
    • 程序源代码中操作符和操作数的量越大,程序难度就越大。
    • 操作符统计范围通常包括语言保留字函数调用运算符,也可以包括有关的分隔符等。
    • 操作数统计范围可以是常量和变量等标识符。
  • 设 n1 表示程序中不同的操作符个数,n2 表示程序中不同的操作数个数,N1 表示程序中出现的操作符总数,N2 表示程序中出现的操作数总数。Halstead 复杂度的11项内容有:
    • Halstead 程序词汇表长度 Program vocabulary: n = n1 + n2.
    • Halstead 程序长度或简单长度 Program length: N = N1 + N2.
      • 注意到 N 定义为 Halstead 长度,并非源代码行数。
    • 以 N^ 表示程序的预测长度 Calculated program length:
      • N^ = n1*log2(n1) + n2*log2(n2).
      • Halstead 的重要结论之一是:程序的实际长度 N 与预测长度 N^ 非常接近,这表明即使程序还未编写完也能预先估算出程序的实际长度 N。
    • 程序体积或容量 Volume: V = Nlog2(n),表明了程序在词汇上的复杂性。
    • 程序级别 Level: L^ = (2/n1) x (n2/N2),表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
    • 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
    • 编程工作量 Effort: E = V x D = V/L^ .
    • 语言级别: Lʹ = L^ x L^ x V .
    • 编程时间 (hours): T^ = E/(S x f),这里 S = 60 x 60, f = 18 .
    • 平均语句大小: N/语句数。
    • 程序中的错误数预测值: B = V/3000 = Nlog2(n)/3000.

首先列表统计操作符的种类和出现次数:

操作符出现次数
if1
<1
=2
+7
-1
*2
/4
%1
return(返回操作)1
int(强制类型转换操作)1
dayray(函数调用操作)1

操作符一共有11种,n1 = 11,加起来共有22个,N1 = 22。

然后列表统计操作数的种类和出现次数:

操作数出现次数
month4
31
121
year6
12
day1
261
101
41
61
1001
4001
71

操作数一共有13种,n2 = 13,加起来共有22个,N2 = 22。

接着统计语句数:

语句一共有4个。

最后计算Halstead复杂度的11项内容:

  • 程序词汇表长度 Program vocabulary: n = n1 + n2 = 11 + 13 = 24
  • 程序长度或简单长度 Program length: N = N1 + N2 = 22 + 22 = 44
  • 程序的预测长度 Calculated program length: N^ = n1*log2(n1) + n2*log2(n2) = 11log2(11)+13log2(13) = 86.159
  • 程序体积或容量 Volume: V = Nlog2(n) = 44log2(24) = 201.73835
  • 程序级别 Level: L^ = (2/n1) x (n2/N2) = (2/11) x (13/22) = 0.1074
  • 程序难度 Difficulty: D = 1/L^ = 1/0.1074 = 9.31099
  • 编程工作量 Effort: E = V x D = V/L^ = 201.73835 * 9.31099 = 1878.38
  • 语言级别: Lʹ = L^ x L^ x V = 0.1074 * 0.1074 * 201.73835 = 2.327
  • 编程时间 (hours): T^ = E/(S x f),这里 S = 60 x 60, f = 18,T^ = 1878.38/(3600 * 18) = 0.028987
  • 平均语句大小: N/语句数 = 44/4 = 11
  • 程序中的错误数预测值: B = V/3000 = Nlog2(n)/3000 = 201.73835/3000 = 0.067246
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值