《程式設計珠璣》筆記4 正確編寫程式

2022-07-30 08:15:07 字數 1354 閱讀 8753

經過前三章,問題定義分析——演算法設計——資料結構選擇,這部分主要是編寫正確的**(包括偽**)

1.問題:二分搜尋

這部分一直都以二分搜尋為核心進行講述,自己寫的函式如下:

templateint bsearch(t *a, int l, int

h, t obj)

改為迭代方式:

templateint bsearch2(t*a, int l, int

h, t obj)

return -1

;}

2.編寫偽**,類似與迭代式,並利用迴圈不變式(初始化,終止,保持三個性質)對過程進行了詳盡分析。證明了偽**的正確性

3.原理

這部分一直強調 斷言 與 程式驗證。 個人理解,

斷言:就是一些合理的推論,我們根據一定的已知條件,做出斷言(也就是推出未知條件)。所以進行什麼樣的斷言 決定了程式是否正確,以及程式的走向。

函式:要驗證乙個函式,需要兩個斷言:乙個是前置條件——呼叫函式之前就應該成立的狀態;乙個是後置條件——由函式在終止執行是保證。所以如果乙個函式能夠保證在前置條件滿足時呼叫它,能夠確立後置條件。那麼函式就是正確的。

4.習題

4.2尋找第一次出現或最後一次出現的p

4.6問題描述:乙個咖啡罐中有一些黑豆和白豆,另有一堆額外的黑豆,重複下面過程,知道罐中只剩乙個豆子為止:

從罐中隨機取兩顆豆子,若顏色相同,將兩個都扔掉,放入乙個額外的黑豆;

若顏色不同,放回白豆,扔掉黑豆。

證明這個過程會終止,分析最後罐中豆子的顏色?

因為每次豆子總數會減少1,所以過程一定會終止。而每次白豆都是扔掉兩個或0個,所以白豆的奇偶性不會改變,故 最後乙個豆子要想是白豆,那麼必須保證開始罐中有奇數個白豆。

4.7這個問題可以轉化為乙個相似的常見問題,因為對乙個確定的x,其y值是已經排好序的,所以 直接從該點畫一條垂直於x軸的豎線,點在該豎線上,並且y已排好序,對其y值進行二分搜尋,到最後 l+1 == h 時,點就在此時的l和h表示的區間內。

計算步驟如下:

1)對x,計算y0,y1,...yn-1。後面n個數組成乙個有序陣列y

2)在有序陣列y中對y進行二分搜尋

int bsearch(int *y, int n, int

y)

if(a[mid] >obj)

else

}if(down == 0

)

return (-#, 0

);

if(up == n-1

)

return (n-1

, #);

}

程式設計珠璣 讀書筆記 第四章 編寫程式

2013 07 14 11 46 35 通過對二分搜尋法的例項分析,展示了程式驗證的的諸多優勢 問題很重要,需要認真地編寫 程式的開發需要遵循驗證思想 可以使用一般性的工具進行程式的正確性分析。感覺本章的內容有比較多的術語不是很好理解,看了兩遍,大致有點概念。本章討論的程式驗證的含義指的是驗證程式 ...

程式設計珠璣 第四章 編寫正確的程式

1 對下標限定界限 加條件 0 l u n 1 2 這個函式可以寫成如下形式 include using namespace std int bs int a,int begin,int end,int v if e a end e v return e a return 1 int main co...

程式設計珠璣 第四章 編寫正確的程式

1 對下標限定界限 加條件 0 l u n 1 2 這個函式可以寫成如下形式 include using namespace std int bs int a,int begin,int end,int v if e a end e v return e a return 1 int main co...