【编程珠玑】第五章:编程小事
一,概述
主要讲解如何保证编程的正确性。在程序中加入断言(assert(断言内容) //如果错误,则终止程序。否则正常执行)。
typdef //声明自定义类型
typedef int size; //声明int 型整数的别名
size array[4];
[html]typedef struct tagNode
{
char *pItem;
pNode *pNext;
} *pNode;
测试结构题大小的程序
[html]
#include "stdio.h"
typedef struct tagNode
{
char *pItem; //32位
struct tagNode *pNext;//32位
} *pNode;
int main()
{
printf("%d\n",sizeof(struct tagNode));
return 0;
}
二,习题
5)测试、断言优化过程
[html]
for (i = 0; i < n - 1; ++i)
assert(a[i] < a[i+1]);
如何利用二分的性质来进行处理还是一个问题。
一种办法是:
[html]
int bs(int *a, int b, int e, int v)
{
int *begin = a + b, *end = a + e, *mid;
if (!a || b >= e) return -1;
while (begin < end)
{
mid = begin + ((end - begin) >> 1);
assert(*begin <= *mid && *mid <= *end);
if (*mid > v) end = mid;
else if (*mid < v) begin = mid + 1;
else return mid - a;
}
return -1;
}
但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,可能在查找别的几个数的时候就报错了。很多时候,这不是一种好选择。
根据第五题的题意,可以写如下代码来减少每次检测的量。
[html]
int bs(int *a, int b, int e, int v)
{
int *begin = a + b, *end = a + e, *mid, i = b;
static int *record = 0;
if (!a || b >= e) return -1;
if (!record || record != a)
{
while (i < e && a[i] < a[i+1]) ++i;
assert(i == e);
}
while (begin < end)
{
mid = begin + ((end - begin) >> 1);
assert(*begin <= *mid && *mid <= *end);
if (*mid > v) end = mid;
else if (*mid < v) begin = mid + 1;
else return mid - a;
}
return -1;
}
加一个static变量来记录这个数组是否经过检测,来决定以后的检测还需要进行。
当然对于多个数组的检测,可以利用hash来处理,因为一般来说,数组的下标地址都是不一样的。
[html]
for (i = 0; i < n - 1; ++i)
assert(a[i] < a[i+1]);
如何利用二分的性质来进行处理还是一个问题。
一种办法是:
[cpp]
int bs(int *a, int b, int e, int v)
{
int *begin = a + b, *end = a + e, *mid;
if (!a || b >= e) return -1;
while (begin < end)
{
mid = begin + ((end - begin) >> 1);
assert(*begin <= *mid && *mid <= *end);
if (*mid > v) end = mid;
else if (*mid < v) begin = mid + 1;
else return mid - a;
}
return -1;
}
但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,可能在查找别的几个数的时候就报错了。很多时候,这不是一种好选择。
根据第五题的题意,可以写如下代码来减少每次检测的量。
[cpp]
int bs(int *a, int b, int e, int v)
{
int *begin = a + b, *end = a + e, *mid, i = b;
static int *record = 0;
if (!a || b >= e) return -1;
if (!record || record != a)
{
while (i < e && a[i] < a[i+1]) ++i;
assert(i == e);
}
while (begin < end)
{
mid = begin + ((end - begin) >> 1);
assert(*begin <= *mid && *mid <= *end);
if (*mid > v) end = mid;
else if (*mid < v) begin = mid + 1;
else return mid - a;
}
return -1;
}
加一个static变量来记录这个数组是否经过检测,来决定以后的检测还需要进行。
当然对于多个数组的检测,可以利用hash来处理,因为一般来说,数组的下标地址都是不一样的。
9,,serch.c 源程序
[html]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXN 1000000
typedef int DataType;
DataType x[MAXN];
int n;
/* Scaffolding */
int i = -999999;
#define assert(v) { if ((v) == 0) printf(" binarysearch bug %d %d\n", i, n); }
/* Alg 1: From Programming Pearls, Column 4: raw transliteration */
int binarysearch1(DataType t)
{ int l, u, m;
l = 0;
u = n-1;
for (;;) {
if (l > u)
补充:软件开发 , 其他 ,