我的任务是创建一个程序,该程序将文本文件作为输入,并将所有以“a”开头的单词写出到另一个单词。我能想出的最佳解决方案如下:
program project1;
var
f,g:text;
ch,b:char;
ile,pos1,pos2,i:integer;
s:string;
begin
assign(f, 'input.txt');
assign(g, 'score.txt');
reset(f);
rewrite(g);
ile:=0;
pos1:=0; pos2:=0;
while not eof(f) do begin
read(f,b);
write(g,b);
Inc(pos1);
read(f,ch);
write(g,ch);
Inc(pos2);
if (b=' ') and (ch='a') then begin
repeat
read(f,ch);
inc(pos2);
write(g,'ala');
until ch=' ';
//for i:=pos1 to pos2 do
//writeln(g,s[i]);
//writeln;
end;
end;
close(f);
close(g);
end.
当我运行它时,它会重现input.txt
的内容并将它们放在score.txt
中。我在'if condition'中添加了随机语句,因此我可以看到它是否曾被评估为真,而事实证明它没有。你能否想出任何我做错的线索或解决方案?
修改
我尝试使用最简单的例子进行实验 - 我创建了一个仅包含一个单词的input.txt,例如'export'并将'if condition'更改为:
if (b='e') and (ch='x') then begin
repeat
write(g,ch);
read(f,ch);
until ch='t';
我的理解是它应该产生一个只包含一个单词的output.txt:'export'但它似乎进入一个无限循环,在我的输出文件中创建了数千个随机字符......
答案 0 :(得分:1)
感谢您的帮助。我终于通过同时读取字符串和字符来制作。似乎工作正常:)
program project1;
var
a,b:char;
f,g:text;
i,j,ile:integer;
s:string;
ok:boolean;
begin
assign(f,'tekst.txt');
assign(g,'wyniks.txt');
reset(f); rewrite(g);
repeat
readln(f,s);
i:=1;
while i<= length(s) do begin
a:=s[i];
b:=s[i+1];
if (a=' ') and (b='a') then begin
repeat
write(g,b);
i:=i+1;
b:=s[i+1];
until b=' ';
i:=i-1;
writeln(g);
end;
i:=i+1;
end;
until eof(f);
close(f);close(g);
end.
答案 1 :(得分:0)
我将向您展示您需要撰写的内容中最重要的部分:它被称为分词器;这是编译器中出现的例程的简单版本。它从输入行返回下一个标记(在这种情况下,下一个单词,但在编译器中它也可以是一个数字)。
Function NextToken: string; // variable 'line' is global to this function
var
space: integer;
begin
space:= pos (' ', line);
if space = 0 then
begin
result:= line;
line:= ''
end
else
begin
result:= copy (line, 1, space - 1);
line:= copy (line, space + 1, length (line) - space);
end;
end;