程式設計珠璣 第五章 程式設計小事

2021-08-26 21:45:16 字數 3803 閱讀 1490

一,概述

主要講解如何保證程式設計的正確性。在程式中加入斷言(assert(斷言內容) //如果錯誤,則終止程式。否則正常執行)。

typdef //宣告自定義型別

typedef int size; //宣告int 型整數的別名

size array[4];

typedef struct tagnode

*pnode;

測試結構題大小的程式

#include "stdio.h"

typedef struct tagnode

*pnode;

int main()

二,習題

5)測試、斷言優化過程

for (i = 0; i < n - 1; ++i)  

assert(a[i] < a[i+1]);

如何利用二分的性質來進行處理還是乙個問題。

一種辦法是:

int bs(int *a, int b, int e, int v)  

return -1;

}

但是這個方法需要多次使用才能檢測出來,也就是可能在查詢某兩個數的時候不會報錯,可能在查詢別的幾個數的時候就報錯了。很多時候,這不是一種好選擇。

根據第五題的題意,可以寫如下**來減少每次檢測的量。

int bs(int *a, int b, int e, int v)  

while (begin < end)

return -1;

}

加乙個static變數來記錄這個陣列是否經過檢測,來決定以後的檢測還需要進行。

當然對於多個陣列的檢測,可以利用hash來處理,因為一般來說,陣列的下標位址都是不一樣的。

[html]view plain

copy

for(i=

0;i<

n-1;++i)

assert(a[i]<

a[i+1]);

如何利用二分的性質來進行處理還是乙個問題。

一種辦法是:

[cpp]view plain

copy

intbs(

int*a,

intb,

inte,

intv)

return

-1; }

但是這個方法需要多次使用才能檢測出來,也就是可能在查詢某兩個數的時候不會報錯,可能在查詢別的幾個數的時候就報錯了。很多時候,這不是一種好選擇。

根據第五題的題意,可以寫如下**來減少每次檢測的量。

[cpp]view plain

copy

intbs(

int*a,

intb,

inte,

intv)

while

(begin

return

-1; }

加乙個static變數來記錄這個陣列是否經過檢測,來決定以後的檢測還需要進行。

當然對於多個陣列的檢測,可以利用hash來處理,因為一般來說,陣列的下標位址都是不一樣的。

9,,serch.c 源程式

#include #include #include #define maxn 1000000

typedef int datatype;

datatype x[maxn];

int n;

/* scaffolding */

int i = -999999;

#define assert(v)

/* alg 1: from programming pearls, column 4: raw transliteration */

int binarysearch1(datatype t)

}/* alg 2: make binarysearch1 more c-ish */

int binarysearch2(datatype t)

return -1;

}/* alg 3: from pp, col 8 */

int binarysearch3(datatype t)

if (u >= n || x[u] != t)

return -1;

return u;

}/* alg 4: from pp, col 9 */

int binarysearch4(datatype t)

/* alg 9: buggy, from programming pearls, column 5 */

int sorted()

int binarysearch9(datatype t)

} /* assert(x[l] > t && x[u] < t); */

return -1;

}/* alg 21: ****** sequential search */

int seqsearch1(datatype t)

/* alg 22: faster sequential search: sentinel */

int seqsearch2(datatype t)

/* alg 23: faster sequential search: loop unrolling */

int seqsearch3(datatype t)

if (x[i+1] == t)

if (x[i+2] == t)

if (x[i+3] == t)

if (x[i+4] == t)

if (x[i+5] == t)

if (x[i+6] == t)

if (x[i+7] == t)

} x[n] = hold;

if (i == n)

return -1;

else

return i;

}/* scaffolding to probe one algorithm */

void probe1()

}/* torture test one algorithm */

#define s seqsearch3

void test(int maxn)

assert(s(10*n - 5) == -1);

assert(s(10*n) == -1);

/* equal elements */

for (i = 0; i < n; i++)

x[i] = 10;

if (n == 0) else

assert(s(5) == -1);

assert(s(15) == -1); }}

/* timing */

int p[maxn];

void scramble(int n)

}void timedriver()

}} clicks = clock() - start;

printf("%d\t%d\t%d\t%d\t%g\n",

algnum, n, numtests, clicks,

1e9*clicks/((float) clocks_per_sec*n*numtests)); }}

/* main */

int main()

程式設計珠璣 第五章 程式設計小事

一,概述 主要講解如何保證程式設計的正確性。在程式中加入斷言 assert 斷言內容 如果錯誤,則終止程式。否則正常執行 typdef 宣告自定義型別 typedef int size 宣告int 型整數的別名 size array 4 測試結構題大小的程式 二,習題 5 測試 斷言優化過程 如何利...

程式設計珠璣第五章

直接來習題吧 1 第一題可以看一下林銳的高質量c c 程式設計 2 3 4 5 第五題很明顯不應該每次都用 for i 0 i n 1 i assert a i a i 1 如何利用二分的性質來進行處理還是乙個問題。一種辦法是 int bs int a,int b,int e,int v retur...

C程式設計第五章

include 10.前20項和 int main printf 12.10f sum return 0 11.小球10次 int main printf 十次高度 10.6f t經過距離 10.6f n h,s return 0 12.猴子吃桃 誰家的猴子家裡能放下一千多個桃 int main p...