虛擬碼執行與追蹤工具

執行以考試虛擬碼撰寫的程式,逐行確認變數的變化。支援 if、while、for、陣列、函式與遞迴呼叫。輸入題目的程式,與自己的追蹤結果(手動追蹤的結果)比較看看。可使用整數型、for (i 從 1 到 n 每次加 1)、a的元素數、輸出 等中文關鍵字。

程式

可使用的寫法
宣告    整數型: x ← 0, y      也可用 實數型 / 字串型 / 邏輯型
陣列    整數型陣列: a ← {1, 2, 3}   元素從 a[1] 開始(從 1 數起)
元素數  a的元素數               附加  aの末尾に x を追加する
指定    x ← 運算式              輸出  輸出 x, y
條件    if (條件) … elseif (條件) … else … endif
迴圈    while (條件) … endwhile    do … while (條件)
        for (i 從 1 到 n 每次加 1) … endfor(也可用 每次減)
函式    ○整數型: f(整數型: n),在下方縮排撰寫本體。return 運算式
程序    ○g(整數型: n)
運算    + - × ÷ mod(也可用 * /)   比較 = ≠ < > ≦ ≧   邏輯 and or not
        存入整數型變數時,÷ 結果的小數部分會被捨去
字串    "abc",以 + 串接          真假  true / false
也可使用考試的日文關鍵字(整数型、を 1 から n まで 1 ずつ増やす、出力 …)。

輸出


    

追蹤

這是支援考試虛擬碼主要寫法的簡易學習用直譯器,細節可能與實際考題的寫法不同。變數表顯示當時正在執行的函式中的變數(在函式外宣告的變數也能在函式中使用)。陣列以參照方式傳遞。

科目 B 與追蹤

日本基本資訊技術人員考試的科目 B,以閱讀用虛擬碼寫成的程式,回答執行結果或空格中應填入的字句為主。為此,逐行追蹤程式、把變數值如何變化寫成表格加以確認的追蹤能力不可或缺。這個工具可以把自己手動追蹤的結果,與實際執行的結果逐行比較。

虛擬碼的基本

在虛擬碼中,變數像「整數型: x」一樣加上型別宣告,值的指定則像「x ← 1」一樣以箭頭表示。條件分支寫成 if … elseif … else … endif,迴圈寫成 while … endwhile 或 for … endfor。陣列寫成 {1, 2, 3},元素以 a[1] 這種從 1 數起的編號指定。函式像「○整數型: f(整數型: n)」一樣宣告,以 return 回傳值。請注意,把 ÷ 的結果存入整數型變數時,小數部分會被捨去。

追蹤的訣竅

追蹤時,製作每個變數一欄的表格,每執行一行就填入改變後的值。迴圈要記得寫下每次的條件判斷,連最後條件為假而離開的那一次也要算進去。陣列的編號從 1 還是從 0 開始、迴圈的結束是「到」還是「小於」,常會造成結果差一次(差一錯誤)的錯誤。遞迴呼叫時,要意識到每一層呼叫都有各自的變數,並從最底層依序計算回傳值。

常見的程式

科目 B 常見的題材包括陣列的加總、最大值、排序(泡沫排序、選擇排序)、二元搜尋、最大公因數(輾轉相除法)、轉換為二進位、遞迴(階乘、費氏數列),以及用陣列實作堆疊或佇列的程式。選擇範例執行,在追蹤中確認變數的變化,再稍微改變條件或迴圈範圍,試試結果如何改變。

練習相關題目

下列程式原本打算用兩個指派敘述交換 x 與 y 的值。執行後 x 與 y 的值為下列何者?

  1. Ax = 3, y = 3
  2. Bx = 7, y = 3
  3. Cx = 7, y = 7
查看答案與解析

正確答案:C. x = 7, y = 7

虛擬碼的指派敘述由上而下逐一執行。x ← y 使 x 變為7,原本的值3在此時就遺失了。接著的 y ← x 會把新的 x 值7放入 y,因此 x = 7、y = 7。要交換值,應像 t ← x、x ← y、y ← t 這樣,先把原本的值暫存到工作用變數再指派。

下列程式將3個變數的值依序傳遞。執行後 a、b、c 的值為下列何者?

  1. Aa = 2, b = 3, c = 1
  2. Ba = 2, b = 3, c = 2
  3. Ca = 3, b = 1, c = 2
查看答案與解析

正確答案:A. a = 2, b = 3, c = 1

t ← a 把 a 原本的值1暫存到 t。a ← b 使 a = 2,b ← c 使 b = 3,最後的 c ← t 把暫存的1放入 c。3個值各往前移一個位置,因此 a = 2、b = 3、c = 1。若不使用 t 而寫成 c ← a,此時 a 已經是2,c 會變成2。

下列程式反覆將 x 乘以3。執行後 n 的值為下列何者?

  1. A4
  2. B5
  3. C6
查看答案與解析

正確答案:B. 5

把 x 與 n 的值寫成追蹤表,可以看出每次重複時 x 依序變為 3、9、27、81、243,n 每次加1。x = 81 時 x < 100 仍成立,因此再執行一次,得到 x = 243、n = 5。下一次判斷時 x < 100 為偽,離開迴圈。條件共判斷6次,但迴圈內的處理只執行5次。

下列程式在雙重迴圈中有條件分支。執行後 c 的值為下列何者?

  1. A4
  2. B6
  3. C10
查看答案與解析

正確答案:B. 6

內層迴圈為 j = 1〜i,只有 j 為奇數時才使 c 增加。i = 1 時為 j = 1 的1次,i = 2 時為 j = 1 的1次,i = 3 時為 j = 1、3 的2次,i = 4 時為 j = 1、3 的2次,合計 1 + 1 + 2 + 2 = 6。內層的處理總共執行 1 + 2 + 3 + 4 = 10 次,其中滿足條件的是6次。這是在重複中放入條件分支的控制結構的基本組合。

為了求陣列 a 所有元素的總和而寫了下列程式。陣列的元素編號從1開始。執行後 s 的值為下列何者?

  1. A20
  2. B21
  3. C24
查看答案與解析

正確答案:B. 21

a的元素數為5,因此 i 從1跑到4,s = 4 + 7 + 1 + 9 = 21。最後一個元素 a[5] = 3 沒有加上,所以比正確的總和24少3。若把元素編號從0開始的語言的寫法(從0到元素數 − 1)直接套用到從1開始的陣列,就會發生這種差了一個的錯誤(差一錯誤)。

常見問題

支援考試虛擬碼的所有寫法嗎?

支援變數與陣列的宣告、指定、if、while、do while、for、函式與程序、陣列的元素數與附加到尾端,以及算術、比較、邏輯運算。二維陣列、物件(類別)、位元運算符號等依題目定義的寫法,部分不支援。

÷ 的結果會如何?

÷ 是一般的除法,7 ÷ 2 為 3.5。存入整數型變數(或由整數型函式回傳)時會捨去小數部分,因此在「整數型: mid ← (1 + 8) ÷ 2」中,mid 為 4。餘數以 mod 求得。

變成無窮迴圈會怎樣?

執行的行數超過 2 萬時會停止並顯示錯誤。請確認 while 條件中使用的變數是否在迴圈中改變。

輸入的程式會被傳送到其他地方嗎?

不會。程式只在這個頁面(瀏覽器)中執行,不會傳送到任何地方。

相關用語

虛擬碼 遞迴 堆疊

相關計算工具

半導體、電子電路與資訊計算工具 →