Program kopiujący środkowy wyraz ciągu.

0

Cześc, na programowaniu dostałem następujące zadanie:

Napisz procedurę/funkcję, która przyjmuje jako parametr plik WE
(typu TXT), gdzie pojedyncza linia przechowuje trzy dowolne wyrazy
rozdzielone spacją. Procedura/funkcja przepisuje tylko środkowy
wyraz z każdej linii do pliku WY. Napisz prosty program
korzystający z tego podprogramu i wyświetlający rezultat jego
działania. UWAGA! Pomiędzy trzema wyrazami może wystąpić dowolna
liczba spacji !!! Zakładamy, że linia z wyrazami nie przekracza
255 znaków !!!
Przykład: tab1 -> abcde dfgre eeerfg, tab2 -> dfgre

Gdyby pomiędzy I a II wyrazem była tylko jedna spacja np: abcde dfgre eeerfg to program wygladalby tak:

 uses crt;
 var
  plik,plik1:textfile;
  wyraz,nwyraz,x:string;
  n:longint;
  i,licznik,k:byte;
 begin
  clrscr;
  Assign(plik,'C:\programy pascala\dane.txt');
  Assign(plik1,'C:\programy pascala\danek.txt');
  Append(plik1);
  reset(plik);
   while not Eof(plik) do begin
    readln(plik,wyraz);
    n:=pos(' ',wyraz);
    delete(wyraz,1,n);
    n:=pos(' ',wyraz);
    x:=copy(wyraz,1,n);
    writeln(plik1,x);
    end;
   close(plik);
   close(plik1);
 end.

No ale wlaśnie w treści zadania pisze że mogą by rozdzielone dowolną liczbą spacji. Zastannawialem się w jaki sposób można by bylo wykasowac te spacje przed drugim wyrazem? Ewentualnie czy ma ktos inny pomysl na ten program?

0

Dodaj procedurę wyraz:=trim(wyraz); zaraz po delete i już worksi.
Jak chcesz wiedzieć na czym trim polega to odsyłam do google.

0

Po co to n?

 uses crt;
 var
  plik,plik1:textfile;
  wyraz,nwyraz,x: string[255];
  i,licznik,k:byte;
 begin
  clrscr;
  Assign(plik,'C:\programy pascala\dane.txt');
  Assign(plik1,'C:\programy pascala\danek.txt');
  Append(plik1);
  reset(plik);
   while not Eof(plik) do begin
    readln(plik,wyraz);
    delete(wyraz,1,pos(' ', wyraz));
    x:=copy(trim(wyraz),1, pos(' ',trim(wyraz))-1);
    writeln(plik1,x);
    end;
   close(plik);
   close(plik1);
 end.

Powinno działać.
Ewentualnie, zamiast korzystać z Trim można skorzystać ze StringReplace.

0

To ma być procedura \ funkcja :P

program ReWriteMiddleWords;
uses Crt;

  procedure GetMiddleWords(sInput, sOutput: ShortString);
  var
    fInput, fOutput: TextFile;
    sLine, sMiddleWord: ShortString;
  begin
    Assign(fInput, sInput);
    Assign(fOutput, sOutput);

    Reset(fInput);
    ReWrite(fOutput);

    while not EoF(fInput) do
      begin
        ReadLn(fInput, sLine);
        Delete(sLine, 1, Pos(' ', sLine));

        sMiddleWord := Copy(Trim(sLine), 1, Pos(' ', Trim(sLine)) - 1);
        WriteLn(fOutput, sMiddleWord);
      end;

    CloseFile(fInput);
    CloseFile(fOutput);
  end;

begin
  ClrScr;

  GetMiddleWords('C:\Input.txt', 'C:\Output.txt');
  ReadLn;
end.

Kod jest przetłumaczeniem kodu @Patryk27 + poprawiona składnia, nowe identyfikatory oraz usunięcie niepotrzebnych zmiennych a także stworzenie procedury realizującej zadanie;

