维基少儿:儿童编程/输入、输出和过程
在上一章中,我们用自己的值初始化了变量。如果我们想让用户输入她自己的值怎么办?如果我们想用它做点什么怎么办?
有两种方法可以接收输入。第一种是从外部文本文件(例如 JavaScript 中的cookie、ActionScript 中的共享对象,或者仅仅是普通的文本文件)读取输入。第二种是提示用户输入,然后获取值。这可以通过键盘、鼠标、麦克风或其他输入设备完成。
有许多方法可以接收输出。最常见的方法是在屏幕上显示。其他方法包括使用扬声器、打印机等。
为了简单起见,在这本书中,我们将使用 JavaScript 中的弹出窗口和 Pascal 中的控制台。
在我们的伪代码中,我们只是提示用户输入年龄,获取年龄并显示我们的消息。这非常简单,我们的输入/输出方法没有明确说明。
在我们的 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 |
---|---|
|
|
如果我们希望某个运算具有更高的优先级,应该使用分组运算符,它是一对圆括号:()
。
在编程中,我们必须非常小心运算符优先级,否则会导致错误。如有疑问,建议使用分组运算符。
考虑语句 my_number ← 3 * 2 + 5 * 6
。3 * 2 和 5 * 6 具有相同的优先级,那么哪个应该先执行?这可以通过运算符结合性来回答。结合性也各不相同,但赋值运算符的结合性几乎总是从右到左。因此,x ← x + 3 将在加法运算首先执行时向 x 加 3。
子程序是执行特定任务的较小程序。为了工作,父程序应该向子程序提供或“传递”一些数据。子程序具有一系列参数,它们将参数传递给子程序。一些子程序有返回值;另一些则没有。在某些语言(包括 Pascal)中,过程是不返回值的子程序,而函数是返回值的子程序。在其他语言中,函数和子程序是相同的。
例如,如果您有使用电子表格的经验,您一定使用过 SUM(<单元格区域>) 函数。SUM 是一个只有一个参数的子程序。我们传递给子程序的单元格区域是一个参数。该函数返回一个值,即单元格的总和。(注意:所有电子表格函数都返回值。)
为了说明,我们首先创建一个没有返回值的子程序,然后创建一个有返回值的子程序。