【程序设计】1.2 [做算术] 变量和语句

1.2 变量和语句

我们知道圆的面积 S=πr2。我们来写一段代码,给定圆的半径,计算出它的面积,π就简单取成 3.14 了。


A

1

5

2

=3.14*A1*A1

执行,看 A2 的值,计算出半径为 5 的圆的面积。

如果我们想换一个圆,比如想计算半径为 7.8 的圆的面积,只要把 A1 格的内容改成 7.8,然后再执行,再看 A2,就是新的圆面积了。

这看起来还没 Excel 方便,Excel 还会填了新数就自动算。不过,这不是我们关注的重点,现在麻烦就麻烦一点了。

我们观察 A2 格里的表达式,和上一节里的表达式不一样,这个表达式里有了 A1,不再完全用数值构成。在计算时它会引用 A1 里的值,而 A1 的值发生变化后再计算时就会使用新的 A1 值了。也就是说,在表达式里可以用单元格的名字来引用它的值。

熟悉 Excel 的同学理解这些没有任何困难。

在程序语言中,我们把这些有了名字的数据称为变量,就像这里的 A1,其实 A2 也是个变量,我们在 A3 里继续写 =A2*4,就可以计算以 A1 为半径的球的面积。当然 A3 也是变量,这个网格里所有的单元格都是变量。

有了变量之后,我们可以在计算表达式中引用变量名称,当变量值改过后重新计算表达式就能得到新的结果。这样,要计算多个模式一致的表达式时只需要写一遍了,即省事又能避免出错,计算机就是擅长帮助我们做这些重复的劳动。

不过,这个本事 Excel 也有。

既然叫变量,那这些值应该是可以变的吧?

是的,在程序中,变量的值确实可以变,看这段代码:


A

1

5

2

=3.14*A1*A1

3

>A1=7.8

4

=3.14*A1*A1

A2 和 A4 的表达式相同,但执行完后的值却不同。因为在执行 A3 时把 A1 的值改成了 7.8,再计算 A4 时就会用 7.8 作为 A1 的值来计算了。A1 的值在执行 A3 时改变了。

这和 Excel 不一样了,Excel 不能在某个格子写个公式去修改另一个格子的值。

A3 中的代码是以 > 开头的,不像上一节都是 = 开头的。在 SPL 中,= 开头的单元格称为计算格,> 开头的称为执行格。计算格将计算 = 后面的表达式,把结果填入当前单元格。而执行格将执行 > 后面的动作,并不会给当前单元格填入任何值。上面代码执行完后,再看 A3 的值仍然是空的。

而这段代码中的 A1 格,前面即没有 = 也没有 >,在 SPL 中称为常数格,用来定义常数

很多程序语言中都有常量的概念,可以理解为给常数起了个名字。与变量不同,常量的值是一经设定后在程序运行过程中就不能再改变了,也可以理解为只能一次性赋值的变量。引入常量概念主要是为了避免代码写错把不该改变的变量给改变了。

不过,SPL 没有严格的常量概念,上面那个常数格 A1,其值可以被其它执行格改变。

常规的程序语言是写成文本的样子,也就是一句一句的,早期程序语言的句子形式更为明显。每一句都会对应一件要执行的动作,我们称这些句子为程序语句,一段程序就是由一系列语句组成的。

SPL 没有明显的句子形式,但可以把一个单元格理解为一条语句。这里的计算格、执行格都可以认为是一条语句。

在大多数程序语言中,需要人为给变量起名字,SPL 也支持这种写法,比如下面的代码:


A

1

>r=5

2

=3.14*r*r

3

>r=7.8

4

=3.14*r*r

这里没有再用 A1,而是字母 r 作为变量名,计算结果是一样的。

同时,注意观察界面的右下角,会显示出这个变量 r 的值。
imagepng

人为给变量起名字的好处在于,可以给变量赋予一个有意义的名字,这样不容易忘记或混淆,比如这里我们用 r 表示半径,和圆面积公式是一样的。

但有时候,有些变量就是临时用来存储一个中间结果,不需要起个多有意义的名字,但胡乱起的名字又可能重复而冲突了。在 SPL 中,这时就可以使用单元格来充当变量名了,这也是使用网格而不是文本来写代码的一个小好处。

