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.

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.

0

Nie wiem czy czytales moje poprzednie posty w tym wątku?

Cii... :-]

Musze ten program napisać w Pascalu a tam nie ma takiej funkcji jak trim dlatego caly czas szukam innego rozwiązania.

To użyj FPC dla Dosa albo nawet zwykłego FPC, jeżeli nie będzie ci trim widzieć to dodaj moduł strutils (kto wie czy tego w TP nawet nie ma).
Niestety, wygląda na to że nikt już nie chce się bawić w TP. Przerzuć się na coś nowszego albo nie oczekuj że ktoś będzie ci cudować koło od nowa.

A jak nie możesz się przerzucić na FPC (i odnaleźć Trima w TP) to napisz sobie własne Trim. Ale na mnie nie licz, ja zrywam z tym zacofanym środowiskiem które powoduje jedynie wstyd Pascalowi który dzięki temu uchodzi za archaiczny.

0
function Trim(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then Result := '' else
  begin
    while S[L] <= ' ' do Dec(L);
    Result := Copy(S, I, L - I + 1);
  end;
end;

0

Oho, święta są, to i ja dorzucę kawałek kodu:

var Tekst: string;
    Start, Ile: Integer;

begin
  Start:= 1;
  while Tekst[Start] <> ' ' do Inc(Start);
  while Tekst[Start] =  ' ' do Inc(Start);
  Ile:= 0;
  while Tekst[Start+Ile] <> ' ' do Inc(Ile);
  Writeln(Copy(Tekst, Start, Ile));
end.
0

Użyj wyrażeń regularnych :D

0

Użyj wyrażeń regularnych

Tsa D: . Gdyby on wiedział co to

Oho, święta są

Ta, ale mnie to wkurza jak ktoś nadal używa TP :P

@pelsa: Przyczepiłbym się do arytmetyki na charach, nowy FPC tego nie łyknie, a poza tym to ten kod jest za bardzo zoptymalizowany żebyś napisał go ty :P

0
Oho napisał(a)

@pelsa: Przyczepiłbym się do arytmetyki na charach, nowy FPC tego nie łyknie, a poza tym to ten kod jest za bardzo zoptymalizowany żebyś napisał go ty :P

No cóż. Jesteśmy za bardzo zacofani w stosunku do Ciebie. Znajdź sobie inne forum dla takich wypocin. Oprócz krytyki nic konstruktywnego nie potrafisz napisać. Nawet nicka nie potrafisz bezbłędnie przepisać. Czep się Borlanda bo to jego kod. Wcale nie pisałem że mój.

0

Kocham pętlę for :)

function Trim(const sLine: String): String;
var
  iBegin, iEnd: Integer;
begin
  for iBegin := 1 to Length(sLine) do
    if sLine[iBegin] <> ' ' then
      for iEnd := Length(sLine) downto 1 do
        if sLine[iEnd] <> ' ' then
          begin
            Result := Copy(sLine, iBegin, iEnd - iBegin + 1);
            Exit;
          end;
end;

Masz i ode mnie pod choinkę, Wesołych Świąt :D

0

Dziękuje wszystkim którzy chcieli mi pomóc, a w szczególności Furious Programming którego funkcję zaimplementowałem do swojego programu:) Dzięki!
A to skończony kod mojego programu:

 uses crt;
 var
  plik:textfile;
  wyraz,result:string;

 procedure Trim(const sLine: String);
var
  iBegin, iEnd: Integer;
begin
  for iBegin := 1 to Length(sLine) do
    if sLine[iBegin] <> ' ' then
      for iEnd := Length(sLine) downto 1 do
        if sLine[iEnd] <> ' ' then
          begin
            Result := Copy(sLine, iBegin, iEnd - iBegin + 1);
            Exit;
          end;
end;
procedure zamienplik(var plik:textfile);
var
 plik1:textfile;
 n:longint;
 x:string;
begin
  Assign(plik1,'C:\programy pascala\danek.txt');
  rewrite(plik1);
  Append(plik1);
   while not Eof(plik) do begin
    readln(plik,wyraz);
    n:=pos(' ',wyraz);
    delete(wyraz,1,n);
    trim(wyraz);
    wyraz:=result;
    n:=pos(' ',wyraz);
    x:=copy(wyraz,1,n);
    writeln(x);
    writeln(plik1,x);
   end;
close(plik1);
end;
 begin
  clrscr;
  Assign(plik,'C:\programy pascala\dane.txt');
  reset(plik);
  zamienplik(plik);
  close(plik);
  readln;
 end.

Wiem że pewnie można mu wiele zażucic, pewnie mógłby byc krótszy i bardziej czytelny, ale miejcie dla mnie wyrozumiałośc w pascalu programuje 3 miesiąc. Może komuś sie przyda.

0

Ale dlaczego wybrałeś właśnie mój algorytm? Napisałem go dlatego, że uwielbiam pętlę for to do i takiego rozwiązania jeszcze nitk nie podał, ale bardziej eleganckie i profesjonalne rozwiązanie oparte jest na pętli while do, jak napisał @simplex czy @pelsta;

Dla mnie jednak ważne jest to, żeby program działał szybko i bezbłędnie; Nawet gdybyś wpakował tam GoTo to nie miało by to większego znaczenia; Funkcja ma działać, a to jak ją napiszesz to kwestia gustu i zwyczajów; Ja lubię pętle for i ją bym wykorzystał;

miszczu1234 napisał(a)

A to skończony kod mojego programu:

Wcale nie, brakuje Ci pierwszej linii program Nazwa_programu;

0

Wybrałem twoje rozwiązanie bo wcześniej próbowałem to rozwiązać właśnie za pomocą pętli for to do, ale teraz jak patrze na sposób pelsta czy simplex'a to też wydaje mi się to dosyć czytelne. Szkoda ze sam na to nie wpadłem. Masz racje że najważniejsze to żeby program działał.

0

No cóż. Jesteśmy za bardzo zacofani w stosunku do Ciebie. Znajdź sobie inne forum dla takich wypocin. Oprócz krytyki nic konstruktywnego nie potrafisz napisać. Nawet nicka nie potrafisz bezbłędnie przepisać. Czep się Borlanda bo to jego kod. Wcale nie pisałem że mój.

I Tobie również wesołych świąt!

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