《编程珠玑》笔记5 测试
这部分接第四章,讲述对前面的代码进行测试。
这里一直提到名词 脚手架(scaffolding),可以理解为访问目标函数的主函数,用于对目标函数的测试。
待测试的函数是上一篇中提到的bsearch函数。
1.测试工具
下面是一个调用bsearch的主函数
1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 5 #define MAX 50 6 8 int main(int argc, char**argv) 9 { 10 ifstream fin(argv[1]); 11 12 int A[MAX]; 13 int i = 0; 14 while(fin >> A[i++]) 15 ; 16 17 int obj; 18 cout << "Input the number to search: "; 19 cin >> obj; 20 int rs = bsearch(A, 0, i-2, obj); 21 22 if(rs == -1) 23 cout <<"No find!" << endl; 24 else 25 cout <<"find in " <<rs<< " index." << endl; 26 27 return 0; 28 }
书中给出了一种二分搜索时常见的错误情况,就是在更新 h 或 l 时,直接令 h = mid 或 l = mid ,这种情况不能保证每次搜索一定会减少范围,也就不能保证算法的结束,具体就是在 l 与 h相邻的情况下,此时 mid = l,若A[mid] < obj, 需使 l = mid, 但是l与mid本身就相等,所以进入死循环。
2.断言艺术
主要讲述了对assert函数(位于头文件<assert.h>中)的运用。
3.自动测试
注意要对所有数据进行测试。
int main(int argc, char **argv) { int maxn = atoi(argv[1]); for(int n = 0; n <= maxn; n++) { cout <<"n= " << n << endl; int *x = new int[n]; for(int i = 0; i <n; i++) x[i] = 10*i; /* *以n = 3 为例,x中的元素为 0, 10, 20,*** *下面测试 每一个数字0,10,20以及-5,5,15 *最后测试超出范围的数字:25,30 */ for(int i = 0; i < n; i++) { assert(bsearch(x, 0, n-1, 10*i) == i); assert(bsearch(x, 0, n-1, 10*i-5) == -1); } assert(bsearch(x, 0, n-1, 10*n-5) == -1); for(int i = 0; i < n; i++) x[i] = 10; if(n == 0) assert(bsearch(x, 0, n-1, 10) == -1); else assert(0<=bsearch(x, 0, n-1, 10) && bsearch(x,0, n-1, 10) < n); assert(bsearch(x, 0, n-1, 5) == -1); delete []x; } return 0; }
4.计时
5.原理总结
脚手架:即主测试函数。(用于对某个单独函数进行测试)
编码:注意高级伪代码的使用,把伪代码翻译成语言
测试和调试:这些最好在脚手架程序中完成。
6.习题
判断数组是否升序排列
for(int i = 0; i < n; i++) assert(x[i] <= x[i+1];