什么是偽代碼?
偽代碼(Pseudocode)是一種算法描述語言。使用偽代碼的目的是使被描述的算法可以容易地以任何一種編程語言(Pascal,C,Java等)實現。因此,偽代碼必須結構清晰、代碼簡單、可讀性好,并且類似自然語言。 介于自然語言與編程語言之間。以編程語言的書寫形式指明算法職能。使用偽代碼, 不用拘泥于具體實現。相比程序語言(例如Java, C++,C, Dephi 等等)它更類似自然語言。它是* [半角](半角,即一個字符指一個[字符]占用兩個標準字符位置的狀態。漢字字符和規定了全角的英文字符及國標GB2312-80中的圖形符號和特殊字符都是[全角字符]占用一個標準字符的位置。)*式化、不標準的語言。可以將整個算法運行過程的結構用接近自然語言的形式(可以使用任何一種你熟悉的文字,關鍵是把程序的意思表達出來)描述出來。
人們在用不同的編程語言實現同一個算法時意識到,他們的實現(注意:這里是實現,不是功能)很不同。尤其是對于那些熟練于不同編程語言的程序員要理解一個(用其他編程語言編寫的程序的)功能時可能很難,因為程序語言的形式限制了程序員對程序關鍵部分的理解。這樣偽代碼就應運而生了。
當考慮算法功能(而不是其語言實現)時,偽代碼常常得到應用。計算機科學在教學中通常使用虛擬碼,以使得所有的程序員都能理解。
綜上,簡單的說,讓人便于理解的代碼。不依賴于語言的,用來表示程序執行過程,而不一定能編譯運行的代碼。在數據結構講算法的時候用的很多。
偽代碼實例
偽代碼只是像流程圖一樣用在程序設計的初期,幫助寫出程序流程。簡單的程序一般都不用寫流程、寫思路,但是復雜的代碼,最好還是把流程寫下來,總體上去考慮整個功能如何實現。寫完以后不僅可以用來作為以后測試,維護的基礎,還可用來與他人交流。但是,如果把全部的東西寫下來必定可能會讓費很多時間,那么這個時候可以采用偽代碼方式。比如:
IF 九點以前 THEN
do 私人事務;
ELSE 9點到18點 THEN
工作;
ELSE
下班;
END IF
這樣不但可以達到文檔的效果,同時可以節約時間. 更重要的是,使結構比較清晰,表達方式更加直觀.
賦值語句用符號←表示,x←exp表示將exp的值賦給x,其中x是一個變量,exp是一個與x同類型的變量或表達式(該表達式的結果與x同類型);多重賦值i←j←e是將表達式e的值賦給變量i和j,這種表示與j←e和i←e等價。
例如:
x←y
x←20(y+1)
x←y←30
以上語句用C分別表示為:
x = y;
x = 20(y+1);
x = y = 30;
選擇語句用if-then-else來表示,并且這種if-then-else可以嵌套,與Pascal中的if-then-else沒有什么區別。
例如:
if (Condition1)
then [ Block 1 ]
else if (Condition2)
then [ Block 2 ]
else [ Block 3 ]
循環語句有三種:while循環、repeat-until循環和for循環,其語法均與Pascal類似,只是用縮進代替begin - end;
例如:
- x ← 0
- y ← 0
- z ← 0
- while x < N
- do x ← x + 1
- y ← x + y
- for t ← 0 to 10
- do z ← ( z + x * y ) / 100
- repeat
- y ← y + 1
- z ← z - y
- until z < 0
- z ← x * y
- y ← y / 2
上述語句用C或C++來描述是:
x = y = z = 0;
while( z < N )
{
x ++;
y += x;
for( t = 0; t < 10; t++ )
{
z = ( z + x * y ) / 100;
do {
y ++;
z -= y;
} while( z >= 0 );
}
z = x * y;
}
y /= 2;
偽代碼語法規則11條:
算法中出現的數組、變量可以是以下類型:整數、實數、字符、位串或指針。通常這些類型可以從算法的上下文來看是清楚的,并不需要額外加以說明。
在算法中的某些指令或子任務可以用文字來敘述,例如,"設x是A中的最大項",這里A是一個數組;或者"將x插入L中",這里L是一個鏈表。這樣做的目的是為了避免因那些與主要問題無關的細節使算法本身雜亂無章。
算術表達式可以使用通常的算術運算符(+,-,*,/,以及表示冪的^)。邏輯表達式可以使用關系運算符=,≠,<,>,≤和≥,以及邏輯運算符與(and),或(or),非(not)。
賦值語句是如下形式的語句:a<-b 。
這里a是變量、數組項,b是算術表達式、邏輯表達式或指針表達式。語句的含義是將b的值賦給a。
若a和b都是變量、數組項,那么記號a<->b 表示a和b的內容進行交換。
-
goto語句具有形式
goto label(goto標號)
它將導致轉向具有指定標號的語句。
-
條件語句有以下兩種形式:
if c then s或者 if c then s else s′
這里c是邏輯表達式,s和s′是單一的語句或者是被括在do和end之間的語句串。對于上述兩種形式,假若c為真,則s被執行一次。假若c為假,則在第一種形式中,if語句的執行就完成了,而在第二種形式中,執行s′。在所有的情況下,控制就進行到了下一個語句,除非在s或s′中的goto語句使控制轉向到其它地方。
-
有兩種循環指令:while和for。
while語句的形式是 while c do s end
這里c是邏輯表達式,而s是由一個或更多個語句組成的語句串。當c為真時,執行s。在每一次執行s之前,c都被檢查一下;假若c為假,控制就進行到緊跟在while語句后面的語句。注意,當控制第一次達到while語句時,假若c為假,則s一次也不執行。
for語句的形式是
for var init to limit by incr do
s
end
這里var是變量,init、limit和incr都是算術表達式,而s是由一個或多個語句組成的語句串。初始時,var被賦予init的值。假若incr≥0,則只要var≤limit,就執行s并且將incr加到var上。(假若incr<0,則只要var≥limit,就執行s并且將incr加到var上)。incr的符號不能由s來該改變。
exit語句可以在通常的結束條件滿足之前,被用來結束while循環或者for循環的執行。exit導致轉向到緊接在包含exit的(最內層)while或者for循環后面的一個語句。
return用來指出一個算法執行的終點;如果算法在最后一條指令之后結束,它通常是被省略的;它被用得最多的場合是檢測到不合需要的條件時。return的后面可以緊接被括在引號的信息。
算法中的注釋被括在之中。諸如read和output之類的各種輸入或者輸出也在需要時被用到。
在偽代碼的使用中有以下一些約定:
1)書寫上的“縮進”表示程序中的分程序(程序塊)結構。用縮進取代傳統的begin和end語句來表示程序的塊結構,可以大大提高代碼的清晰性。(在真正的程序設計語言里,一般不建議單獨使用縮進來表示分程序結構,這是因為當代碼跨頁時,縮進的層次很難確定。)
2)while,for,repeat等循環結構和if,then,else條件結構與Pascal中相同。(多數分程序結構的語言中都有與此等價的語言構造,具體的語法與Pascal中的可能有所不同。)然而,對for循環來說有一點不同,在Pascal中,循環計數器變量在退出循環時是未定義的,但在偽代碼中,在退出循環后,循環計數器的值仍然保持。于是,緊接著一個for循環之后,循環計時器的值就是第一個超過for循環終值的那個數字。
3)符合“?”表示后面的部分是個注釋。
4)多重賦值 i←j←e是將表達式e的值賦給變量i和j;等價于賦值j←e,再進行賦值i←j。
5)變量(如i,t和key等)是局部于給定過程的。在沒有顯示說明的情況下,我們不使用全局變量。
6)數組元素是通過“數組名[下標]”這樣的形式來訪問的。例如,A[i]表示數組A的第i個元素。符合“..”用來表示數組中的一個取值范圍,例如,A[1..j]就表示A的一個子數組,它包含了j個元素:A[1],A[2],…,A[j]。
7)復合數據一般組織成對象,它們是由屬性(attribute)或域(field)所組成的。域的訪問是由域名后跟由方括號括住的對象名形式來表示。例如,數組可以被看作是一個對象,其屬性有length,表示數組中元素的個數,如length[A]就表示數組A中的元素個數。在表示數組元素和對象屬性時,都要用的方括號,一般來說,通過上下文就可以看出其含義。
用于表示一個數組或對象的變量被看作是指向表示數組或對象的數據的一個指針。對于某個對象x的所有域f,賦值y←x就使得f[y] = f[x]。更進一步,如果有f[x] ← 3,則不僅有f[x] = 3,同時f[y] = 3。換言之,在賦值y←x后,x和y指向同一個對象。
有時,一個指針不指向任何對象。這時,我們賦給它NIL。
8)參數采用按值傳遞方式:被調用的過程會收到參數的一份副本。如果它對某個參數賦值的話,主調過程是看不見這一變動的。當對象被傳遞時,實際傳遞的是一個指向該對象數據的指針,而對象的各個域則不被拷貝。例如,如果x是某個被調用過程的參數,在被調用過程中的賦值x←y對主調過程來說是不可見的。但是,賦值f[x] = 3卻是可見的。
9)布爾運算符“and”和“or”都具有短路能力。亦即,當我們求表達式“x and y”的值時,首先計算x的值為FALSE,那么整個表達式的值就不可能為TRUE了,因而就無需再對y求值了。但是,如果x的值為TRUE的話,就必須進一步計算出y的值,才能確定整個表達式的值。類似地,在計算表達式“x or y”的值時,僅當x的值為FALSE時,才需要計算子表達式y的值。短路運算符允許我們寫出如“x ≠ NIL and f[x] = y”這樣的布爾表達式,而不用擔心當我們試圖在x為NIL時計算f[x],會發生怎樣的情況。