【编程珠玑】第五章 编程小事

一,概述

主要讲解如何保证编程的正确性。在程序中加入断言(assert(断言内容) //如果错误,则终止程序。否则正常执行)。

typdef //声明自定义类型

typedef int size; //声明int 型整数的别名

size array[4];


测试结构题大小的程序


二,习题

5)测试、断言优化过程


如何利用二分的性质来进行处理还是一个问题。

一种办法是:


但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,可能在查找别的几个数的时候就报错了。很多时候,这不是一种好选择。

根据第五题的题意,可以写如下代码来减少每次检测的量。



加一个static变量来记录这个数组是否经过检测,来决定以后的检测还需要进行。

当然对于多个数组的检测,可以利用hash来处理,因为一般来说,数组的下标地址都是不一样的。

[html] view plain copy
  1. for(i=0;i<n-1;++i)
  2. assert(a[i]<a[i+1]);

如何利用二分的性质来进行处理还是一个问题。

一种办法是:

  1. intbs(int*a,intb,inte,intv)
  2. {
  3. int*begin=a+b,*end=a+e,*mid;
  4. if(!a||b>=e)return-1;
  5. while(begin<end)
  6. {
  7. mid=begin+((end-begin)>>1);
  8. assert(*begin<=*mid&&*mid<=*end);
  9. if(*mid>v)end=mid;
  10. elseif(*mid<v)begin=mid+1;
  11. elsereturnmid-a;
  12. }
  13. return-1;
  14. }

但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,可能在查找别的几个数的时候就报错了。很多时候,这不是一种好选择。

根据第五题的题意,可以写如下代码来减少每次检测的量。

  1. intbs(int*a,intb,inte,intv)
  2. {
  3. int*begin=a+b,*end=a+e,*mid,i=b;
  4. staticint*record=0;
  5. if(!a||b>=e)return-1;
  6. if(!record||record!=a)
  7. {
  8. while(i<e&&a[i]<a[i+1])++i;
  9. assert(i==e);
  10. }
  11. while(begin<end)
  12. {
  13. mid=begin+((end-begin)>>1);
  14. assert(*begin<=*mid&&*mid<=*end);
  15. if(*mid>v)end=mid;
  16. elseif(*mid<v)begin=mid+1;
  17. elsereturnmid-a;
  18. }
  19. return-1;
  20. }

加一个static变量来记录这个数组是否经过检测,来决定以后的检测还需要进行。

当然对于多个数组的检测,可以利用hash来处理,因为一般来说,数组的下标地址都是不一样的。

9,,serch.c 源程序



你可能感兴趣的:(编程珠玑)