天天看點

《C語言程式設計:問題與求解方法》——3.3節逐漸求精的僞代碼

本節書摘來自華章社群《c語言程式設計:問題與求解方法》一書中的第3章,第3.3節逐漸求精的僞代碼,作者:何 勤,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.3 逐漸求精的僞代碼

表示問題求解的算法有多種方法,其中最常用的是僞代碼和流程圖。流程圖隻适合解決規模較小的、比較簡單的問題,雖然初學者易于了解和掌握,表達算法也比較清晰,但程式員和真正會程式設計者并不常使用這種方法—因為它不利于對算法的構思、修改和調整(僅适用于表達比較簡單的算法),是以本書不作介紹。

本書将使用逐漸求精的僞代碼來表示算法。所謂僞代碼沒有嚴格的規範(是以也比較靈活),但其中有一些結構要素,可以用一些比較規範的方式來表述對問題的計算和處理流程。

一級算法隻是解決問題的一個輪廓。對于某些複雜問題,隻根據一級算法難以直接寫出(c語言的)源程式。這時可對一級算法進一步細化(稱為二級求精),将其中的某些步驟進一步擴充、細化,直到可以很容易寫出(c語言)程式的語句時為止。

對于某些人是很顯然的算法描述,對于其他人可能并不顯而易見。是以,算法求精的過程和步驟是因人而異的。程式設計經驗越豐富,算法求精的步驟就可能越少。不過,算法求精的步驟太少也不一定是好事。因為程式員的一個良好習慣,就是把僞代碼表示的一級算法(算法複雜,還可以到二級求精),轉變為源程式中的注釋。注釋太過簡潔,會加大自己和别人閱讀程式的難度。

逐漸求精的僞代碼的實質就是模仿人們在做一個大的任務時,首先将其粗分為幾個一級任務,然後再分别考慮每個一級任務如何完成。不太明确的一級任務還要再細分為若幹個二級任務,依此類推。

學習用僞代碼來表達自己的程式設計思路和算法時,要通過大量閱讀代碼和練習來模仿、領悟,看的和模仿的算法多了,慢慢就掌握了。

【例題3.1】求三個數的和及平均值。(類型:必修題;趣味性:; 難度:)

變量安排: 3個要輸入的數用3個變量a1、a2、a3表示;三個數的和用1個變量sum表示;平均值用1個變量average表示;所有變量都用浮點類型定義。

僞代碼的一級算法:

1 輸入這三個數a1,a2,a3;

2 求這三個數的和sum及平均值average;

3 輸出sum,average;

其中第二步由于不能直接轉化成語句而需要進一步求精。根據求和及求平均值的以下兩個代數式:

sum=a1+a2+a3

average=sum÷3

隻需将其轉化為指派語句即可。

第2步的二級求精:

注意:運作此程式時,用鍵盤輸入三個資料給變量a1,a2,a3時,三個資料之間要用空格隔開。輸完後,按下Enter鍵,程式才會繼續運作。

【練習】輸入兩個數,求兩數的平方和。

提示:将僞代碼形式的一級算法(有時還包括二級求精)轉變為程式中的注釋,可增加程式的可讀性。這是一種良好的程式設計習慣。

【例題3.2】雞兔同籠問題。已知雞和兔的總頭數和總腳數,求雞有多少隻,兔有多少隻。(類型:必修題;趣味性:*;難度:)

1 輸入總頭數heads,總腳數feet

2 求雞的隻數chicken和兔的隻數rabbit

3 輸出變量chicken和rabbit的值

其中隻有第2步需要求精。根據二進制一次方程組,可知四個變量heads、feet、chicken、rabbit之間的關系為

将此公式轉化為指派語句,考慮到輸入的總頭數和總腳數不一定能得到整數解,是以将變量chicken(表示雞的隻數)、rabbit(表示兔的隻數)定義為float 型變量。

二級求精如下:

取代第13行和第14行,結果會如何?

答:指派語句右邊的表達式中出現的變量,必須是已經初始化了的變量。指派語句是用指派号右邊的表達式求出的值,存放到指派号左邊的變量表示的存儲單元中。是以,這兩句是不正确的,但大多數編譯程式不會報告出這類錯誤。程式運作時,會取用記憶體單元中變量chicken和rabbit中的不确定的值(垃圾資料)參與運算。經過運算得到兩個錯誤數值,去改變變量heads和feet的原來正确值。

換言之,數學中的方程式不能直接轉變為指派語句,隻有公式才可以直接轉變為指派語句(所謂公式,是等号左邊為一個要求值的變量,等号右邊是一個數學代數式,數學代數式中出現的變量的值都是已知的)。

繼續閱讀