free pascal 记录

来源:百度知道 编辑:UC知道 时间:2024/06/05 05:24:08
我刚刚学,希望高手解答
pascal 的记录题
就是给定记录 求记录里男生女生数,我写了2个程序。
第一程序
program abc;
type
stype=record
name:string[20];
number:integer;
sex:integer;
class:integer;
address:string[40]
end;
var a:array[1..100]of stype;
i,m,n:integer;
begin
read(a[1].name);
read(a[1].sex);
read(a[2].name);
read(a[2].sex);
for i:=1 to 2 do
with a[i] do
begin
if sex=1 then m:=m+1
else n:=n+1;
end;
writeln('nanshengshi',m :5);
writeln('nvshengshi',n:5);
readln
end.

第二个程序 ms表示男生数 fs表示女生数
无论输入何种代码
最终的结果都是2个男生 0个女生
program ex;
type
stype=record
name:string[20];
sex:string[6];
number:integer;
class:integer;
address:string;
end;
var
students:array[1..2] of stype;
i,ms,fs:integer;
begin
ms:=0;
fs:=0;
for i:=1 to

首先,你这俩程序都犯了同一个错误!
那就是忽略了字符的定义,在你程序的输入部分你输入的都是定义为字符串,而你用的是read读入,这就会导致pascal误把 输入完成时你敲下的 回车Enter 也当成其中的字符串处理,导致整个输入过程结束,后面你所做的工作当然全白费,因为数组中仅仅记录了你输入的name 和那个无用的Enter。
其次,是你第二个程序中的if sex='female' then fs:=ms+1 错误 应该改为if sex='female' then fs:=fs+1 (这应该是你打错了?)。
最后解决的办法很简单,却需要你以后多加注意,就是把输入中的read 都该为readln 既可!
(两个程序的都改)
最后建议你把程序末尾的readln删除,避免结果输出后仍停留在结果界面需再次按回车 才能调回麻烦(当然,如果你需要先看结果,也可不删)。
That's all。
对于楼下的评论,我觉得正确,但我所说的把read更改为readln 是针对这个题目的问题而言,而且字符串的非文件输入都得如此,其他的情况当然就如楼下所说,看情况,而非绝对!O(∩_∩)~

上面那楼说的有道理

不过,我觉得他说的太绝对了

read 和 readln 命令在大部分情况下有各自的用途

read 命令也不能弃之不用。

给你详细讲一下两者的区别吧:

从概念上说,read是在读完之后跳过一个空格,读下面的

而readln是读完之后跳到下一行读。

下面举几个例子:

我们设输入数据如下:

xu gg 14
lin mm 13
shu gg 13

好了,就三行。

如果读入程序我来写的话,我会这么写:(var省略了)

for i:=1 to 3 do
readln(a[i].name,a[i].sex,a[i].age);

好了 这是什么意思呢?