★书上的一个例子,有源代码,不能运行,请看看错在哪?谢谢!

wan_ming 2003-06-05 01:34:59

{题目:测定字母偶的出现频率
该例子是:给出一个测定单字中相邻字母偶的出现频率的程序。例如,它给出,在一个字符串中,'ea'比'ie'出现得多还是少。程序只对在单字中的字母偶计数,针对'the cat',它只对'th','he','ca','at'计数,但不对'ec'计数。计数器使用下标类型为letter得一个二维数组conmat。把字母偶'ie'得出现次数放入下标变量conmat['i','e']中。}

program Project2(input,output);

{$APPTYPE CONSOLE}

uses
SysUtils;

{ TODO -oUser -cConsole Main : Insert code here }
const
cha = 'a';
chz = 'z';
type letter = cha..chz;
var conmat: array [letter,letter] of integer;

procedure initial;
var c1,c2: letter;
begin
for c1 := cha to chz do
for c2 := cha to chz do
conmat[c1,c2] := 0;

end;{initial}

{统计过程}
procedure statistical;
var thischar,prevchar: char;
begin
read(prevchar);
repeat
{读下一个字符}
read(thischar);
{统计一次}
if [thischar,prevchar] <= [cha..chz] then
conmat[prevchar,thischar] := conmat[prevchar,thischar] + 1;
prevchar := thischar;
until eof;
end;{statisical}

{输出过程}
procedure out;
{输出从beginch 到 endch 部分结果表}
procedure outone(beginch,endch: letter);
var c1,c2: letter;
begin
{打印表头}
write('*' : 5);
for c1 := beginch to endch do
write(c1 : 5);
writeln;
{打印表体}
for c1 := cha to chz do
begin
write(c1 : 5);
for c2 := beginch to endch do
write(conmat[c1,c2] : 5);
writeln;
end;{for}
end;

begin
outone('a','m'); {输出a..m部分}
outone('n','z'); {输出n..z部分}
end;

begin
initial; {初始化}
statistical; {统计}
out; {输出}
readln;
readln;
end.

我的问题是:该程序不能输出结果,我想是until eof闹的。until eof是干什么的?
这个程序的输入文件应该是指屏幕,我的问题是eof对屏幕文件起作用吗?
当然,可以用其它方式来确定输入结束,但是我不明白这个程序中为什么用until eof,这种用法我还是头一次看到。
...全文
31 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wan_ming 2003-06-13
  • 打赏
  • 举报
回复
to:halfdream(哈欠)

在DOS下:
我试了,(去掉一个readln;)用tp7.0编译成dos程序,用CTRL+Z也可以使其输出结果,只是还要按一下回车键。但是奇怪的是:当添加了uses crt; .....clrscr;后,用CTRL+Z+回车也不能使其输出结果了,也不能用CTRL+C退出,只好强制关闭,哈欠兄如何解释?

在控制台下:
用Delphi将上面的代码编译成控制台程序,用CTRL+Z确实可以使其输出结果,但是输出后随即关闭,即使在后面加上N个ReadLn也不能阻止它,请问哈欠兄怎么办?
--------------------------------------------------------------------------
wan_ming 2003-06-13
  • 打赏
  • 举报
回复
up
halfdream 2003-06-10
  • 打赏
  • 举报
回复
to: zjy6631(欲穷千里目,更上一层楼)

当然能判断,不信你输入CTRL+Z 或者CTRL+ D试试。。
别看错,不是CTRL+C,它是结束控制台程序。

wan_ming 2003-06-10
  • 打赏
  • 举报
回复
to:halfdream(哈欠)

可是这个例子原来是pascal写的,用tp7.0编译成dos程序,不能运行。
是我改成delphi控制台程序的。
难道在dos中输入CTRL+Z 或者CTRL+ D也行吗?
zjy6631 2003-06-08
  • 打赏
  • 举报
回复
这个程序的输入文件应该是指屏幕。
不错,千真万确。对于输入文件,能判断结尾吗?输出文件没问题的。
zjy6631 2003-06-08
  • 打赏
  • 举报
回复
用eof 作为循环的判断条件是错的。因为你是输入(Read是接受屏幕输入),对于输入来说,永远没有结尾,每当你输入一个字符时,系统自动给下一位分配了存储空间,文件指针指向下一位,永远没有结束。所以你的程序一直处于输入等待状态,难怪没有结果了。
zjy6631 2003-06-08
  • 打赏
  • 举报
回复
我在机上运行了你的程序,也是出不了结果。
你把statistical稍微改一点就行了。
procedure statistical;
var
thischar,prevchar: char;
begin
read(prevchar);
repeat
{读下一个字符}
read(thischar);
{统计一次}
if [thischar,prevchar] <= [cha..chz] then
conmat[prevchar,thischar] := conmat[prevchar,thischar] + 1;
prevchar := thischar;
until (thischar='0');//用一个'0' 表示输入的结束
end;{statisical}
hkbarton 2003-06-07
  • 打赏
  • 举报
回复
请用控制台模式下的dcc32来编译该程序
hkbarton 2003-06-07
  • 打赏
  • 举报
回复
halfdream(哈欠) 说的很对
deepWATERblue 2003-06-06
  • 打赏
  • 举报
回复
了解一下。
halfdream 2003-06-06
  • 打赏
  • 举报
回复
我在WIN98下,DELPHI6命令行编译(DCC32。EXE),执行,一切正常


只有一点。。WIN98标准控制台键盘输入文件结束符是CTRL+Z ,
在有些系统是CTRL+D..
jeff 2003-06-06
  • 打赏
  • 举报
回复
好像是pascal的程序吧。
我在XP下根本没有办法运行(出错)。不过你可以试试使用Pascal程序来运行一下。使用Delphi的话如果在95或者98下,首先编译,然后在DOS下试试程序运行。
things 2003-06-05
  • 打赏
  • 举报
回复
up
gardenyang 2003-06-05
  • 打赏
  • 举报
回复
没见过

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