比如,我们有 a 和 b 两个变量,我们希望交换这两个变量的值。常规的写法是这样:


A

1

>a=5

2

>b=3

3

>c=a

4

>a=b

5

>b=c

需要新定义一个变量 c 出来,也可以用格名来做:

A

1

>a=5

2

>b=3

3

=a

4

>a=b

5

>b=A3

和 Excel 类似,在 SPL 中用单元格作为变量名时,如果插入删除了行列,表达式中引用的格名会自动变化,不会出现错误。也同样和 Excel 类似,可以使用 $ 符号固定单元格的行列,在插入删除行列时就不会变了。可以自己尝试一下。

另外,编辑菜单上还有一些命令及其快捷键可以尝试一下,熟悉之后就会发现在网格中编写代码比文本更方便。

还要顺便提一句,SPL 是一种大小写敏感的程序语言,也就是说,r 和 R 是不一样的。其中用作变量的单元格必须用大写,A1 是格子变量,a1 就不是了,而只是个普通变量。有些程序语言是大小写不敏感的,写成 r 和 R 都没有区别,这在学习时需要注意。

可以用来作为变量名称的符号,通常是由字母和数字构成,并且不能以数字开头,还可以用下划线(这东西经常被当成字母,可以用在开头)。在 SPL 中,还可以使用汉字。这些能用作变量名的符号,有个术语叫作标识符

我们前面说过,数据是有类型的,那么变量是不是也有数据类型呢?

这里有两大类程序设计语言,一类称为强类型语言,类似 Java、C/C++ 等,在这些语言中使用变量必须先说明这个变量的数据类型,比如变量 x 被声明是整数类型,那它就不能用来存储浮点数,一定要赋值为浮点数,会被强制转换成整数(丢失信息)。而 SPL 这种程序语言是弱类型的,使用变量时不需要声明类型,计算出来是什么样类型就是什么类型。

看起来弱类型语言要更方便?

从使用上讲是这样的,但强类型语言因为事先知道变量的数据类型,计算机在执行之前就知道如何存储它,这样能获得更好的运算性能。而弱类型语言只能等计算出结果再来临时决定如何存储,运算性能就会差一截了。

这世界上没有什么都好的事情。

我们再来看圆面积公式 S=πr2,它实际上是一个等式,告诉我们圆面积 S 和πr2是相等的。事实上,我们把它反过来写成πr2=S,表示的意思也是一样的。

现在我们把这个公式写成用来计算圆面积的 SPL 语句:

>S=3.14*r*r

那它是不是也表示一个等式呢?

不是!

程序语言中,把计算结果填入一个变量的语句称为赋值语句。它是一个动作,而不是一个等式,这和数学上的等式完全不同。它不能反过来写成

>3.14*r*r=S

这种写法没有意义,计算机会报个错误出来。

赋值语句的意思是,把 = 右边的表达式计算出来,然后填入 = 左边的变量中。在计算 = 右边表达式的时候,并不关心 = 左边是什么变量,计算完了再去找这个变量把值填入。

这样,我们可以写出在数学上不可能成立的等式,但却是非常常见的赋值语句:

>X=X+1

它的意思是把当前 X 的值加 1 后再填入 X,如果执行这条语句之前 X 是 3,那么执行完之后 X 就会变成 4 了。

理解 X=X+1 后,大概才算是理解变量这个概念了。这可以算是学习程序设计的第一个小门槛,也是 Excel 里没有的东西了。

再看这段代码:


A

1

>a=5

2

>b=3

3

>a=a+b

4

>b=a-b

5

>a=a-b

自己试试,反复改变 a 和 b 开始的值再执行,看看最后 a,b 分别会是什么。猜测出结论后再运用前面理解的变量赋值原理来证明你的猜想。

早期计算机的内存很小,能少用一个变量就能少占用一点存储容量,于是程序员们想出这种丧心病狂的代码。

【程序设计】 前言及目录
【程序设计】1.1 [做算术] 数据
【程序设计】1.3 [做算术] 函数