跳轉到內容

維基少兒:兒童程式設計/輸入、輸出和過程

來自華夏公益教科書,開放的書籍,開放的世界
維基少兒:兒童程式設計
變數和資料型別 輸入、輸出和過程 選擇

在上一章中,我們用自己的值初始化了變數。如果我們想讓使用者輸入她自己的值怎麼辦?如果我們想用它做點什麼怎麼辦?

輸入和輸出

[編輯 | 編輯原始碼]

有兩種方法可以接收輸入。第一種是從外部文字檔案(例如 JavaScript 中的cookie、ActionScript 中的共享物件,或者僅僅是普通的文字檔案)讀取輸入。第二種是提示使用者輸入,然後獲取值。這可以透過鍵盤、滑鼠、麥克風或其他輸入裝置完成。

有許多方法可以接收輸出。最常見的方法是在螢幕上顯示。其他方法包括使用揚聲器、印表機等。

為了簡單起見,在這本書中,我們將使用 JavaScript 中的彈出視窗和 Pascal 中的控制檯

程式碼 圖表
虛擬碼 流程圖
PROGARM HowOldRU
10 Output 'How old are you?'
20 Input age
30 Output 'You are' + age + 'years old.'
帕斯卡
PROGRAM HowOldRU;
USES sysutils;
VAR
   age: integer;
BEGIN
   writeln('How old are you?');
   readln(age);
   writeln('You are ' + IntToStr(age)
   + ' years old.');
   readln();
END.
JavaScript
<script>
var age = prompt("How old are you?", 12);
alert("You are " + age + " years old.");
</script>

在我們的虛擬碼中,我們只是提示使用者輸入年齡,獲取年齡並顯示我們的訊息。這非常簡單,我們的輸入/輸出方法沒有明確說明。

在我們的 Pascal 程式碼中,我們首先聲明瞭“age”,一個整數。然後我們將文字“你幾歲了?”輸出到控制檯。這是我們的提示。接下來,我們使用 readln 函式獲取使用者的輸入,並將值放入我們的“age”變數中。最後,我們輸出結果。IntToStr 函式只是將年齡從整數轉換為字串。

我們的 JavaScript 程式碼要容易得多,因為該語言為我們做了更多工作。在我們的 JavaScript 程式碼中,我們首先使用彈出視窗提示使用者“你幾歲了”。在同一個彈出視窗中,使用者可以輸入年齡。年齡,它是一種弱型別,在此階段已經是字串。接下來,我們輸出年齡。

(注意:輸出上的加號不表示加法,而是文字連線。我們將在後面的運算子部分討論這一點。)

賦值語句幫助我們為某個變數賦值。假設我們要將值 60 賦給變數 x。在虛擬碼中,這可以用多種方法表達,而在 Pascal 和 Javascript 中,表達方式是固定的。

虛擬碼 流程圖 帕斯卡 JavaScript
x  60
x := 60
x = 60
Put 60 into x
 x := 60
 x = 60

我們也可以將一個變數賦值給另一個變數。在這個例子中,y 將變為 60

虛擬碼 流程圖 帕斯卡 JavaScript
x  60
y  x
 x := 60
y := x
 x = 60
y = x

有時,我們不知道變數的初始值,但需要新增一個特定數字。在這種情況下,我們可以使用以下形式

虛擬碼 流程圖 帕斯卡 JavaScript
y  60
y  y + 3
 y := 60
y := y + 3
 y = 60
y = y + 3
或者
 y = 60
y += 3

這可能讓人困惑,但這與運算子優先順序有關,我們將在後面討論。

請記住,左側的表示式始終是您想要更改的變數,而右側的表示式始終是要放入變數的值。賦值語句如 2 ← 3、y + 3 ← y + 4 或 myConstant ← y + 3 會導致錯誤,因為它們沒有意義!(例如,你如何將 3 賦值給 2?)

運算子

[編輯 | 編輯原始碼]

運算子是執行其運算元(被操作的資料)上的特定操作的符號或關鍵字。它們可能 a)根據運算元返回值,或 b)告訴計算機執行某些操作。(一些運算子可以同時做到這兩點,例如 JavaScript 中的 ++ 運算子)。

運算子可以是一元運算子二元運算子。一元運算子只有一個運算元。最常見的一元運算子是一元減號,它反轉數字的符號。例如,-2 是負二,-(-2)是 2。

二元運算子更為常見。二元運算子兩側都有運算元。例如,1 + 1 返回 2。我們剛剛見過的賦值運算子也是一個二元運算子。

算術運算子

[編輯 | 編輯原始碼]

與算術相關的運算子是算術運算子。最常見的二元算術運算子如下所示。

名稱 虛擬碼/流程圖 帕斯卡 JavaScript
加法 +
減法 -
乘法 *
除法 /
指數 ^ N/A
MOD %
DIV N/A

很可能,你對四則運算沒有問題,但 Mod 和 Div 可能有點麻煩。事實上,它們並沒有聽起來那麼嚇人!在除法運算中,Mod 返回餘數,而 Div 返回商。當餘數為 0 時,我們通常的除法運算子返回分數。

關係運算符

[編輯 | 編輯原始碼]

關係運算符,也稱為比較運算子,比較兩個變數並返回一個布林變數。例如,1 < 2 返回 TRUE,而 1 > 2 返回 FALSE。以下是一些常見的關係運算符。

名稱 虛擬碼/流程圖 帕斯卡 JavaScript
等於 = 或 == = ==
不等於 <> !=
大於 >
小於 <
大於或等於 >=
小於或等於 <=

