1. 程式人生 > >虛擬碼的閱讀與書寫規範

虛擬碼的閱讀與書寫規範

虛擬碼的使用 

虛擬碼(Pseudocode)是一種演算法描述語言。使用為程式碼的目的是為了使被描述的演算法可以容易地以任何一種程式語言(Pascal, C, Java, etc)實現。因此,虛擬碼必須結構清晰,程式碼簡單,可讀性好,並且類似自然語言

下面介紹一種類Pascal語言的虛擬碼的語法規則。

虛擬碼的語法規則

  1. 在虛擬碼中,每一條指令佔一行(else if 例外,),指令後不跟任何符號(Pascal和C中語句要以分號結尾);
  2. 書寫上的“縮排”表示程式中的分支程式結構。這種縮排風格也適用於if-then-else語句。用縮排取代傳統Pascal中的begin和end語句來表示程式的塊結構可以大大提高程式碼的清晰性;同一模組的語句有相同的縮排量,次一級模組的語句相對與其父級模組的語句縮排;

    例如:

    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
  3. 在虛擬碼中,通常用連續的數字或字母來標示同一即模組中的連續語句,有時也可省略標號。

    例如:

    1. line 1 2. line 2 a. sub line 1 b. sub line 2 1. sub sub line 1 2. sub sub line 2 c. sub line 3 3. line 3
  4. 符號△後的內容表示註釋;
  5. 在虛擬碼中,變數名和保留字不區分大小寫,這一點和Pascal相同,與C或C++不同;
  6. 在虛擬碼中,變數不需宣告,但變數區域性於特定過程,不能不加顯示的說明就使用全域性變數;
  7. 賦值語句用符號←表示,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;
  8. 選擇語句用if-then-else來表示,並且這種if-then-else可以巢狀,與Pascal中的if-then-else沒有什麼區別。

    例如:

    if (Condition1) then [ Block 1 ] else if (Condition2) then [ Block 2 ] else [ Block 3 ]
  9. 迴圈語句有三種: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

    上述語句用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;
  10. 陣列元素的存取有陣列名後跟“[下標]”表示。例如A[j]指示陣列A的第j個元素。符號“ …”用來指示陣列中值的範圍。

    例如:

     A[1…j]表示含元素A[1], A[2], … , A[j]的子陣列;

  11. 複合資料用物件(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。

  12. 函式和過程語法與Pascal類似。

    函式值利用 “return (函式返回值)” 語句來返回,呼叫方法與Pascal類似;過程用 “call 過程名”語句來呼叫;

    例如:

    1. x ← t + 10 2. y ← sin(x) 3. call CalValue(x,y)

    引數用按值傳遞方式傳給一個過程:被呼叫過程接受引數的一份副本,若他對某個引數賦值,則這種變化對發出呼叫的過程是不可見的。當傳遞一個物件時,只是拷貝指向該物件的指標,而不拷貝其各個域。