2014-12-14 7 views
0

내 작업은 텍스트 파일을 입력으로 사용하고 '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에 배치 실행하면 다음과 같이 내가 가지고 올 수있는 가장 좋은 방법입니다. 내 '조건'에 무작위 진술을 추가하여 진실인지 아닌지를 알 수있었습니다. 내가 잘못하고 있거나 어쩌면 해결책을 찾았는지 알 수 있을까요?

내가 간단한 예제를 사용하여 실험을 시도

편집 - 난, '수출'을 말하고 변경 한 단어로 구성된 input.txt를했다 '경우의 조건'에 :

if (b='e') and (ch='x') then begin 
    repeat 
     write(g,ch); 
     read(f,ch); 
     until ch='t'; 

내 이해는 하나의 단어로 구성된 output.txt를 생성해야합니다 : 'export'하지만 출력 파일에 무작위로 수천 개의 임의의 문자를 만드는 무한 루프가되는 것 같습니다 ...

+0

아마도 내가 필요한 것은 그러한 절차의 메커니즘에 대한 설명입니다. – Pasato

+0

내 제안은 input.txt에서 개별 문자를 읽지 않는 것입니다. readln (f, s)를 사용하여 한 줄씩 읽으십시오. 그런 다음 "a"또는 "A"로 시작하는 단어에 대해 문자열 (예 : pos() 함수)을 스캔 할 수 있습니다. "a"앞에있는 문자가 공백 또는 위치가 1이면 다음 공백까지 또는이 문자열의 끝에 도달 할 때까지 복사 할 수 있습니다. char로 char을 읽어야한다면, score.txt 모드로 복사 중일 때 추적 할 플래그 (boolean)가 필요합니다. 또한 줄 끝 문자 (# 10과 # 13)를 읽는 것도 고려해야합니다. – ToonVo

+0

Thx ToonVo. 문자열을 사용하여 처리하려고했지만 제대로 작동하지 않았습니다. 몇 가지 코드를 제공해 주시겠습니까? 또한 pos()는 줄에서 첫 번째 'a'의 위치를 ​​제공합니다. 같은 줄에 'a'로 시작하는 단어가 더 있다면? – Pasato

답변

0

나는 당신이 쓸 필요가있는 것의 가장 중요한 부분 : 그것은 tokeniser라고 불립니다. 이것은 컴파일러에 나타나는 간단한 버전의 루틴입니다. 입력 행에서 다음 토큰 (이 경우에는 다음 단어이지만 컴파일러에서는 숫자 일 수도 있음)을 리턴합니다.

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; 
+0

나는 그에게 숙제를하고 싶지 않았다.) – ToonVo

+0

@ ToonVo : 네 말이 맞아. 토큰 싸이저 보여 줄게. –

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.