這些運算子始終可以與數字一起使用。在某些語言中,你可以用它們比較字元、字串、布林值,甚至其他型別,例如宇宙飛船和恐龍。但是,對它們的詳細討論超出了本書的範圍,尤其是那些需要面嚮物件語言的部分。

邏輯運算子

[編輯 | 編輯原始碼]

關係運算符比較兩個值並將它們轉換為布林值,而邏輯運算子則操縱布林值本身。最常見的邏輯運算子是 AND、OR 和 NOT。NOR、XOR 和 NAND 是其他邏輯運算子。我們只會在本書中討論 AND、OR、NOT 和 XOR。

名稱 虛擬碼/流程圖 帕斯卡 JavaScript
NOT !
AND &&
OR ||
異或 XOR N/A
  • NOT 只是將一個布林值翻轉。NOT TRUE 返回 FALSE,NOT FALSE 返回 TRUE。如果 a 為 TRUE,則 NOT a 為 FALSE;如果 b 為 FALSE,則 NOT b 為 TRUE。
  • 如果兩個運算元都為真,則 AND 返回 TRUE;否則,返回 FALSE。TRUE AND FALSE 返回 FALSE,而 TRUE AND TRUE 返回 TRUE。
  • 如果兩個運算元都為假,則 OR 返回 FALSE;否則,返回 TRUE。TRUE OR FALSE 返回 TRUE,而 FALSE OR FALSE 返回 FALSE。
  • 如果且僅當一個運算元為 TRUE 時,XOR 返回 TRUE。TRUE XOR FALSE 返回 TRUE,而 TRUE XOR TRUE 返回 FALSE。

所有這些都可能非常令人困惑!一個真值表顯示了這些邏輯表示式的所有結果。假設我們有兩個布林變數 p 和 q。以下是 NOT p、p AND q 和 p OR q 的真值表

p NOT p
T F
F T
p q p AND q
T T T
T F F
F T F
F F F
p q p OR q
T T T
T F T
F T T
F F F

考慮到這一點,我們可以輕鬆地建立更復雜的真值表(圓括號稱為分組運算子,表示括號內的部分應優先執行)

p q p OR q NOT(p OR q)
T T T F
T F T F
F T T F
F F F T

關係運算符通常與比較運算子一起使用。例如,NOT((1 = 2) OR (2 < 3)) 返回 TRUE。我們將在接下來的章節中看到它們有多有用。

其他運算子

[編輯 | 編輯原始碼]

文字串聯運算子將字串組合在一起,該過程稱為串聯。例如,當我們將字串 'Wiki' 和 'books' 串聯起來時,得到的字串是 'Wikibooks'。在虛擬碼、Pascal 和 JavaScript 中,文字串聯運算子是 +。在 JavaScript 中,如果一個或兩個運算元是字串,運算子將是文字串聯運算子。("a" + 2 返回 "a2")。如果兩個運算元都是數字,則結果將是數字。在 Pascal 中,我們必須確保運算元的資料型別相同。

JavaScript 還有一些有趣的附加運算子,包括增量運算子複合賦值運算子(+=,我們在上面已經見過,就是一個例子)和位運算子。我們將在過程中介紹其中一些,但在這裡不會進行詳細討論。

運算順序

[編輯 | 編輯原始碼]

還記得你在數學課上學習的運算順序(PEMDAS 或 BOMDAS/BIMDAS)嗎?ActionScript 也按固定順序應用不同的運算子。在程式設計中,在確定運算順序時,我們需要考慮兩件事:運算子優先順序運算子結合性

什麼是運算子優先順序?

[編輯 | 編輯原始碼]

當一個運算子始終在另一個運算子之前被計算時,我們稱之為運算子優先順序。以下是 JavaScript 中運算子優先順序的快速概述

帕斯卡 JavaScript
  • 一元運算子排在第一位。
  • 列表中的下一個是 *、/、div、mod 和 and。
  • 然後是 +、- 和 or。
  • 最後是賦值運算子和比較運算子。
  • 一元運算子排在第一位。
  • 列表中的下一個是 *、/ 和 %。
  • 然後是 + 和 -
  • 然後是比較運算子。
  • 然後是邏輯運算子 && 和 ||。
  • 最後是賦值運算子。

如果我們希望某個運算具有更高的優先順序,應該使用分組運算子,它是一對圓括號:()

在程式設計中,我們必須非常小心運算子優先順序,否則會導致錯誤。如有疑問,建議使用分組運算子。

什麼是運算子結合性?

[編輯 | 編輯原始碼]

考慮語句 my_number ← 3 * 2 + 5 * 6。3 * 2 和 5 * 6 具有相同的優先順序,那麼哪個應該先執行?這可以透過運算子結合性來回答。結合性也各不相同,但賦值運算子的結合性幾乎總是從右到左。因此,x ← x + 3 將在加法運算首先執行時向 x 加 3。

呼叫子程式

[編輯 | 編輯原始碼]

子程式是執行特定任務的較小程式。為了工作,父程式應該向子程式提供或“傳遞”一些資料。子程式具有一系列引數,它們將引數傳遞給子程式。一些子程式有返回值;另一些則沒有。在某些語言(包括 Pascal)中,過程是不返回值的子程式,而函式是返回值的子程式。在其他語言中,函式和子程式是相同的。

例如,如果您有使用電子表格的經驗,您一定使用過 SUM(<單元格區域>) 函式。SUM 是一個只有一個引數的子程式。我們傳遞給子程式的單元格區域是一個引數。該函式返回一個值,即單元格的總和。(注意:所有電子表格函式都返回值。)

為了說明,我們首先建立一個沒有返回值的子程式,然後建立一個有返回值的子程式。

華夏公益教科書