PS: kod mówi wiele o programiście - pamiętajcie :)

EDIT:

Napisz procedurę/funkcję, która przyjmuje jako parametr plik WE (typu TXT)

Jakby nie można w parametrze przyjąć nazwy plików wejścia i wyjścia...

0

Dzieki wam wszystkim za pomoc, pare niepotrzebnych zmiennych rzeczywiscie mi sie zaplatalo z poprzednich wersji tego programu, zmienne k, licznik oraz nwyraz sa niepotrzebne. Program nie jest ubrany jeszcze w procedure bo z tym dam rade, chcialem rozwiazac najpierw sama istote problemu. Program ma byc napisany w turbo pascalu i niestety nie ma tam takiej funkcji jak trim ktora swietnie by rozwiazala moj problem, nie znam tez zadnej podobnej. Ma ktos jeszcze jakis promysl?

0

niestety nie ma tam takiej funkcji jak trim ktora swietnie by rozwiazala moj problem

No to napisz swoją, przecież to nie jest trudne... Raczej Ci się nie chce, bo sprawa jest naprawde niskiego poziomu;

Poczytaj o tej funkcji w delphi i napisz odpowiednik w pascalu; Pokaż, że zależy Ci na napisaniu tej procedury;

0

No to napisz swoją, przecież to nie jest trudne...

Właśnie w tym problem, że nie potrafię napisać funkcji która kasuje te spacje na początku ciągy, skoro to dla ciebie takie łatwe to może mi pomożesz? Nie wiem skąd twoje zarzuty że mi się nie chce? Nad tym programem siedzę już drugi dzień, wiem że trim albo w tym wypadku bardziej by pasowało Lefttrim kasuje zbędne spacje jednak nie wyobrażam sobie jakby ona mogła być skonstruowana? Moglibyście mi wyjaśnić dlaczego ten program nie działa z procedurą goto?

uses crt;
 var
  plik,plik1:textfile;
  wyraz:string;
  n:longint;
  i:byte;
  label etykieta;
 begin
  clrscr;
  Assign(plik,'C:\programy pascala\dane.txt');
  Assign(plik1,'C:\programy pascala\danek.txt');
  Append(plik1);
  reset(plik);
   while not Eof(plik) do begin
    readln(plik,wyraz);
    n:=pos(' ',wyraz);
    delete(wyraz,1,n);
    i:=1;
    etykieta:
   while wyraz[i]=' ' do begin
    delete(wyraz,1,1);
    i:=i+1;
    goto etykieta;
    end;
    writeln(plik1,wyraz);
    end;
   close(plik);
   close(plik1);
 end.
0

z procedurą goto?

Czy ty aby chcesz nas sprowokować do tematu dlaczego NIE warto używać goto? NIE UŻYWAJ GOTO!

A nie działa dlatego bo nie pomyślałeś co robi Delete ze znakami. Pomyśl to i wpadniesz na rozwiązanie.

@Patryk27, po co moje trim dałeś 2x? Powtarzanie kodu? Uh, a to wszystko żeby nie powtarzać mnie... :P (Nawet swojego rozwiązania nie wymyśliliście)

0

Delete kasuje znaki, i o to wlasnie w tym momencie mi chodzilo o wykasowanie spacji przed drugim ciągiem znaków. Gdyby udało mi się to zrobić to później bym skopiował od pierwszego znaku do kolejnej spacji. Wiem że nie powinno się wykorzystywać goto ale już nie miałem innego pomysłu.

0

w tym momencie mi chodzilo o wykasowanie spacji przed drugim ciągiem znaków

No a i:=1; .
Czy ty na pewno wiesz co chcesz zrobić? Przecież daliśmy ci rozwiązanie. A ty tutaj jeszcze z jakimś goto wyskakujesz bo nie miałeś innego pomysłu. Normalnie następnym razem jak nie będziesz wiedzieć co i jak to zacznij pisać w opcodach procesora. To jest dopiero prosty sposób na zagmatwanie kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0