Pascal程序提取单词

时间:2014-12-14 10:21:34

标签: pascal

我的任务是创建一个程序,该程序将文本文件作为输入,并将所有以“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'但它似乎进入一个无限循环,在我的输出文件中创建了数千个随机字符......

2 个答案:

答案 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;