软件测试——Halstead复杂度计算

版权声明: https://blog.csdn.net/dickdick111/article/details/90247567

Assignment 4——Halstead复杂度计算

一. 题目

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

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

二. 关于Halstead复杂度的11项内容

1.定义

  • Halstead 复杂度 (Maurice H. Halstead, 1977) 是软件科学提出的第一个计算机软件的分析“定律”,用以确定计算机软件开发中的一些定量规律。
  • Halstead 复杂度根据程序中语句行的操作符和操作数的数量计算程序复杂性。
  • n 1 n_1 表示程序中不同的操作符个数, n 2 n_2 表示程序中不同的操作数个数, N 1 N_1 表示程序中出现的操作符总数, N 2 N_2 表示程序中出现的操作数总数。

2. 11项内容

  1. Halstead 程序词汇表长度 Program vocabulary: n = n 1 + n 2 n_1 + n_2 .
  2. Halstead 程序长度或简单长度 Program length: N = N 1 + N 2 N_1 + N_2 .
  3. 以 N^ 表示程序的预测长度 Calculated program length: N^ =$ n_1 log_2 n_1 + n_2 log_2 n_2$.
  4. 程序体积或容量 Volume: V = N l o g 2 ( n ) Nlog_2(n) ,表明了程序在词汇上的复杂性。
  5. 程序级别 Level: L^ = ( 2 / n 1 ) ( n 2 / N 2 ) (2/n_1) * (n_2/N_2) ,表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
  6. 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
  7. 编程工作量 Effort: E = V * D = V/L^ .
  8. 语言级别: Lʹ = L^ * L^ * V.
  9. 编程时间 (hours): T^ = E/(S * f),这里 S = 60 * 60, f = 18 .
  10. 平均语句大小: N/语句数。
  11. 程序中的错误数预测值: B = V/3000 = $Nlog_2(n)/3000 $.

三. 解答

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

从上述代码可以得出以下两个表

Operator 操作符 Number of Occurrences 出现次数
if 1
< 1
+= 1
1
+ 6
* 2
/ 4
% 1

统计可得 n 1 = 8 n_1 = 8 N 1 = 16 N_1 = 16

Operand 操作数 Number of Occurrences 出现次数
month 3
year 5
dayray 1
day 1
3 1
12 1
1 1
26 1
10 1
4 1
6 1
100 1
400 1
7 1

统计可得 n 2 = 14 n_2 = 14 N 2 = 20 N_2 = 20

  • Halstead 程序词汇表长度 Program vocabulary: n = n 1 + n 2 n_1 + n_2 .
    • n = 8 + 14 = 22
  • Halstead 程序长度或简单长度 Program length: N = N 1 + N 2 N_1 + N_2 .
    • N = 16 + 20 = 36
  • 以 N^ 表示程序的预测长度 Calculated program length: N^ =$ n_1 log_2 n_1 + n_2 log_2 n_2$.
    • N^ = 8 * l o g 2 8 log_{2}8 + 14 * l o g 2 14 log_{2}14 = 77.303
  • 程序体积或容量 Volume: V = N l o g 2 ( n ) Nlog_2(n) ,表明了程序在词汇上的复杂性。
    • V =37 * l o g 2 22 log_222 = 164.999
  • 程序级别 Level: L^ = ( 2 / n 1 ) ( n 2 / N 2 ) (2/n_1) * (n_2/N_2) ,表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
    • L^ = (2 / 8) * (14 / 20) = 2.8
  • 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
    • D = 1 / 2.8 = 0.357
  • 编程工作量 Effort: E = V * D = V/L^ .
    • E = 164.999 * 0.357 = 58.905
  • 语言级别: Lʹ = L^ * L^ * V.
    • Lʹ = 2.8 * 2.8 * 164.999 = 1293.592
  • 编程时间 (hours): T^ = E/(S * f),这里 S = 60 * 60, f = 18 .
    • T^ = 58.905 / (3600 * 18) = 0.000909
  • 平均语句大小: N/语句数。
    • N / 语句数 = 37 / 5 = 7.4
  • 程序中的错误数预测值: B = V/3000 = $Nlog_2(n)/3000 $.
    • B = 164.999 / 3000 = 0.055

猜你喜欢

转载自blog.csdn.net/dickdick111/article/details/90247567