当前位置:软件学习 > 其它软件 >>

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

一,概述
        主要讲解如何保证编程的正确性。在程序中加入断言(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) 
           

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,