《编程珠玑》笔记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];
posted @ 2012-09-01 21:33  dandingyy  阅读(229)  评论(0编辑  收藏  举报