2024年1月2日发(作者:)
授课教师:泰州市城东小学周年荣 jstzznr@
第二讲 QB的文件操作
学习重点:
1、了解文件的概念和分类。
2、掌握文件的打开、关闭以及读文件、写文件的方法,并能熟练运用。
3、会创建数据文件测试程序的正确性。
学习过程:
在2004年2月江苏省青少年信息学奥林匹克竞赛委员会发布的“小学组初、复赛命题大纲(试用稿)”中指出:(对于复赛)在适当的时候考虑引入对文件的输入操作。在近几年的程序设计竞赛中,均引入了文件操作的内容,不少学生在竞赛时吃了很大的亏,因此掌握这部分内容,对学生来说尤其重要。
一、文件的概念
文件(file)也叫作文档,是存放在磁盘(包括硬盘、软盘、U盘、光盘)上的一批数据,每个文件必须有一个文件全名,用文件全名来指明文件。文件全名包括盘符、若干级目录、文件名、文件类型。
例如: d:
这里,盘符= d:,而且有三级目录,每个斜线引出一级目录,文件名= data ,每级目录和文件名都不得超8个字符,文件类型=.txt,这是最常见的正文文件类型。
以下的文件名均合法:
C: 代表C盘根目录下的文件。
C: 代表C盘中qb子目录中的文件。
A: 代表A盘中当前目录中的文件。
代表当前盘、当前目录中的文件。
我们知道,计算机的内存容量小,造价高,而且还有一个严重的缺点——易失性,就是说一旦关闭了电源,内存中的全部内容就统统丢失了。为此人们引进了磁盘文件作为内存的补充。
那么文件有什么用途呢?举例说吧,假如你是班级学习委员,编了一个记分的程序。第一天你输入了10个同学的各科成绩,然后你就关机睡觉了。第二天打开机器,你的数据就不翼而飞了,还得从头再来。如果你会使用文件,那就好办了。第一天你键入了一些数据,关机前把它们记入文件,即使关机了文件中的数据也不会丢失,第二天只要让QB打开文件并把其中数据读入到内存,就可以继续输入了。
1
授课教师:泰州市城东小学周年荣 jstzznr@
还有一种情况应该使用文件。如果一个程序需要读取许多数据,若是每次都从键盘敲入,那么既麻烦又容易出错。我们可以把数据做成一个文件,并且让程序读取其中的数据。这样一来程序可能具有更大的灵活性。
按照文件中数据的表现形式来分类,可以将文件分成正文文件和二进制文件。正文文件也叫做ASCII文件,其中的数据都是由ASCII代码构成的,例如我们在QB下编写的BASIC语言源文件(类型为.BAS)。正文文件是人制作的,或者是为人而制作的,是人所能看懂的文件,可以用DOS下的EDIT程序和WINDOWS下的记事本或写字板制作和阅读。二进制文件是由许多二进制位构成的,由一个程序制作,由另一个程序阅读,人看不懂,如果用EDIT、记事本或写字板来阅读的话,会出现一片乱码。例如在QB之下由源文件转换成的可执行文件(类型为.EXE),就是一种二进制文件。
相比之下,正文文件用处更大,足以应付通常的编程工作。我们只介绍正文文件的有关操作,想了解二进制文件可以参看各种QB的教科书。
从计算机内存向外存传送数据,称为“写文件”,即向外存输出数据。将外存文件中的数据向计算机内存传送,称为“读文件”,即将文件读入内存。
在QB中,文件是可读的,也是可写的,但是不能对同一个文件又读又写。
在程序中若想读、写文件数据,须经历三大步骤:打开文件、读/写数据、关闭文件。打开文件完成准备工作,关闭文件完成扫尾工作,而读/写数据完成的才是数据交换工作。
二、打开文件——OPEN语句
1、格式
打开文件要完成一些必要的准备工作,如在目录中找出要读的文件,创建要写的文件,放置文件指针。打开文件使用OPEN语句,其格式为:
OPEN <文件名> FOR <读写方式> AS #<文件号>
其中:文件名可以是字符串常量或字符串变量,指明欲读写的文件。文件名通常采用文件全名,但是如果BASIC程序文件与它要读写的数据文件同在一个目录中,可以省略盘符和各级目录;如果程序文件与数据文件分别存放在同一个磁盘的不同目录中,可以省略盘符。
AS #后的文件号是1-255之间的任意一个整数,OPEN语句将它同文件名字等同起来,在后面的读写语句和关闭语句中只用文件号来指明文件。
读写方式指明了对文件的读写操作可以取以下三种之一:
① INPUT: 读文件,将文件中的数据传送到内存变量。例如:
OPEN “d:” FOR INPUT AS #1
2
授课教师:泰州市城东小学周年荣 jstzznr@
表示打开d:data中的文件,只能从文件读数据,以文件号1代表此文件。在OPEN语句中指定的文件名必须确实已经存在于指定的位置,如果d:data中没有,则认为发生错误,停止程序执行,因为不能从一个不存在的文件中读取数据。打开文件时文件指针指向文件开头,执行读语句时从第一个记录开始顺序读取。
② OUTPUT:写文件,将内存中的数据传送到文件。 例如:
OPEN a$ FOR OUTPUT AS #2
假设已经执行了a$ =“e:”,则打开e:data中的的输出文件,只能向文件写数据,指定该文件的文件号为2。如果e:data中没有,系统以此文件名建立一个新文件;如果文件存在,不论原来是否有数据,打开后,文件指针指向文件开头,原有的数据全部消失,相当于建立一个新文件。以OUTPUT方式打开文件时应十分小心,不要误删除原来文件中有用的数据。
③ APPEND:扩充文件,将在文件后添加新的数据。
OPEN “” FOR APPEND AS #3
表示打开QB系统文件所在目录中的,首先在QB系统文件所在目录中寻找文件,如果找到,把文件指针指向到文件末尾处;如没有找到,建立之,把文件指针指到文件开始处。
注意:如果打开方式是INPUT,那么要打开的文件必须存在,否则出错。对于另两种方式,文件不存在也不是错误,都将导致创建一个新文件,并使文件指针指向文件开始处。若以OUTPUT方式打开的文件已经存在,则清除原有数据,并使文件指针指向文件开始处,因此以OUTPUT方式打开文件时应十分小心,不要误删除原来文件中有用的数据;若以APPEND方式打开的文件已经存在,则文件指针将指向文件末尾,意味着新数据都写在文件原有数据之后。
对一个文件以某种方式打开,则只能对其执行指定的操作,如用OUTPUT打开,就只能把数据从头到尾写到文件中,中间不能“读”,只有关闭后重新以INPUT打开才能读数据。
三、读文件——INPUT #语句、LINE INPUT #语句和EOF函数
所谓读文件就是从文件中取出字符串送入字符串变量,或者转换成数值送入数值变量。使用的语句有INPUT#语句和LINE INPUT#语句,它们分别对应于INPUT语句和LINE INPUT语句。
1、INPUT#语句
一般格式为: INPUT#<文件号>,<变量>[,<变量>] „„
其作用是,从<文件号>所指明的文件中读数据,并把这些数据依次赋给各个3
授课教师:泰州市城东小学周年荣 jstzznr@
指定的变量。一条INPUT#语句至少读入一个数据,变量分为字符串变量和数值变量,因此文件中数据的次序必须同这条语句中的变量次序一致。文件中的字符串数据可以用双引号界定,也可以用逗号或行尾作为结束,哪个先出现哪个起作用;用逗号或行尾结束的字符串不包含逗号和双引号,用双引号界定的字符串不包含双引号本身。而数值数据可以用逗号、空格或行尾作为结束。由于各变量对应的文件中的数据都可以行尾作为结束,所以每一个数据都可以独占一行。在这一点,INPUT#同键盘输入语句INPUT显然不同,一个INPUT语句读取的多个数据必须同处一行。
2、LINE INPUT#语句
格式: LINE INPUT #<文件号>,<字符串变量>
作用是从打开的正文文件中读取一行,赋给指定的字符串变量。正文行上可以包含任何字符,如空格、逗号、双引号。
INPUT # 语句是从文件中逐一读取数据,而LINE INPUT # 语句一次就要读取文件中的一行数据。
3、EOF函数
格式:EOF(<文件号>)
此函数的作用是判断是否已经读完了<文件号>指明的文件中的所有数据,如是得到真值,否则得到假值。也就是说,测试文件是否结束,若结束,返回一个非0值。在程序中可以根据此值决定是否继续读此文件。
例 :
OPEN "" FOR INPUT AS #1 ’打开文件准备读
DO WHILE NOT EOF(1) ’只要未到达文件尾,就继续读
INPUT #1, a$, b, c ’从文件中读出a$, b, c
PRINT a$, b, c ’屏幕显示a$, b, c
LOOP
CLOSE #1 ’关闭文件,以便再次打开
PRINT ’屏幕空一行
OPEN "" FOR INPUT AS #1 ’再次打开准备读
DO WHILE NOT EOF(1) ’只要未到达文件尾,就继续读
LINE INPUT #1, a$ ’用LINE INPUT #语句读一整行
PRINT a$ ’显示该行
LOOP
CLOSE #1 ’关闭1号文件
END
4
授课教师:泰州市城东小学周年荣 jstzznr@
此程序首先打开文件 ,并用INPUT#语句反复读取,每次读取3个数据到变量a$、b、c中,直至读完为止。文件中给出了INPUT#语句允许的各种数据格式。第二次打开文件,而后用LINE INPUT#来读取文件的每一行到a$中,再把它显示到屏幕上。
下面给出了本程序的屏幕输出,其中前4行是第一个循环4次读取的3个变量的内容。注意,如果显示的姓名中夹有逗号,在文件中这样的字符串只能放在双引号中。后6行就是文件本来的样子。
Li ming 15 89.37
Li, ming 15 89.37
Li ming 15 89.37
Li ming 15 89.37
----------------------------------------
Li ming, 15,89.37
"Li, ming"15 89.37
"Li ming",15,89.37
Li ming
15
89.37
四、写文件——PRINT #语句和WRITE #语句
1、PRINT #语句
格式:PRINT #<文件号>,[USING “<格式字符串>”];<输出项表>
功能:写数据到#<文件号> 所关联的文件中。
PRINT#语句的使用与屏幕输出语句PRINT相似,只不过前者把数据写入外存,后者把数据输出在屏幕上。其中的文件号是打开文件时指定的。输出项表由O个或多个表达式组成,它们的值将输出到文件中,如果为空,则在文件中输出一个空行。
在省略格式字符串的情况下,每个表达式后跟有一个逗号或分号,逗号表示采取紧凑格式——数值后留一个空格,分号在输出项之后将跳到下一个14倍数列。最后一个输出项后还可跟有空格,表示输出后换行。输出项可以包括函数TAB(n)和SPC(n),分别表示使输出位置跳到第n列和跳过n列。
如果使用了USING “<格式字符串>”,那么各输出项之间只能用分号隔开。<格式字符串>描写了各个输出项的输出格式,其中的格式字符串可以有一个或几个输出格式,每个输出格式对应于一个输出项。如果输出格式的个数少于输出项,则循环使用各输出格式。每个输出格式由若干格式字符组成,格式字符有数值的和字符串的。
5
授课教师:泰州市城东小学周年荣 jstzznr@
数值格式字符包括:
# 代表一个数值位,如#######表示显示7位整数(包括负数的-号),不足7位左面补之以空格。
. 小数点,如####.###表示显示实数,其中整数部分占7个位置,而后是小数点,最后是3位小数。
, 放在小数点之前,表示用逗号把整数部分分为3位一组。
+ 符号,表示显示数值符号,对于正数显示+,负数显示-。
-放在输出格式的最后,表示把-号显示在负数数值之后。
^^^^放在###...之后,表示要采取指数形式显示,^的个数指明指数占4个位置。
** 放在###...之前,表示数前的空位用*填充。
$$前,表示数前显示一个$。
**$ 放在###...之前,表示数前显示一个$,前空用*填充。
字符串格式字符包括:
& 显示整个字符串。
! 显示字符串的第一个字符。
/n个空格/ 显示字符串的前n+2个字符。
_ 放在格式字符之前,则将此格式字符作为普通字符显示,_ _将显示一个_。
以上格式字符之外的其它字符,如果出现在格式字符串中,将被原样地显示在文件中。例如:
此程序展示了PRINT#和WRITE#语句的用法,特别是格式字符串的作用,下面给出的是本程序所生成的文件的全部内容,请读者对照上面的程序仔细阅a = 1234.567: b = -34.5678: c$ = "abcdefgh"
OPEN "" FOR OUTPUT AS #1
PRINT #1, "1, "; a; b; c$; a
PRINT #1, "2, "; TAB(20); a; SPC(5); b; c$; a
PRINT #1, "3, "; a, b, c$, a
WRITE #1, 4, a, b, c$, a
PRINT #1, USING "5, #####.##|"; a; b
PRINT #1, USING "6, ######^^^^|####.###^^^^^|"; a; b
PRINT #1, USING "7, +#####.#|######.#-|"; a; b; b; a
PRINT #1, USING "8, **#####,.#|$$#####.#|**$#####.#|"; a; a; a
PRINT #1, USING "9, left$(c$,1)=!|c$=&|_!|_&|__| |"; c$; c$; c$;
CLOSE #1
END
6
授课教师:泰州市城东小学周年荣 jstzznr@
读。为便于对照,在每个 PRINT#语句中都显示一个序号,可是在第7个PRINT#语句中由于格式项的个数多于输出项,所以序号也同格式项一起被重复显示了。
1, 1234.567 -34.5678 abcdefgh 1234.567
2, 1234.567 -34.5678 abcdefgh 1234.567
3, 1234.567 -34.5678 abcdefgh 1234.567
4,1234.567,-34.5678,"abcdefgh",1234.567
5, 1234.57|5, -34.57|
6, 12346E-01|-345.678E-001|
7, +1234.6| 34.6-|7, -34.6| 1234.6 |
8, ***1,234.6| $1234.6|***$1234.6|
9, left$(c$,1)=a|c$=abcdefgh|!|&|_|abcd|
2、 WRITE #语句
格式:WRITE #<文件号>,<输出项表列>
用它写文件时能自动地在各数据项之间插入逗号,并给字符串加双引号,且不在正数前面设置空格。用WRITE#语句写成的文件更适合INPUT#语句读取。
例:比较下面两个程序产生的输出文件格式的不同
Open “ex.1”for output as #1
DO
INPUT " NAME: ", Name$
INPUT " AGE: ", Age
WRITE #1, Name$, Age
INPUT "Add another entry"; R$
LOOP WHILE UCASE$(R$) = "Y"
CLOSE #1
Open “ex.2”for output as #1
DO
INPUT " NAME: ", Name$
INPUT " AGE: ", Age
print #1, Name$, Age
INPUT "Add another entry"; R$
LOOP WHILE UCASE$(R$) = "Y"
CLOSE #1
当输入数据同样为:NAME: ccc
AGE: 12
NAME: bbb
AGE: 11
时,ex.1与ex.2两个文件的内容分别为:
3、PRINT和WRITE语句两者的不同点:
PRINT写入到文件中的数据若是字符串,没有引号;
若PRINT有多个输出项,则项与项之间有空格。而WRITE语句若写入到文件中的数据是字符串,会自动添加引号;多个输出项之间会以“,”相隔。
"bbb",11
"ccc",12 ccc 12
Bbb 11
7
授课教师:泰州市城东小学周年荣 jstzznr@
五、关闭文件——CLOSE语句
格式:CLOSE[#<文件号>][,#<文件号>]„„
此语句可以有0个、一个或多个#<文件号>参数,将分别关闭所有的、一个或多个已打开的文件。
关闭文件完成必要的扫尾工作,包括修改目录以反映文件信息的改变,如文件的长度、修改日期。尽管当程序结束时QB能自动关闭尚未关闭的文件,规范的做法仍然是让程序关闭自己打开的所有文件。
六、创建数据文件
创建数据文件用以测试程序的正确性
方法1:使用QB程序产生数据文件
方法2:直接用QB编辑好数据后存盘,扩展名可以自选。
方法3:使用写字板或其他编辑软件写入需要的数据,扩展名一般选“.txt”(常用方法)
例:有一个程序需要30个整数,范围1—100,每行3个数,共10行。我们可以这样来建立符合条件的数据文件“”
Open “” for output as #1
For I=1 to 10
Input a,b,c
Print #1,a,b,c
Next I
Close #1
end
’如果需要的数据是随机的,我们完全可以用随机函数产生a,b,c
a=int(rnd*100)+1:b= int(rnd*100)+1:c=
int(rnd*100)+1}
六、综合示例
下面给出几个综合性的例题:前几个代表了通常涉及文件的习题和试题,最后一个算得上是一个应用实例,功能强,但程序简单,容易修改成真正的应用。
1 1 1 1 1 1 1
【问题描述】
2 2 2 2 2 2 1
从指定文件中读取正整数,m,n,i和j,(1<=i,j<= n
3 3 3 3 3 2 1
<=20),然后计算并显示n阶回形矩阵的第i行第j列元素的4 4 4 4 3 2 1
5 5 5 4 3 2 1
值(右图给出的是7阶回形矩阵)。
6 6 5 4 3 2 1
[输入输出]
7 6 5 4 3 2 1
例1.拐角矩阵
文件输入:(输入文件与QB系统文件处在同一磁盘上)
该文件的第一行为正整数m , 表示下面有m组数据,每组数据均占一行。
每行均有三个正整数n,i和j(以空格分隔)。表示要计算并显示n阶回形矩阵的第i行第j列的元素值。
8
授课教师:泰州市城东小学周年荣 jstzznr@
输入文件样例:
3
7 2 3
7 5 4
7 7 1
屏幕输出:
共有m行,每行只有一个正整数,即根据对应的输入数据计算出的元素值。
对应上面的输入产生如下屏幕输出:
2
4
7
【问题分析】
观察此题中的拐角矩阵,会发现它呈现明显的规律:在从对角线之上显示的是行号i,在其下方显示的是n+1-j。程序要先打开文件,从文件中读取数据组数m。而后在一个执行m次的循环结构中,先读取矩阵尺寸n、行号i和列号j,然后算出位于第i行第j列的元素值k,并显示之。
【程序清单】
REM
OPEN "" FOR INPUT AS #1
INPUT #1, m
FOR I = 1 TO m
INPUT #1, n, i, j
IF i + j <= n + 1 THEN k = i ELSE k = n + 1–j ’判断元素值
PRINT k
NEXT I
CLOSE #1
END
例2.整数的拼接(2006年小学程序设计竞赛第4题)
【问题描述】
设有n个整数(3≤n≤10),将这些整数拼接起来,可以形成一个最大的整数。
例如 n=3, 三个整数分别为21, 7, 34, 拼接后最大的整数为: 73421
[输入输出]
文件输入: 第一行一个整数n ,表示有n 个整数
第二行n个整数,数与数之间用一个逗号分隔。
(10个测试文件在“d:jst2”目录中,文件名为:-)
文件输出:一个拼接后的最大的整数。
(10个输出文件在“d:jst2”目录中,文件名为:-)
【样 例】
9
授课教师:泰州市城东小学周年荣 jstzznr@
输入 输出
3 73421
21,7,34
【问题分析】
题目明确写明输入文件和输出文件的具体目录和文件名,为了节约时间,我们采取常量+变量的方法,只从键盘输入文件名,而不输入目录和文件类型。
【程序清单】
REM
INPUT A$ ’分别输入文件名JS41--JS40
B$="D:JST2"+A$+".OUT" ’产生具体的输出文件名
A$="D:JST2"+A$+".IN" ’产生具体的输入文件名
OPEN A$ FOR INPUT AS #1
OPEN B$ FOR OUTPUT AS#2
INPUT #1, N ’从文件中读入整数N
DIM A$(N)
FOR I = 1 TO N
INPUT #1, A$(I)
NEXT I
FOR I = 1 TO N – 1 ’拼接
FOR J = I + 1 TO N
IF A$(I) + A$(J) < A$(J) + A$(I) THEN SWAP A$(I), A$(J)
NEXT J
NEXT I
FOR I = 1 TO N
PRINT #2,A$(I);
NEXT I
CLOSE
END
练一练:
将此题改为10个测试文件的文件输出内容均在d:文件中。
(提示:用扩充文件方式)
例3.蛇形矩阵(2004年小学信息学奥赛复赛第1题)
【问题描述】
从键盘输入正整数n,i和j ,(1<=i,j<= n <=20),然后计算并显示n阶蛇形矩阵的第i行第j列元素的值 (右图是7阶蛇形矩阵)。
[输入输出]
文件输入:第一行一个整数K ,表示有K组数据;其余每行3个整数N,I,J,表示要计算并显示n阶蛇形矩阵的8 6 5 7 6 2 1
9 7 7 4 8 5 3
9 0 6 8 3 9 4
0 8 1 5 9 2 0
6 1 7 2 4 0 1
7 5 2 6 3 3 1
9 8 4 3 5 4 2
10
授课教师:泰州市城东小学周年荣 jstzznr@
第i行第j列的元素值,数与数之间用空格分隔。
(测试文件在“d:jst3”目录中,文件名为:)
文件输出:
输出到文件(),输出文件和测试文件在同一个目录。每行只有一个正整数,即根据对应的输入数据计算出的元素值。
【样 例】:
输入 输出
5 3
7 3 5 4
7 4 4 4
9 5 6 4
15 9 12 8
20 11 8
【问题分析】
题目明确写明测试文件的具体目录和文件名,可以直接在OPEN后面用具体的字符串常量来指明文件全名。由于输出文件和测试文件在同一个目录中,因此可以省略具体的路径,只指明文件名。
【程序清单】
REM
OPEN "D:" FOR INPUT AS #1
OPEN “” FOR OUTPUT AS #2
INPUT #1, k
FOR l = 1 TO k
INPUT #1, n, i, j
m = i
IF m > j THEN m = j
IF m > n + 1 - i THEN m = n + 1 - i
IF m > n + 1 - j THEN m = n + 1 - j
PRINT #2,m ’将数据写入到2号文件中
NEXT I
CLOSE
END
例4.找最长单词 (2004年小学信息学奥赛复赛第2题,有改动)
【问题描述】
编写程序,根据给出的若干行结束于’.’的字符字串,找出每行最长的含有字母’a’的子串。
【输 入】
输入文件名统一规定为。
该文件有若干行,每行均有一组数据,每组数据均为一个字符字串,结束于句点’.’。字串中的子串由一个或几个空格隔开。
【输 出】
输出到文件().共有若干行。每行均只有一个数据,显示找出的最
11
授课教师:泰州市城东小学周年荣 jstzznr@
长的含有字母’a’的子串。如果有多个这样的子串,只显示其中的第一个;若没有含字母’a’的子串,则显示“NO”。
【样 例】
输入文件:
She is working.
Her name is linan and she is a happy student.
Algorithms are central objects of study in many areas of the field.
The sharing of programs in computer systems is becoming more
widespread.
x yy zza 12345 12a45 ww wwwa 123a5 78900.
x yy zzz uuuu vvvvv a bb ccc.
输出文件:
NO
linan
central
widespread
12a45
a
【问题分析】
题目没有指明有多少个测试数据,因此只能用EOF函数判断是否已经读完了<文件号>指明的文件中的所有数据。
【程序清单】
REM
OPEN "" FOR INPUT AS #1 ’打开文件准备读
OPEN "" FOR OUTPUT AS #2 ’打开文件准备写
DO WHILE NOT EOF(1) ’只要未到达文件尾,就继续读
LINE INPUT #1, a$ ’用LINE INPUT #语句读一整行
a$ = MID$(a$, 1, LEN(a$) - 1) ’ 取出每行末尾的’.’
l = LEN(a$): ml = 0: mx = -1: w = 0: a = 0
FOR i = 1 TO l
c$ = MID$(a$, i, 1)
IF (w = 0) AND (c$ <> " ") THEN
cl = 1: cx = i: w = 1
IF c$ = "a" THEN a = 1
ELSEIF (w = 1) AND (c$ <> " ") THEN
cl = cl + 1
IF c$ = "a" THEN a = 1
ELSEIF (w = 1) AND (c$ = " ") THEN
12
授课教师:泰州市城东小学周年荣 jstzznr@
IF (cl > ml) AND (a = 1) THEN ml = cl: mx = cx
w = 0: a = 0
END IF
NEXT i
IF (cl > ml) AND (a = 1) THEN ml = cl: mx = cx
IF mx > 0 THEN
FOR i = 1 TO ml
PRINT #2, MID$(a$, mx - 1 + i, 1);
NEXT i
PRINT #2, ’文件空一行
ELSE
PRINT #2, "NO"
END IF
LOOP
CLOSE
END
例5.建立、添加、读取学生的成绩信息文件
下面的程序是一个学生成绩管理程序,功能很强,可以建立文件、写入数据、读取数据、加工数据,稍加扩充可以成为一个完备的信息管理系统。它首先读取从键盘输入的班级名字,如五年三班输入为5-3,而后构成文件名,这意味着各班的成绩文件都放在同一目录之下。如果此文件不存在则建立之,并接纳学生的资料;如果存在则将新资料加在原有资料之后。接下来,读出文件中的全部数据,把它们显示在屏幕上,并算出各科的平均成绩。下面给出全部源程序:
源程序:
INPUT "class : ", class$ 输入班级号
class$ = "school" + class$ + ".txt" 构成该班的文件名
OPEN class$ FOR APPEND AS #1 打开文件准备扩充
INPUT "name : ", name$ 读第一个学生的姓名
WHILE name$ <> "" 如姓名为空,结束循环
INPUT eng, bas, math 输入学生的三科成绩
WRITE #1, name$, eng, bas, math 将该生的姓名和成绩写入文件
INPUT "name : ", name$ 读下一个学生的姓名
WEND
CLOSE #1 关闭文件,以便再次打开
OPEN class$ FOR INPUT AS #1 再次打开准备读
WHILE NOT EOF(1) 如果没有到达文件尾,循环
13
授课教师:泰州市城东小学周年荣 jstzznr@
n = n + 1 学生人数n加1
INPUT #1, name$, eng, bas, mat 读第n个学生的资料
PRINT name$, eng, bas, mat 累加各科成绩
engav = engav + eng
basav = basav + bas
matav = matav + mat
WEND
CLOSE 关闭文件
engav = engav / n 计算3科平均分
basav = basav / n
matav = matav / n
PRINT "english average = "; USING "##.##"; engav 显示3科平均分
PRINT "basic average = "; USING "##.##"; basav
PRINT "mathematics average = "; USING "##.##"; matav
END 程序结束
此程序能够为所有班级服务,而且对同一个班级可以多次添加数据。下面的会话过程表明,五年三班的文件还不存在,于是本程序建立之,并将键盘输入的两个学生的数据记入文件,在键入姓名时如果只按Enter,即输入了空串,表示结束输入。而后读出文件中所有学生(当前只有两个学生)的数据,同时算出三科的平均成绩。
class : 5-3
name : li ming
english,basic,mathematics : 64,69,72
name : wang hong
english,basic,mathematics : 78,69,82
name :
li ming 64 69 72
wang hong 78 69 82
English average = 71.00
basic average = 69.00
mathematics average = 77.00
下面的会话是第二次为五年三班输入数据,这次又增加了两个同学的数据,然后显示全部4个同学的数据,最后给出三科的平均成绩。
class : 5-3
name : lin nan
english,basic,mathematics : 92,88,93
name : zheng haiyang
14
授课教师:泰州市城东小学周年荣 jstzznr@
english,basic,mathematics : 62,59,45
name :
li ming 64 69 72
wang hong 78 69 82
lin nan 92 88 93
zheng haiyang 62 59 45
english average = 74.00
basic average = 71.25
mathematics average = 73.00
在教学过程中,要让学生多练习,熟练掌握读入文件、输出文件的方法。同时要指导学生创建数据文件,以测试程序的正确性。
本讲作业:
1、文件中有若干个数,将其中重复的数删得只剩下一个。
文件输入:文件名为:2_,格式为:每行有一个数,有若干行。
文件输出:文件名为:2_,在一行显示。
2、求M,N的最小公倍数(输出到屏幕)。
文件输入:文件名为:2_~2_20. in,格式为:M,N(每个文件只有1行)
文件输出:文件名为2_~2_20. out。
3、求N个字符串(N<20,串长<255)中最长的公共子串。如最长的公共子串不止一个,只输出最先找到的那一个。
文件输入:文件名为:2_,每行一个字符串,有若干行。
文件输出:文件名为:2_。
4、M进制数与N进制数互相转换。(M、N均为10以内的整数)
文件输入:文件名为:2_~2_40. in,格式为:M□N□X(具体的数)
文件输出:文件名为:2_。
10个测试文件的文件输出内容均在输出文件中。
15


发布评论