跳转到内容

维基少儿:儿童编程/输入、输出和过程

来自维基教科书,开放的书籍,开放的世界
维基少儿:儿童编程
变量和数据类型 输入、输出和过程 选择

在上一章中,我们用自己的值初始化了变量。如果我们想让用户输入她自己的值怎么办?如果我们想用它做点什么怎么办?

输入和输出

[编辑 | 编辑源代码]

有两种方法可以接收输入。第一种是从外部文本文件(例如 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 是一个只有一个参数的子程序。我们传递给子程序的单元格区域是一个参数。该函数返回一个值,即单元格的总和。(注意:所有电子表格函数都返回值。)

为了说明,我们首先创建一个没有返回值的子程序,然后创建一个有返回值的子程序。

华夏公益教科书