Program kopiujący środkowy wyraz ciągu.

2011-12-25 14:41
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?

edytowany 1x, ostatnio: madmike, 2011-12-25 15:18

Pozostało 580 znaków

2011-12-25 14:48
Oho
0

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

Pozostało 580 znaków

2011-12-25 15:01
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.


edytowany 3x, ostatnio: Patryk27, 2011-12-25 15:02

Pozostało 580 znaków

2011-12-25 17:06
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...


edytowany 2x, ostatnio: furious programming, 2011-12-25 17:24
Pokaż pozostałe 5 komentarzy
Skąd wiesz, że nie pisze? Sprawa taka jak z "ReWrite" jest o tyle specyficzna, że przedrostek "Re" w sumie to znaczy niewiele, tyle co "ponownie"; Skoro część "Re" znaczy "ponownie", a "Write" to "zapisać" - czyli to tak jakby dwa słowa "ponownie zapisać"; Stąd wielbłąd pokazuje garby; Tak samo "ReSelect", co oznacza "ponownie wybrać"; - furious programming 2011-12-26 10:35
Dobra, każdy ma swoje zdanie a ta dyskusja do niczego nie prowadzi. Dziękuję, dobranoc. - TomRiddle 2011-12-26 10:38
Doprowadziła nas do tego, że każdy ma swój styl pisania kodu; Jaki ma taki ma, ważne, żeby był przejrzysty i czytelny (i żadnych cholernych polskich identyfikatorów...); Jest 10:41 więc - do widzenia; - furious programming 2011-12-26 10:42
"Dziękuję, dobranoc" to był cytat ze znanego filmu z jutjuba. - TomRiddle 2011-12-26 12:06
Nie cytuj - miej swoje zdanie; - furious programming 2011-12-26 12:10

Pozostało 580 znaków

2011-12-25 17:27
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?

Pozostało 580 znaków

2011-12-25 17:30
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;


Pozostało 580 znaków

2011-12-25 17:46
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.
edytowany 1x, ostatnio: miszczu1234, 2011-12-25 17:54
Nie nazywam Cię leniem, ale można to zrobić na wiele sposobów i nie jest to aż tak trudne, żebyś nie dał rady tego zrobić; Jak nie widzisz tego w głowie to weź kartkę i długopis, napisz jakiś ciąg i popatrz gdzie co jest, ile tego jest i jak to znaleŹć; Później dobierasz odpowiednie pętle / warunki itd. i jedziesz z przykładem; Testujesz, testujesz, testujesz i jak działa jest git, jak nie - modyfikacja i znowu testujesz aż zacznie działać; Wystarczy się skupić i spróbować swoich sił :P - furious programming 2011-12-26 10:30

Pozostało 580 znaków

2011-12-25 19:40
Oho
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)

Pozostało 580 znaków

2011-12-25 20:00
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.

Pozostało 580 znaków

2011-12-25 20:09
Oho
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.

Pozostało 580 znaków

2011-12-25 20:17
0

Nie wiem czy czytales moje poprzednie posty w tym wątku? Musze ten program napisać w Pascalu a tam nie ma takiej funkcji jak trim dlatego caly czas szukam innego rozwiązania.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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