偽代碼(pseudocode)是一種算法描述語(yǔ)言。使用偽代碼的目的是為了使被描述的算法可以容易地以任何一種編程語(yǔ)言(pascal,c,java,etc)實(shí)現(xiàn)。因此,偽代碼必須結(jié)構(gòu)清晰、代碼簡(jiǎn)單、可讀性好,并且類似自然語(yǔ)言。 介于自然語(yǔ)言與編程語(yǔ)言之間。
它以編程語(yǔ)言的書寫形式指明算法的職能。相比于程序語(yǔ)言(例如java, c ,c, dephi 等等)它更類似自然語(yǔ)言。它是半角式化、不標(biāo)準(zhǔn)的語(yǔ)言。我們可以將整個(gè)算法運(yùn)行過程的結(jié)構(gòu)用接近自然語(yǔ)言的形式(這里,你可以使用任何一種你熟悉的文字,中文,英文 等等,關(guān)鍵是你把你程序的意思表達(dá)出來)描述出來. 使用偽代碼, 可以幫助我們更好的表述算法, 不用拘泥于具體的實(shí)現(xiàn).
人們?cè)谟貌煌木幊陶Z(yǔ)言實(shí)現(xiàn)同一個(gè)算法時(shí)意識(shí)到,他們的實(shí)現(xiàn)(注意:這里是實(shí)現(xiàn),不是功能)很不同。尤其是對(duì)于那些熟練于不同編程語(yǔ)言的程序員要理解一個(gè)(用其他編程語(yǔ)言編寫的程序的)功能時(shí)可能很難,因?yàn)槌绦蛘Z(yǔ)言的形式限制了程序員對(duì)程序關(guān)鍵部分的理解。這樣偽代碼就應(yīng)運(yùn)而生了。
當(dāng)考慮算法功能(而不是其語(yǔ)言實(shí)現(xiàn))時(shí),偽代碼常常得到應(yīng)用。計(jì)算機(jī)科學(xué)在教學(xué)中通常使用虛擬碼,以使得所有的程序員都能理解。
綜上,簡(jiǎn)單的說,讓人便于理解的代碼。不依賴于語(yǔ)言的,用來表示程序執(zhí)行過程,而不一定能編譯運(yùn)行的代碼。在數(shù)據(jù)結(jié)構(gòu)講算法的時(shí)候用的很多。
語(yǔ)法規(guī)則
例如,類pascal語(yǔ)言的偽代碼的語(yǔ)法規(guī)則是: 在偽代碼中,每一條指令占一行(else if,例外)。指令后不跟任何符號(hào)(pascal和c中語(yǔ)句要以分號(hào)結(jié)尾)。書寫上的“縮進(jìn)”表示程序中的分支程序結(jié)構(gòu)。這種縮進(jìn)風(fēng)格也適用于if-then-else語(yǔ)句。用縮進(jìn)取代傳統(tǒng)pascal中的begin和end語(yǔ)句來表示程序的塊結(jié)構(gòu)可以大大提高代碼的清晰性;同一模塊的語(yǔ)句有相同的縮進(jìn)量,次一級(jí)模塊的語(yǔ)句相對(duì)與其父級(jí)模塊的語(yǔ)句縮進(jìn)。
算法的偽代碼語(yǔ)言在某些方面可能顯得不太正規(guī),但是給我們描述算法提供了很多方便,并且可以使我們忽略算法實(shí)現(xiàn)中很多麻煩的細(xì)節(jié)。通常每個(gè)算法開始時(shí)都要描述它的輸入和輸出,而且算法中的每一行都給編上號(hào)碼,在解釋算法的過程中會(huì)經(jīng)常使用算法步驟中的行號(hào)來指代算法的步驟。算法的偽代碼描述形式上并不是非常嚴(yán)格,其主要特性和通常的規(guī)定如下:
1)算法中出現(xiàn)的數(shù)組、變量可以是以下類型:整數(shù)、實(shí)數(shù)、字符、位串或指針。通常這些類型可以從算法的上下文來看是清楚的,并不需要額外加以說明。
2)在算法中的某些指令或子任務(wù)可以用文字來敘述,例如,"設(shè)x是a中的最大項(xiàng)",這里a是一個(gè)數(shù)組;或者"將x插入l中",這里l是一個(gè)鏈表。這樣做的目的是為了避免因那些與主要問題無關(guān)的細(xì)節(jié)使算法本身雜亂無章。
3)算術(shù)表達(dá)式可以使用通常的算術(shù)運(yùn)算符( ,-,*,/,以及表示冪的^)。邏輯表達(dá)式可以使用關(guān)系運(yùn)算符=,≠,<,>,≤和≥,以及邏輯運(yùn)算符與(and),或(or),非(not)。
4)賦值語(yǔ)句是如下形式的語(yǔ)句:a<-b。
這里a是變量、數(shù)組項(xiàng),b是算術(shù)表達(dá)式、邏輯表達(dá)式或指針表達(dá)式。語(yǔ)句的含義是將b的值賦給a。
5)若a和b都是變量、數(shù)組項(xiàng),那么記號(hào)a<->b 表示a和b的內(nèi)容進(jìn)行交換。
6)goto語(yǔ)句具有形式
goto label(goto標(biāo)號(hào))
它將導(dǎo)致轉(zhuǎn)向具有指定標(biāo)號(hào)的語(yǔ)句。
7)條件語(yǔ)句有以下兩種形式:
if c then s或者
if c then s
else s′
這里c是邏輯表達(dá)式,s和s′是單一的語(yǔ)句或者是被括在do和end之間的語(yǔ)句串。對(duì)于上述兩種形式,假若c為真,則s被執(zhí)行一次。假若c為假,則在第一種形式中,if語(yǔ)句的執(zhí)行就完成了,而在第二種形式中,執(zhí)行s′。在所有的情況下,控制就進(jìn)行到了下一個(gè)語(yǔ)句,除非在s或s′中的goto語(yǔ)句使控制轉(zhuǎn)向到其它地方。
8)有兩種循環(huán)指令:while和for。
while語(yǔ)句的形式是
while c do
s
end
這里c是邏輯表達(dá)式,而s是由一個(gè)或更多個(gè)語(yǔ)句組成的語(yǔ)句串。當(dāng)c為真時(shí),執(zhí)行s。在每一次執(zhí)行s之前,c都被檢查一下;假若c為假,控制就進(jìn)行到緊跟在while語(yǔ)句后面的語(yǔ)句。注意,當(dāng)控制第一次達(dá)到while語(yǔ)句時(shí),假若c為假,則s一次也不執(zhí)行。
for語(yǔ)句的形式是
for var init to limit by incr do
s
end
這里var是變量,init、limit和incr都是算術(shù)表達(dá)式,而s是由一個(gè)或多個(gè)語(yǔ)句組成的語(yǔ)句串。初始時(shí),var被賦予init的值。假若incr≥0,則只要var≤limit,就執(zhí)行s并且將incr加到var上。(假若incr<0,則只要var≥limit,就執(zhí)行s并且將incr加到var上)。incr的符號(hào)不能由s來該改變。
9)exit語(yǔ)句可以在通常的結(jié)束條件滿足之前,被用來結(jié)束while循環(huán)或者for循環(huán)的執(zhí)行。exit導(dǎo)致轉(zhuǎn)向到緊接在包含exit的(最內(nèi)層)while或者for循環(huán)后面的一個(gè)語(yǔ)句。
10)return用來指出一個(gè)算法執(zhí)行的終點(diǎn);如果算法在最后一條指令之后結(jié)束,它通常是被省略的;它被用得最多的場(chǎng)合是檢測(cè)到不合需要的條件時(shí)。return的后面可以緊接被括在引號(hào)的信息。
11)算法中的注釋被括在/* */之中。諸如read和output之類的各種輸入或者輸出也在需要時(shí)被用到。
偽代碼實(shí)例
偽代碼只是像流程圖一樣用在程序設(shè)計(jì)的初期,幫助寫出程序流程。簡(jiǎn)單的程序一般都不用寫流程、寫思路,但是復(fù)雜的代碼,最好還是把流程寫下來,總體上去考慮整個(gè)功能如何實(shí)現(xiàn)。寫完以后不僅可以用來作為以后測(cè)試,維護(hù)的基礎(chǔ),還可用來與他人交流。但是,如果把全部的東西寫下來必定可能會(huì)讓費(fèi)很多時(shí)間,那么這個(gè)時(shí)候可以采用偽代碼方式。比如:
if 九點(diǎn)以前 then
do 私人事務(wù);
else 9點(diǎn)到18點(diǎn) then
工作;
else
下班;
end if
這樣不但可以達(dá)到文檔的效果,同時(shí)可以節(jié)約時(shí)間. 更重要的是,使結(jié)構(gòu)比較清晰,表達(dá)方式更加直觀.
下面介紹一種類pascal語(yǔ)言的偽代碼的語(yǔ)法規(guī)則。
在偽代碼中,每一條指令占一行(else if 例外,),指令后不跟任何符號(hào)(pascal和c中語(yǔ)句要以分號(hào)結(jié)尾);
書寫上的“縮進(jìn)”表示程序中的分支程序結(jié)構(gòu)。這種縮進(jìn)風(fēng)格也適用于if-then-else語(yǔ)句。用縮進(jìn)取代傳統(tǒng)pascal中的begin和end語(yǔ)句來表示程序的塊結(jié)構(gòu)可以大大提高代碼的清晰性;同一模塊的語(yǔ)句有相同的縮進(jìn)量,次一級(jí)模塊的語(yǔ)句相對(duì)與其父級(jí)模塊的語(yǔ)句縮進(jìn);
在偽代碼中,通常用連續(xù)的數(shù)字或字母來標(biāo)示同一即模塊中的連續(xù)語(yǔ)句,有時(shí)也可省略標(biāo)號(hào)。
符號(hào)△后的內(nèi)容表示注釋;
在偽代碼中,變量名和保留字不區(qū)分大小寫,這一點(diǎn)和pascal相同,與c或c 不同;
在偽代碼中,變量不需聲明,但變量局部于特定過程,不能不加顯示的說明就使用全局變量;
賦值語(yǔ)句用符號(hào)←表示,x←exp表示將exp的值賦給x,其中x是一個(gè)變量,exp是一個(gè)與x同類型的變量或表達(dá)式(該表達(dá)式的結(jié)果與x同類型);多重賦值i←j←e是將表達(dá)式e的值賦給變量i和j,這種表示與j←e和i←e等價(jià)。
例如:
x←y
x←20*(y 1)
x←y←30
以上語(yǔ)句用c分別表示為:
x = y;
x = 20*(y 1);
x = y = 30;
選擇語(yǔ)句用if-then-else來表示,并且這種if-then-else可以嵌套,與pascal中的if-then-else沒有什么區(qū)別。
例如:
if (condition1)
then [ block 1 ]
else if (condition2)
then [ block 2 ]
else [ block 3 ]
循環(huán)語(yǔ)句有三種:while循環(huán)、repeat-until循環(huán)和for循環(huán),其語(yǔ)法均與pascal類似,只是用縮進(jìn)代替begin – end;
例如:
1. x ← 0
2. y ← 0
3. z ← 0
4. while x < n
1. do x ← x 1
2. y ← x y
3. for t ← 0 to 10
1. do z ← ( z x * y ) / 100
2. repeat
1. y ← y 1
2. z ← z – y
3. until z < 0
4. z ← x * y
5. y ← y / 2
上述語(yǔ)句用c或c 來描述是:
x = y = z = 0;
while( z < n )
{
x ;