现在的位置: 首页 > 综合 > 正文

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

2013年11月25日 ⁄ 综合 ⁄ 共 2084字 ⁄ 字号 评论关闭

一,概述

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

        typdef   //声明自定义类型

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

               size array[4];

               

typedef struct tagNode
{
  char *pItem;
 pNode  *pNext;
} *pNode;

测试结构题大小的程序

#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)测试、断言优化过程

for (i = 0; i < n - 1; ++i)  
   assert(a[i] < a[i+1]);  

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

一种办法是:

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;  
}  

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

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

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] view
plain
copy

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

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

一种办法是:

  1. int bs(int *a, int b, int e, int v)  
  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.         else if (*mid < v) begin = mid + 1;  
  11.         else return mid - a;  
  12.     }  
  13.     return -1;  
  14. }  

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

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

  1. int bs(int *a, int b, int e, int v)  
  2. {  
  3.     int *begin = a + b, *end = a + e, *mid, i = b;  
  4.     static int *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.   
  12.     while (begin < end)  
  13.     {  

抱歉!评论已关闭.