偽代碼

一種非正式的用於描述模塊結構圖的語言

偽代碼(Pseudocode)是一種非正式的,類似於英語結構的,用於描述模塊結構圖的語言。人們在用不同的編程語言實現同一個演演算法時意識到,他們的實現(注意:這裡是實現,不是功能)很不同。尤其是對於那些熟練於不同編程語言的程序員要理解一個(用其他編程語言編寫的程序的)功能時可能很難,因為程序語言的形式限制了程序員對程序關鍵部分的理解。這樣偽代碼就應運而生了。偽代碼提供了更多的設計信息,每一個模塊的描述都必須與設計結構圖一起出現。

使用偽代碼的目的是使被描述的演演算法可以容易地以任何一種編程語言(Pascal,C,Java等)實現。因此,偽代碼必須結構清晰、代碼簡單、可讀性好,並且類似自然語言。介於自然語言與編程語言之間。以編程語言的書寫形式指明演演算法職能。使用偽代碼,不用拘泥於具體實現。相比程序語言(例如Java, C++,C, Dephi 等等)它更類似自然語言。它是半形式化、不標準的語言。可以將整個演演算法運行過程的結構用接近自然語言的形式(可以使用任何一種你熟悉的文字,關鍵是把程序的意思表達出來)描述出來。

應用領域


當考慮演演算法功能(而不是其語言實現)時,偽代碼常常得到應用。偽代碼中常被用於技術文檔和科學出版物中來表示演演算法,也被用於在軟體開發的實際編碼過程之前表達程序的邏輯。偽代碼不是用戶和分析師的工具,而是設計師和程序員的工具。計算機科學在教學中通常使用虛擬碼,以使得所有的程序員都能理解。
綜上,簡單地說,讓人便於理解的代碼。不依賴於語言的,用來表示程序執行過程,而不一定能編譯運行的代碼。在數據結構講演演算法的時候用的很多。偽代碼用來表達程序員開始編碼前的想法。

語法規則


例如,類Pascal語言的偽代碼的語法規則是:在偽代碼中,每一條指令佔一行(else if,例外) 。用縮進取代傳統Pascal中的begin和end語句來表示程序的塊結構可以大大提高代碼的清晰性。

實例


偽代碼:是用介於自然語言和計算機語言之間的文字和符號(包括數學符號)來描述演演算法。
【簡單示例】輸入3個數,列印輸出其中最大的數。可用如下的偽代碼表示:
Begin(演演算法開始)
輸入 A,B,C
IF A>B 則 A→Max
否則 B→Max
IF C>Max 則 C→Max
Print Max
End (演演算法結束)
偽代碼只是像流程圖一樣用在程序設計的初期,幫助寫出程序流程。簡單的程序一般都不用寫流程、寫思路,但是複雜的代碼,最好還是把流程寫下來,總體上去考慮整個功能如何實現。寫完以後不僅可以用來作為以後測試,維護的基礎,還可用來與他人交流。但是,如果把全部的東西寫下來必定可能會浪費很多時間,那麼這個時候可以採用偽代碼方式。比如:
if 九點以前 then
do 私人事務;
if 9點到18點 then
工作;
else
下班;
end if
這樣不但可以達到文檔的效果,同時可以節約時間。更重要的是,使結構比較清晰,表達方式更加直觀。
下面介紹一種類Pascal語言的偽代碼的語法規則。
同一模塊的語句有相同的縮進量,次一級模塊的語句相對與其父級模塊的語句縮進;
例如:
line 1
line 2
sub line 1
sub line 2
sub sub line 1
sub sub line 2
sub line 3
line 3
而在Pascal中這種關係用begin和end的嵌套來表示,
line 1
line 2
begin
sub line 1
sub line 2
begin
sub sub line 1
sub sub line 2
end;
sub line 3
end;
line 3
在C中這種關係用{ 和 } 的嵌套來表示,
line 1;
line 2;
{
sub line 1;
sub line 2;
{
sub sub line 1;
sub sub line 2;
}
sub line 3;
}
line 3;
在偽代碼中,通常用連續的數字或字母來標示同一級模塊中的連續語句,有時也可省略標號。
例如:
⒈ line 1
⒉ line 2
a. sub line 1
b. sub line 2
⒈ sub sub line 1
⒉ sub sub line 2
c. sub line 3
⒊ line 3
符號△后的內容表示註釋;
在偽代碼中,變數名和保留字不區分大小寫,這一點和Pascal相同,與C或C++不同;
在偽代碼中,變數不需聲明,但變數局部於特定過程,不能不加顯示的說明就使用全局變數;
賦值語句用符號←表示,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
以上語句用Pascal分別表示為:
x := y;
x := 20*(y+1);
x := 30; 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
上述語句用Pascal來描述是:
x := 0;
y := 0;
z := 0;
while x < N do
begin
x := x + 1;
y := x + y;
for t := 0 to 10 do
begin
z := (z + x * y) / 100;
repeat
y := y + 1;
z := z - y;
until z < 0;
end;
z := x * y;
end;
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;
數組元素的存取有數組名後跟“[下標]”表示。例如A[j]指示數組A的第j個元素。符號“ …”用來指示數組中值的範圍。
例如:
A[1…j]表示含元素A[1],A[2],…,A[j]的子數組;
複合數據用對象(Object)來表示,對象由屬性(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。
函數和過程語法與Pascal類似。
函數值利用“return (函數返回值)”語句來返回,調用方法與Pascal類似;過程用“call 過程名”語句來調用;
例如:
⒈ x ← t + 10
⒉ y ← sin(x)
⒊ call CalValue(x,y)
參數用按值傳遞方式傳給一個過程:被調用過程接受參數的一份副本,若他對某個參數賦值,則這種變化對發出調用的過程是不可見的。當傳遞一個對象時,只是拷貝指向該對象的指針,而不拷貝其各個域。