资源描述
第四课 顺序结构程序设计
4.1 赋值语句
4.2 读语句
4.3 写语句
4.4 文件操作
4.5练习与作业
4.1 赋值语句
PASCAL有两个语句可以改变变量的值。赋值语句是其中之一(另一个是读语句)。
赋值,顾名思义,就是把一个值赋予某个量。可以这理解:变量相当于装东西的容器,赋值的过程就是把东西放进容器的过程。
赋值语句语法格式如下:
变量:=表达式;
语法说明:
1、 赋值号“:=”
赋值号由两个字符构成,是一个运算符。如果把这两个字符拆开,那么这两个字符就是别的意思了:“:”是分隔符而“=”是关系运算符,判定两个对象是否相等。刚刚写程序的同学要特别注意这一点。
例:a,b:integer;——是一个说明语句。“:”是变量表和变量类型的分隔符
a=b——是一个表达式。它的值是一个布尔类型的量:TRUE或FALSE
a:=3;——是一个语句。把整型常量值3赋给整型变量a
2、变量要先说明
在赋值号左边出现的变量,要在程序头的说明部分先加以说明(即先向内存申请相应的存储单元),否则编译时出错。
3、 表达式必须要有确定的值
赋值号右边出现的表达式,可以是一个常量、常量标识符、一个变量、一个函数或一个带运算符的运算式。
当是一个变量时必须是已经赋过值的变量。
当是一个运算式时必须是可以求值的运算式。也就是说,经过运算之后,能得出一个具体的、确定的值出来。大家想一想,如果连表达式自己都不知道自己的值是多少,怎么还能把值“赋予”别人呢?
4、 一个赋值语句只能给一个变量赋值。有多少个变量需要赋值,就要写多少个赋值语句。以下书写形式是错误的:
a:=b:=1;
a,b,c:=2;
2:=a;
但是 a:=b 是否正确要看你的程序目的,当是把b的值转赋给a时,是正确的,当你是要把a的值转赋给b时,就是错误的。
5、 一个变量可以在程序的不同地方(程序运行的不同时刻)对同一个变量赋不同的值(即变量可以反复、重复赋值),但一个时刻只能保存一个值。因此,当需要对一个变量重新赋值时,必须保证该变量中原来保存的值已经不需要了,否则,一定要另使用其它变量或者将该变量中原来的值进行转存。
6、 累加器、累乘器、计数器变量需要先赋初值。
7、 赋值号两边的数据类型必须相同或相容
我们知道,PASCAL中的量不管是变量还是常量都有一个属性称为“数据类型”。数据类型相同的或相容的才可以相互赋值。
先理解数据类型相同:打个比方,我们沏茶用的是茶杯,装饭时用饭碗。如果用饭碗来泡功夫茶,用小茶杯来装饭,那是不可行的。回到PASCAL中来,赋值号左边变量如果是整型,右边表达式的值的类型也要是整型;赋值号左边变量如果是字符型,右边表达式的值的类型也要是字符型……否则的话,也要出错了。这是数据类型相同的情况。
对于数据类型相容的,我们也可以用一个例子来帮助理解。我们都喝过茶,也喝过大杯茶。把小茶杯茶倒在大茶杯里,一般不会出什么问题;但如果把大杯里的茶倒在小茶杯里呢?可能小茶杯装不下大茶杯里的茶,茶“溢出”了。在PASCAL中也会出现这种情况。当一种数据类型的取值范围包含着另一种数据类型的取值范围时,就可能出现类型相容的情况。
如:整型与长整型、短整型和整型、字符型和字符串型等,后者可以包容前者。即把前者的值赋给后者的变量是可以的,但是,如果把后者的值赋给前者的变量就会溢出。
另注意:整型的值赋给实型的变量是相容的,反之把实型的值赋给整型的变量就不相容,编译时会通不过而报错。
因些,我们在写赋值语句时,要注意两边的类型是否匹配。这一点初学者经常会犯错误。
例:有程序如下:
var a,b:integer;
c:real;
d: longint;
begin
a:=100;
b:=a; {-------------以上是相同数据类型进行赋值}
d:=100;
d:=b;
c: =d;
c:=b; {-------------以上是相容数据类型进行赋值}
b:=d;
a:=c;
d: =c; {----------以上两个赋值语句都出现溢出,编译时出错}
end.
练习:1、编写一个程序,将a,b两个变量中保存的值相互交换。
4.2读语句
读语句(read语句)和赋值语句一样,能够改变变量的值。
与赋值语句不同,读语句从键盘或文件接收值赋予变量,而赋值语句则直接由程序语句获得。读语句是编程中用得最多的语句之一。
读语句语法格式如下:
read(变量名表); I型
readln(变量名表); II型
readln; III型
语法说明:
1、read是关键字,是读语句语句定义符,和赋值语句没有语句定义符不同。
2、和赋值语句不同,一条read语句中,可以多个变量一起获得值。
3、读语句一般处于程序的开始部分,用于获得程序运行需要的原始数据。
4、变量名表:(a,b,c,……)
(1)写在括号中的变量,都要在变量说明中先预以说明。
(2)变量与变量之间,以“,”分隔。
(3)变量表只能出现已说明的各类型变量的变量名,不能出现表达式、常量等其它形式的东西。
例:
var a,b:integer;
begin
read(a,b);
……
end.
var a,b:integer;
c,d:real;
t:boolean;
s:char;
begin
readln(a,b,t,s,c,d);
……;
end.
以上形式的读语句使用都是合法的。
找出以下读语句中的错误:
(1) read(a;b;c);
(2) read(a,a+b,c);
(3) read(a,b,2);
(4) read(a,a>b,c);
5、读语句执行过程:
(1)当程序执行到一条读语句时,程序暂停。
(2)自动打开数据输入设备。(默认为键盘,也可以通过配合其它语句和命令指向磁盘文件)
(3)从数据输入设备中按顺序读入各个常量,再按顺序转赋给变量表中的各个变量。
(注意:1、如果输入设备读入的常量类型顺序与变量表中变量类型顺序不相同或相容,程序将拒绝运行并报错。
2、 如果输入设备读入的常量个数少于变量表中变量个数,程序将继续处于暂停状态,等待数据的继续输入)
(4)当键盘作为输入设备时,每一行数据(一行可以一个,也可以多个)输好后必须按回车键才能将数据送入程序。
(5)当程序接收到足够的常量并转赋给相应变量后,程序继续运行。
6、从键盘输入数据时,因为一行可以输入多个常量,要注意各种不同数据类型常量的分隔符不同。所谓分隔符就是两个完整的数值之间的标记,也可以这样理解,当计算机从键盘读入数据时,一旦碰到分隔符,就认为当前的数据读入已完成,接下来读入的将是下一个常量。各种数据类型的分隔符如下:
数值型(包括整型、实型):以空格或回车符作为分隔符;
字符型:不需分隔符(因为字符型数据的长度固定,只有一个);
字符串:以回车符作为分隔符。
7、键盘或文件输入值时,只能是各种类型的常量,绝不能是表达式。
如:read(a); 输入时的值是:1+2、1/2、b等都是非法的。
8、read与readln的区别
当程序从输入设备读入数据时,会自动建立一个读入数据指针。程序一开始时,读入数据指针默认初始位置为第一行的行首,读语句将读入指针所指向的数据,并随着数据的读入操作,数据读入指针移动。
读入数据指针默认的移动方式:读入指针当前指向的数据,然后指针自动向后移动一个位置,指向下一个数据。如果当前数据所在行后面已经没有数据,则指针移动到下一行行首,指向下一行的第一个数据。
Read语句:除了变量表中的数据读入后指针按默认方式移动,读完变量表中最后一个变量的数据后,仍然按默认方式移动指针,即最后一个数据读完后,指针仍移动到指向下一个数据,程序中如果再遇到read语句,将自动从下一个开始读入。
Readln语句:在读入变量表所需的数据时,指针按默认方式移动,但是最后一个所需数据读入后,不论本行后面有没有其它数据,指针都移动到下一行行首。
例:有两段程序有相同的变量说明如下,不同的读语句,我们可以通过比较它们执行结果的异同来理解read与readln的区别。
变量说明
var a,b,c,d:integer;
执行结果
a
b
c
d
程序段一
read(a);
readln(b,c);
read(d);
1
2
3
6
程序段二
readln(a);
read(b,c);
read(d)
1
6
7
8
输入数据
1 2 3 4 5
6 7 8
4.3写语句
写(write)语句是Pascal中唯一能将运算结果送出到数据输出设备上(默认是显示器屏幕,和read语句相同,也可以向磁盘文件中写入数据)的语句。
语法格式:
write(输出列表); {输出后不换行}
writeln(输出列表); {输出后换行}
writeln; {输出一个回车符}
语法说明:
1、输出列表由一个或若干个输出项组成,如果是多个输出项,每个输出项之间用“,”隔开。例如:(‘a+b=’,a+b,c,c+10)
输出时,如果输出项是常量,则直接输出常量本身。
如果输出项是变量,则输出变量的值(不是变量标识符本身)。
如果输出项是表达式,则先计算表达式的值,再输出其值。
如果输出项是字符型常量或变量,则输出字符本身或字符型变量的值。
如果输出项是用一对单引号括起来的字符串,则输出字符串本身(不含单引号)。
3、 输出项由一个表达式或一个表达式加上格式符号组成:
表达式:可以是一个常量,也可以是一个变量,也可以是由常量、变量、运算符、括号组成。
格式符号:控制输出内容的宽度(即所占字符位置数),又称为场宽。
场宽分为标准场宽和自定义场宽,如果输出项中没有格式符号,则按照标准场宽输出,如果有格式符号,按格式符号规定的自定义场宽输出。
标准场宽:系统规定的默认场宽。标准如下:
整型:实际所占宽度。即该整数有几位数,就分配给几个位置
例如:write(123); 输出:123
Write(123,456); 输出:123456
实型:24位科学计数法形式输出。
例如:write(111.2); 输出:1.1120000000000000E+0002
上式输出意思:1.112×102
字符型:1个位置
字符串:有多少个字符分配多少个位置
布尔型:true给4个位置,false给5个位置。
(注:上例中write(123,456)可以用write(123,’ ’,456)方式分开)
自定义场宽:人为规定输出内容所占宽度,如果所规定的宽度大于实际需要的宽度,则向右看齐输出,即空格留在输出内容的左边;如果所规定的宽度小于实际输出所需要的宽度,则按实际所需要宽度输出。
整型:表达式:表达式。 前面表达式是需要输出的内容,后面表达式是规定输出结果所占宽度的。
1
2
3
例如:write(123:5); 结果:
1
2
3
write(123:2); 结果:
实型:表达式:表达式:表达式 第一个表达式是需要输出的内容,第二个表达式是输出结果一共占几个位置,第三个表达式是其中小数位所占的位置宽度。
例如:write(1234.5678:12:5)
1
2
3
4
.
5
6
7
8
0
结果:
write(1234.5678:10:2)
1
2
3
4
.
5
7
结果:
特点:(1)向右看齐
(2)小数点占一位
(3)小数部分位数不足补零
(4)小数部分位数过多四舍五入。
例1:输出多个空格。
write('':n);句子的意思是以n个字符宽度输出冒号前数据项,如果数据项长度不足n,则前面以空格补齐;如果数据项长度大于n,则以实际长度输出。如上语句句输出n个空格。
例2:数据项间隔。
输出最多四位的数据:write(x:5)。则数据间至少分隔一个空格。
例3:分别输出整型变量a,b的值,两个值之间空一个空格。
write(a,‘ ‘,b)
例4:输出61.8的四舍五入结果
4.4 文件操作:
读语句和写语句都可以将输入设备或输出设备定向到磁盘文件中去,信息学竞赛由于采用机器自动阅卷,因此,我们的程序必须能打开试题指定的磁盘文件作为输入设备,并从中读取程序运行所需的初始数据,程序运行结束时,创建另一磁盘文件作为输出设备,并向文件中写入程序运行结果。
1、 文件变量:程序中用来代替磁盘文件名的自定义标识符。必须先说明,后使用。
var inf,outf:text; text是文件变量的类型名。
2、 文件变量与磁盘文件名的链接
assign(inf,’试题名.in’); assign(outf,’试题名.out’)
3、 文件的打开:
(1)读方式打开:reset(inf); 读方式打开的磁盘文件只能从中读取数据,不能向其中写入数据,即只能作为数据读入设备。Inf所链接的文件打开后,数据读入指针指向第一行的第一个数据项。
(2)写方式打开:rewrite(outf);写方式打开的磁盘文件只能向其中写入数据,不能从中读取数据,即只能作为数据输出设备使用,outf所链接的文件打开后,写入数据指针指向文件的第一行第一列。想一想:为什么一个程序中对一个文件只能用rewrite方式打开一次?
以写方式打开时还有另一个功能,如果磁盘中没有outf所链接的磁盘文件,程序将自动新创建一个该文件并打开。
4、文件关闭:close(inf); close(outf);
文件被关闭时,输入文件的数据读入指针清零;
输出文件的磁盘缓冲区中数据写入磁盘文件。
同时,除非程序再次打开文件,否则程序不能再从文件中读入数据或写入数据。
注意:输出文件在程序结束前必须关闭,否则,写语句写入的数据仍暂存
在磁盘缓冲区内而没有真正进入磁盘文件(这是计算机的工作原
理),磁盘文件仍然是空的。
5、从文件中读入数据:在保证inf文件已被打开的前提下,在read语句中加入设备名
(即文件变量名)。
例如:read(inf,n); 程序将以inf所链接的磁盘文件作为输入设备,从磁盘文件中读取变量n的数据。而不再需要用键盘输入数据并回车了。
6、向文件中写入数据:在保证outf文件已被打开的前提下,在write语句中加入设备名(文件变量名)。
例如:write(outf,m); 程序向outf所链接的磁盘文件中写入m的值。
writeln(outf); 程序向outf所链接的磁盘文件中输出一个换行。
7、 文件操作标程:
program abc;
var i,j,k,l,m,n:integer;
a,b,c:real;
s:string;
s1,s2:char;
inf,outf:text; //说明两个文件变量,(一般程序只需两个)
begin
assign(inf,’abc.in’);assign(outf,’abc.out’);
//将变量inf与磁盘文件abc.in进行链接
//将变量outf与磁盘文件abc.out进行链接
reset(inf);rewrite(outf);
//读方式打开inf文件,写方式创建outf文件
read(inf,m,n); //从inf文件中读入变量m和n的值
……;
……;
……;
write(outf,a); //将a的值写入到outf文件中
close(outf); //关闭outf文件,即关闭输出文件(outf文
件必须关闭,inf文件一般不用关闭)
end.
以上粗体字部分是我们今后编写程序里必不可少的内容,相当于公式。
8、 创建、修改和查看磁盘文件内容:
(1) 输入文件的创建:
1)菜单file → new → Text → OK建立一个文本文件,并在编辑窗口打开(新文件编辑窗口和程序编辑窗口公用一个窗口,使用窗口上方的标签进行切换)
2)保证编辑窗口切换到新文件,输入所需数据(按题目规定的格式要求)
3)菜单file → Save 或 Ctrl_S或 点击图标,在弹出的对话框中输入
要求的文件名,例如:abc.in,保存该文件。
4)切换编辑窗口到程序文件,运行程序。
(2)输入文件的修改:
1)切换编辑窗口到输入文件,在编辑窗口修改数据。
2)再次保存文件。
3)切换编辑窗口回到程序文件,运行程序。
(3)查看输出文件内容:
1)保证程序至少已运行一次,即输出文件已创建。
2) 菜单 file → Open → 在弹出的列表窗口中选择对应文件,例如:abc.out
3)点击打开,即可在编辑窗口中打开输出文件,同样与程序文件窗口共用一
个窗口,用窗口上面的标签进行切换。
4)输出文件窗口一旦打开,再次运行程序时,会弹出对话框,大意是屏幕上
显示的输出文件已经改变,询问是否从磁盘中重新读取并显示,点击
reload from disk(从磁盘重新载入)即可。
4.5 家庭练习:
1、找出下面程序中的错误:
const pi:=3.14
a:=4;
b=6;
c:=’A’;
var a,b,c,d,e,f:real;
begin
a+1:=3;
b=6
e,f:=7;
g:=true;
c:=d;
2、设有下列语句:
read(a,b,c);
readln(d,e);
readln;
readln(f,g);
其中,所有变量均为整型。
再设输入的数据如下:
1□2←┘
3□4□5□6□7□8←┘
9□10←┘
11←┘
12□13←┘
写出该程序段运行后,各变量的值(“□”表示空格)
3、用不少于10种方法,输出123456。
4、 分别写出下列程序的运行结果(不上机完成)
(1)var a:integer;
b:real;
begin
a:=2;
b:=2;
writeln(b/a);
end.
(2)var a:integer;
b:real;
begin
a:=2;
b:=2;
writeln(a/a);
end.
(3)var a:integer;
b:real;
begin
a:=2;
b:=2;
writeln(a div a);
end.
5、如果 a,b,c的值分别是 2, 4, 6。执行下列语句后, a,b,c的值各是多少?
a:=b;b:=c;c:=a; a=____ b=____ c=____
b:=c;c:=a;a:=b; a=____ b=____ c=____
c:=a;a:=b;b:=c; a=____ b=____ c=____
t:=a;a:=b;b:=c;c:=t; a=____ b=____ c=____
6、写出下列每小段程序的运行结果(只是程序的一部分):
A.write( ‘ * ’ );
write( ‘ * ’ );
write( ‘ * ’ );
write( ‘ * ’ );
B.writeln( ‘ * ’ );
writeln( ‘ * ’ );
writeln( ‘ * ’ );
writeln( ‘ * ’ );
C.write( ‘ * ’ );
writeln;
write( ‘ * ’ );
writeln;
write( ‘ * ’ );
writeln;
write( ‘ * ’ );
writeln;
D.write( ‘’ );
writeln( ‘ * ’ );
write( ‘’ );
writeln( ‘ * ’ );
write( ‘’ );
writeln( ‘ * ’ );
write( ‘’ );
writeln( ‘ * ’ );
以下程序设计习题必须使用文件操作,程序文件名规则:shunxu+题号.扩展名
例如:第一题shunxu1.pas/shunxu1.in/shunxu1.out
1、 用字符输出如下图形:(本题不需要输入文件)
....+---+---+
.../ / /|
..+---+---+ |
./ /| | +
+---+ | |/|
| | +---+ |
| |/| | +
+---+ | |/|
| | +---+ |
| |/ /| +
+---+---+ |/.
| | | +..
| | |/...
+---+---+....
2、输出下面算式:(本题不需要输入文件)
253*43=10879
253
* 43
--------------------
759
+1012
--------------------
10879
3、分别读入一位数、二位数、三位数、四位数,把它们按向左对齐、向右对齐的方式输出出来。每行输出一中方式。
4、输入一个四位整数,把它的各位数字倒序输出。(提示:用MOD和DIV运算完成)
5、读入一个实数,利用ROUND()和TRUNC()函数,输出该实数本身、整数部分、小数部分、四舍五入后的值。
要求:分三行输出 ;输出实数本身时,格式与读入时相同;整数部分、小数部分在同一行输出;其它各占一行。
6、 从键盘上读入长方形的边长a,b,计算它的面积和周长,输出。
7、 输入一个时、分、秒,把它转换为一个秒数。
8、任意输入一个字符,输出这个字符的上一个字符和下一个字符。
9、输入某同学的五门成绩,计算并输出该同学的平均分和总分。(一行一个)
10、已知某梯形的上底A=13,下底B=18,高H=9,求它的面积S。
11.已知某圆的半径R=139,求该圆的周长C与面积S?
12、读入摄氏温度c,写程序将它转换成华氏温度f输出。(已知f=9c/5+32)
13、输入一个三位自然数,把这个数的百位与个位数对调,输出对调后的自然数。
14、键盘输入两个的实数,经过取整操作后,将其整数部分交换值后输出。
15、编一程序,输入三角形的三边a、b、c(假设这三边可以构成一个三角形),求三角形的面积S?
提示:可利用海伦公式 s= ,p=(a+b+c)/2
16、有三个小朋友甲乙丙。甲有50粒糖果,乙有43粒糖果,丙有13粒糖果。现在他们做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余两份分别给乙与丙,多余的糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、丙三人各有书多少粒糖果?
17、某仓库5月1日有粮食100吨,5月2日又调进20吨,5月3日卖出库存的3分之二,5月4日又调进库存的3倍粮食,问该仓库从5月1日到5月4日期间每天的粮食分别是多少吨?(输出每天的库存量)
18、某车棚存有自行车和三轮车共m辆,它们的轮子数合计为n个,求该棚内存有的自行车和三轮车各是多少辆?
19、五位好朋友相聚。第一位朋友带来了很多糖块赠送给各位朋友,使每人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?
20、输入两个整数,输出出小的那个数。
展开阅读全文