软件测试——Halstead复杂度计算
·
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 复杂度根据程序中语句行的操作符和操作数的数量计算程序复杂性。
- 设 n1n_1n1表示程序中不同的操作符个数,n2n_2n2 表示程序中不同的操作数个数,N1N_1N1 表示程序中出现的操作符总数,N2N_2N2 表示程序中出现的操作数总数。
2. 11项内容
- Halstead 程序词汇表长度 Program vocabulary: n = n1+n2n_1 + n_2n1+n2.
- Halstead 程序长度或简单长度 Program length: N = N1+N2N_1 + N_2N1+N2.
- 以 N^ 表示程序的预测长度 Calculated program length: N^ =$ n_1 log_2 n_1 + n_2 log_2 n_2$.
- 程序体积或容量 Volume: V = Nlog2(n)Nlog_2(n)Nlog2(n),表明了程序在词汇上的复杂性。
- 程序级别 Level: L^ = (2/n1)∗(n2/N2)(2/n_1) * (n_2/N_2)(2/n1)∗(n2/N2),表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
- 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
- 编程工作量 Effort: E = V * D = V/L^ .
- 语言级别: Lʹ = L^ * L^ * V.
- 编程时间 (hours): T^ = E/(S * f),这里 S = 60 * 60, f = 18 .
- 平均语句大小: N/语句数。
- 程序中的错误数预测值: 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 |
统计可得 n1=8n_1 = 8n1=8,N1=16N_1 = 16N1=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 |
统计可得 n2=14n_2 = 14n2=14,N2=20N_2 = 20N2=20
- Halstead 程序词汇表长度 Program vocabulary: n = n1+n2n_1 + n_2n1+n2.
- n = 8 + 14 = 22
- Halstead 程序长度或简单长度 Program length: N = N1+N2N_1 + N_2N1+N2.
- N = 16 + 20 = 36
- 以 N^ 表示程序的预测长度 Calculated program length: N^ =$ n_1 log_2 n_1 + n_2 log_2 n_2$.
- N^ = 8 * log28log_{2}8log28 + 14 * log214log_{2}14log214= 77.303
- 程序体积或容量 Volume: V = Nlog2(n)Nlog_2(n)Nlog2(n),表明了程序在词汇上的复杂性。
- V =37 * log222log_222log222 = 164.999
- 程序级别 Level: L^ = (2/n1)∗(n2/N2)(2/n_1) * (n_2/N_2)(2/n1)∗(n2/N2),表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
- 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
更多推荐


所有评论(0)