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