僞代碼(Pseudocode)是一種算法描述語言。使用僞代碼的目的是爲了使被描述的算法能夠容易地以任何一種編程語言(Pascal,C,Java,etc)實現。所以,僞代碼必須結構清晰、代碼簡單、可讀性好,而且相似天然語言。 介於天然語言與編程語言之間。html
它以編程語言的書寫形式指明算法的職能。相比於程序語言(例如Java, C++,C, Dephi 等等)它更相似天然語言。它是半角式化、不標準的語言。咱們能夠將整個算法運行過程的結構用接近天然語言的形式(這裏,你可使用任何一種你熟悉的文字,中文,英文 等等,關鍵是你把你程序的意思表達出來)描述出來. 使用僞代碼, 能夠幫助咱們更好的表述算法, 不用拘泥於具體的實現.程序員
人們在用不一樣的編程語言實現同一個算法時意識到,他們的實現(注意:這裏是實現,不是功能)很不一樣。尤爲是對於那些熟練於不一樣編程語言的程序員要理解一個(用其餘編程語言編寫的程序的)功能時可能很難,由於程序語言的形式限制了程序員對程序關鍵部分的理解。這樣僞代碼就應運而生了。算法
當考慮算法功能(而不是其語言實現)時,僞代碼經常獲得應用。計算機科學在教學中一般使用虛擬碼,以使得全部的程序員都能理解。編程
綜上,簡單的說,讓人便於理解的代碼。不依賴於語言的,用來表示程序執行過程,而不必定能編譯運行的代碼。在數據結構講算法的時候用的不少。 數組
語法規則
例如,類Pascal語言的僞代碼的語法規則是: 在僞代碼中,每一條指令佔一行(else if,例外)。指令後不跟任何符號(Pascal和C中語句要以分號結尾)。書寫上的「縮進」表示程序中的分支程序結構。這種縮進風格也適用於if-then-else語句。用縮進取代傳統Pascal中的begin和end語句來表示程序的塊結構能夠大大提升代碼的清晰性;同一模塊的語句有相同的縮進量,次一級模塊的語句相對與其父級模塊的語句縮進。數據結構
算法的僞代碼語言在某些方面可能顯得不太正規,可是給咱們描述算法提供了不少方便,而且可使咱們忽略算法實現中不少麻煩的細節。一般每一個算法開始時都要描述它的輸入和輸出,並且算法中的每一行都給編上號碼,在解釋算法的過程當中會常用算法步驟中的行號來指代算法的步驟。算法的僞代碼描述形式上並非很是嚴格,其主要特性和一般的規定以下:
1) 算法中出現的數組、變量能夠是如下類型:整數、實數、字符、位串或指針。一般這些類型能夠從算法的上下文來看是清楚的,並不須要額外加以說明。
2) 在算法中的某些指令或子任務能夠用文字來敘述,例如,"設x是A中的最大項",這裏A是一個數組;或者"將x插入L中",這裏L是一個鏈表。這樣作的目的是爲了不因那些與主要問題無關的細節使算法自己雜亂無章。
3) 算術表達式可使用一般的算術運算符(+,-,*,/,以及表示冪的^)。邏輯表達式可使用關係運算符=,≠,<,>,≤和≥,以及邏輯運算符與(and),或(or),非(not)。
4) 賦值語句是以下形式的語句:a<-b 。
這裏a是變量、數組項,b是算術表達式、邏輯表達式或指針表達式。語句的含義是將b的值賦給a。
5) 若a和b都是變量、數組項,那麼記號a<->b 表示a和b的內容進行交換。
6) goto語句具備形式
goto label(goto標號)
它將致使轉向具備指定標號的語句。
7) 條件語句有如下兩種形式:
if c then s或者
if c then s
else s′
這裏c是邏輯表達式,s和s′是單一的語句或者是被括在do和end之間的語句串。對於上述兩種形式,倘若c爲真,則s被執行一次。倘若c爲假,則在第一種形式中,if語句的執行就完成了,而在第二種形式中,執行s′。在全部的狀況下,控制就進行到了下一個語句,除非在s或s′中的goto語句使控制轉向到其它地方。
8) 有兩種循環指令: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來該改變。
9) exit語句能夠在一般的結束條件知足以前,被用來結束while循環或者for循環的執行。exit致使轉向到緊接在包含exit的(最內層)while或者for循環後面的一個語句。
10) return用來指出一個算法執行的終點;若是算法在最後一條指令以後結束,它一般是被省略的;它被用得最多的場合是檢測到不合須要的條件時。return的後面能夠緊接被括在引號的信息。
11) 算法中的註釋被括在/* */之中。諸如read和output之類的各類輸入或者輸出也在須要時被用到。
編程語言
僞代碼只是像流程圖同樣用在程序設計的初期,幫助寫出程序流程。簡單的程序通常都不用寫流程、寫思路,可是複雜的代碼,最好仍是把流程寫下來,整體上去考慮整個功能如何實現。寫完之後不只能夠用來做爲之後測試,維護的基礎,還可用來與他人交流。可是,若是把所有的東西寫下來一定可能會讓費不少時間,那麼這個時候能夠採用僞代碼方式。好比:函數
IF 九點之前 THENpost
do 私人事務;測試
ELSE 9點到18點 THEN
工做;
ELSE
下班;
END IF
這樣不但能夠達到文檔的效果,同時能夠節約時間. 更重要的是,使結構比較清晰,表達方式更加直觀.
下面介紹一種類Pascal語言的僞代碼的語法規則。
在僞代碼中,每一條指令佔一行(else if 例外,),指令後不跟任何符號(Pascal和C中語句要以分號結尾);
書寫上的「縮進」表示程序中的分支程序結構。這種縮進風格也適用於if-then-else語句。用縮進取代傳統Pascal中的begin和end語句來表示程序的塊結構能夠大大提升代碼的清晰性;同一模塊的語句有相同的縮進量,次一級模塊的語句相對與其父級模塊的語句縮進;
在僞代碼中,一般用連續的數字或字母來標示同一即模塊中的連續語句,有時也可省略標號。
符號△後的內容表示註釋;
在僞代碼中,變量名和保留字不區分大小寫,這一點和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
以上語句用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;
例如:
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
上述語句用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;
}
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 過程名」語句來調用;
例如:
1. x ← t + 10
2. y ← sin(x)
3. call CalValue(x,y)
參數用按值傳遞方式傳給一個過程:被調用過程接受參數的一份副本,若他對某個參數賦值,則這種變化對發出調用的過程是不可見的。當傳遞一個對象時,只是拷貝指向該對象的指針,而不拷貝其各個域。