作业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.
首先列表统计操作符的种类和出现次数:
操作符 | 出现次数 |
---|---|
if | 1 |
< | 1 |
= | 2 |
+ | 7 |
- | 1 |
* | 2 |
/ | 4 |
% | 1 |
return(返回操作) | 1 |
int(强制类型转换操作) | 1 |
dayray(函数调用操作) | 1 |
操作符一共有11种,n1 = 11,加起来共有22个,N1 = 22。
然后列表统计操作数的种类和出现次数:
操作数 | 出现次数 |
---|---|
month | 4 |
3 | 1 |
12 | 1 |
year | 6 |
1 | 2 |
day | 1 |
26 | 1 |
10 | 1 |
4 | 1 |
6 | 1 |
100 | 1 |
400 | 1 |
7 | 1 |
操作数一共有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