第二章 顺序结构程序设计
计算机中进行的各种运算都是由语句来实现的,一个完善的PASCAL程序是由若干语句组成的,一个语句相当于若干条指令,因此正确使用语句的功能来达到预期的目的,是程序设计的关键。
§.2.1
PASCAL语言的语句
PASCAL语句分为两大类:基本语句和构造语句
语句
说明:
1.
基本语句是一个简单的语句,在这类语句中不包括另一个句 .
例:a=3;
Write(a);
2.
复合语句是功能较强的语句,在复合语句中还可以包含另一个语句或若干个语句。这一组语句用begin开头,end结束。
Begin
t:=a;
a:=b
b:=t
end.
3.
空语句不使计算机产生任何操作,语句中是空白的,不包括任何内容。
例:a:=10;
;
b:=20;
一般情况用不到空语句,在流程转移时往往会用到空语句,作为转向的终点,仅仅起一个过渡的作用。
Begin
![]()
goto
30;
![]()
30:
end.
4.
§2.2 赋值语句。
它是最简单而又最常用的基本语句,作用是对一个变量赋以确定的值。
2.2.1赋值语句的格式:
格式: 变量:=表达式
例: s:=pi*sqr(r)
d:=0
2.2.2 赋值语句的特征.
1)
“:=”称为赋值号,它的作用是将赋值号右边表达式的值赋给赋值号左边的变量.不能与“=”等号混淆,且它只能在赋值语句中才能用赋值号。
[例]:const
pi:=3.14159
![]()
begin
![]()
s:=pi*sqr(r);
all:=all+s;
n:=n+1;
if n=100 then write(all);
2)
赋值语句的执行是:“计算(表达式的值),后赋值”赋值语句具有计算和赋值的双重功能。
[例]:s:=pi*sqr(r)
3)
赋值的类型要求,即赋值的相容性。在赋值语句中,一般要求赋值号两边的数据类型相同。
[例] 书P19-20
4)
赋值语句只能将一个确定的值赋值给一个变量,而不将一个未知数赋给一个变量。
在数学上,由于:y=x x=z ∴y=z.
在写上面的式子时,x、y、z的值都可以是未知的,这此等式只反映两个变量间的某种关系,而PASCAL中的赋值语句的执行结果。是将一个确定的值
放到内存中该变量所村识的存储单元中去,显然,不能将另一个变量名放到一个数值变量中去,而只能将一个数值放到该变量所标识的存储单元中去。这是一些初学者都容易弄不清楚之处,不要把已赋值语句与代数运算混淆。
[例]:指出下面程序段的错误:
program
smple(output);
var
x,y,z:integer;
begin
x:=0
z:=x+y;
write(z)
end.
§
2.3 输入语句
2.3.1格式
输入语句的作用是读一个数据并把它赋给一个变量。
有两种形式:
read(变量表);
readln(变量表
)
2.3.2
在设计数据输入时应考几个问题:
1)
数据来源。
即是从哪个外部设备输入
一般系统用input参数表示指定数据由键盘输入。
2)输入哪些数据,以及这些数据的类型。
[例]:![]()
var
a,b,c=red;
begin
![]()
read (a,b,c);
3)据如何分隔。
在输入时,两个数据之间可以用一个或多个空格分隔,有的系统也可以用逗号分隔。
[例] 1.0 5.0 8.0
也可以为1 5 8
4)每次输入以一个“数据行”为最小单位,一个数据行可以包含一个或多个数据,以打入一个“回车”
[例]:
1.0 5.0
8若不回车,则数据并没有输入。
2.3.3
read语句和readln语句
有两种读语句:read和readln。
1.
read语句是一个接一个地读数据。
Readln语句是读完后换行,下一个语句从另一个数据行中取数据。
[例]
read(a,b); readln(a,b);
read(c,d);
readln(c,d);
read(e);
readln(e);
若输入数据如下:
1 2 3
4 5 6
7 8 9
10
11 12
产生结果分别为:
a=1,b=2
a=1 b=2
c=3
d=4
c=7 d=8
e=5
e=11
2.
如果一个数据行中的数据不足以供应读语句中的变量读数,则接着从下一个数据行读数。
[例] read(a,b,c);
readln(a,b,c);
read(d,e,f);
readln(d,e,f);
read(g);
readln(g);
若输入数据如下:
1
2
3 4 5
6
7
8 9
产生结果分别为:
a=1
b=2 c=3
a=1 b=2 c=3
d=4 e=5 f=6
d=7 e=8 f=9
g=7
g=10
3.
read语句必须有输入项,而readln语句可以没有任何输入项。
即read(变量表);√ read;×
readln;√
redln的作用是执行一个换行动作.
[例].
readln(a,);
readln;
readln(g);
若输入数据如下:
1
2 3
4 5
6
7 8
9
产生结果分别为:
a=1
b=7
§
2.4输出语句
2.4.1输出语句的格式:
write(输出项)或
writeln(输出项)
注:①输出项可以有一个或若干个;
②输出项可以是常量、变量、表达式。
例:
write(‘how do you
do’)—字符串常量
write(2,3,4)—数值常量
write(x,y)—变量
write(i*j*sqr(t))—表达式
2.4.2.write语句writeln语句
这两个语句大体上相同,只在输出的格式上略有差别。
1.
write语句将输出项一项一项地输出,在执行完本语句后,输出并不换行,
例
write(a)
write(b)
2 4 6
write(c)
writeln语句将输出项一项一项地输出,在执行完本语句后,输出换一行,即自动换行到下一行的开头。
例
writeln(a)
2
writeln(b)
4
writeln(c) 6
2.
write语句必须有输入项,而writeln语句可以缺省。
例
write(t,u,v);
writeln;
---表示输出一个空行。
write(a); 2
writeln;
writeln(b)
4
writeln(c) 6
2.4.3输出格式
:
1
.标准场宽输出
场宽—输出一个数据所占的列数,即数据所占字符的个数。
标准场宽即是系统会将输出的数据按隐含的预先规定好的格式输出,每一种PASCAL版本给出的标准场宽不尽相同。
TURBO
PASCALR的标准场宽如下:
例:write(‘square root of’,a,’ is’sqrt(a))
若a为整型75。
输出为:square root of 75 is
8.6602540379e+00
2.指定场宽
(1).单场宽。
格式:writeln,write(输出项:场宽);
用户可以根据需要指定输出项的场宽。
例:write(‘square root of’:17,a:3’is’,5,sqrt(a))
输出为: square root of
75 is 8.660E+00
一般说来若指定实数的单元宽,则科学计数法中数字部分的位数由下式决定:
数字长度=指定场宽-4-指数位数
例:如上例中。
Write(sqrt(a):10)
输出应为:10-4-2=4个数字位
∴为: 8.660E+00
注:①在输出时,若输出项的数据位数小于指定的场宽,则数据向右对齐,前补空格。
②若输出项的数据位数大于指定的场宽,则系统自动将场宽调整到与实际位数相同,以保证数据能正确、有效地输出。
例:write(sqrt(a):6)
l输出为:
8.6E+00
(2).双
场宽。
格式:writeln,write(输出项:场宽1:场宽2);
注:①输出项必须是实型的数据,且小数形式表示.
②场宽1表示指定整个数据所占的总宽度,场宽2表示指定输出
实数的小数位数.
例:write(sqrt(75):10:4)
输出为: 8.6602.
第三章
program function Y(input, output);
var
y,x,a:real;
begin
writeln(‘input
a and x:’);
readln(a,x);
if
(x<=-a)
then y:=0;
if
(x>-a)and(x<=-a/2)
Then y:=sqrt(a*a-x*x);
If
(x>a/2)
then y:=x;
Writeln (‘a=’a,’x=’,x,’y=’,y)
end.
例四:输入三个整数,放在a,b,c三个变量中,然后把这三个数按由小到大的顺序放在a,b,c中
program
order3(input, output);
var
a,b,c,t:integer;
begin
writeln(‘input
a ,b,c:’)
readln(a,b,c);
Writeln
(‘a=’a:5,’b=’,b:5,’c=’,c:5)
if
a>b
then begin t:=a,a:=b;b:=t end;
if
a>c
Then begin t:=b,a:=c;c:=t end;
If
b>c
then begin t:=b,b:=c;c:=t end;
Writeln
(a:4,b:4,c:4)
end
§
3.2 IF语句的嵌套
在IF语句的语法图中,出现在THEN之后的语句,同样可以是TF语句,这种情况称为IF语句的嵌套.
3.2.1嵌套中ELSE的配对规则.
可写出以下程序:
Program signofx(input, output);
Var
y,x:read;
Begin
Writeln (‘input x:’);
Readln (x);
If x>
0
Then
Y:=1
Else
If x=0
Then y: =0
Else y: =-1;
writeln(‘x=’,x,’y:=’,y)
End.
虚线框中是内嵌的IF 语句,请注意,最后一个分号既标致9内层IF语句的结束又标志着整个外层IF语句的结束,这个内嵌IF语句是嵌套在外层的ELSE子句中的。其流程见下图,也可以改写为:
If
x>=0
Then
IF x>0
Then y:=1
Else y:=0
ELSE
Y:=-1;
内嵌的IF语句是嵌套在外层的THEN子句中,其流程见下图(B)。

能否将它改写为:
y:=0;
IF x>=0
THEN
IF x>0
THEN y:=1
ELSE
Y:=-1;
编写人企图用它来实现图(C)流程;然后实际上去为图(D)流程。

问题出在THEN和ELSE的配套关系上。PASCAL规定:ELSE与它上面的距离最近的THEN配对。它与书上写程序时采用的缩进方式无关。
因此在使用嵌套的IF语句时要十分小心,防止出现逻辑上的错误。上例中若要实现原意,则可在内层的IF语句的ELSE的分支中加入空语句来实现。
根据IF语句嵌入的真假分支的不同,可分为以下两类:
3.2.2 IF语句嵌套在THEN子句中。
IF 布尔表达式1
IF 布尔表达式2
THEN
IF 布尔表达式3
THEN 语句31
ELSE 语句32
ELSE
语句22
ELSE
语句12;
即在外层的THEN子句内嵌入内层IF语句。
注:若内层的IF语句缺少ELSE分支时,为了避免语音逻辑上的混乱,常用以下两种解决方法:
①.
将内层的IF语句用BEGIN……ELSE括起来:
THEN
BEGIN
IF(布尔表达式2),THEN (语句21)