[Pascal] Prosty program zamienie kolejnośc znaków z słowie

0

Witam, mam mały problem z programem. Program polega na wczytaniu 1000 słów z pliku tekstowego. Napisaniu każdego słowa od końca ( abc -> cba) oraz zapisaniu go do pliku tekstowego. Nie wiem czemu program mi nie działa. Z góry dzięki za pomoc.

 program matura08;
 uses crt;
 type tablica=array[1..1000] of string;
 type tablica2=array[1..1000] of string;
 var
 plk:text;
 tab:tablica;
 tab2:tablica2;
 i,j,k:integer;
 w,a:string;

 procedure wczytaj;
  begin
  assign(plk,'z:\slowa.txt');
  reset(plk);
   i:=1;
    for i:=1 to 1000 do
     begin
      read(plk,w);
       tab[i]:=w;
        close(plk);
      end;
  end;

 procedure zapisz;
   begin
     assign(plk,'z:\slowa.txt');
     rewrite(plk);
      begin
        for i:=1 to 1000 do
        writeln(tab2[i]);
      end;
     close(plk);
    end;

 begin

 clrscr;
 wczytaj;
 repeat
  for i:=1 to 1000 do
   begin
    k:=length(tab[i])+1;
     repeat until k>0;
     tab2[i]:=tab[i]+tab[i][k];
     k:=k-1;
   end;
   end;
  zapisz;
 end.
0

Nie wiem czemu program mi nie działa.

Debugger twoim przyjacielem. Ale nawet bez niego się obejdzie bo problem widać na pierwszy rzut oka:

repeat until k>0; let's loop!

0

Poprawiłem dolną część na taką :

 begin

 clrscr;
 wczytaj;
 repeat
  for i:=1 to 1000 do
   begin
    k:=length(tab[i])+1;
     repeat
     tab2[i]:=tab[i]+tab[i][k];
     k:=k-1;
     until k>0
   end;
  zapisz;

 end.

Wywala błąd exitcode 103. Może ktoś powiedzieć co oznacza?

0
  for i:=1 to 1000 do
  begin
    len:= Length(tab[i]); //zmienna len typu integer
    napis:= ''; //zmienna napis typu string
    for k:=len downto 1 do
      napis:= napis + tab[i][k];
    tab2[i]:= napis;
  end;
0

skoro taki "prosty program" to czemu taki trudny? Drażniące są tego typu tematy sugerujące poziom trudności czy skomplikowania pewnego problemu. Skoro stać się na jego ocenę to i stać się na ocenę swoich możliwości przy jego rozwiązywaniu. Idąc dalej tym tokiem skoro zadajesz pytanie na forum i masz problem z zadaniem to znaczy, że dla ciebie nie jest ono proste więc ocenę trudności pozostaw odpowiadającym, a przynajmniej nie kłam, że jest proste bo dla ciebie nie jest.

wracając do tego prostego programu:

tab2[i]:=tab[i]+tab[i][k]

co to robi?

0
tab2[i]:=tab[i]+tab[i][k]

co to robi?</quote>
dobra nie zauważyłem, że to są stringi.

0

Uważam, że jest to proste bo są to same początki programowania. Pisząc prosty mam na myśli osoby z tego forum które się znają na tym. Dla nich jest to mały problem, że ja nie potrafię napisać tego programu od tak to nie znaczy ze jest trudne.

0

Uważam, że jest to proste bo są to same początki programowania.

Ale na forum są też inni newbie dla których to jest trudne. Nie pisz że to łatwe, chyba że to dla ciebie łatwe. Zresztą, skoro pytasz do dla ciebie to jest trudne albo nie umiesz szukać w googlach (zakładam że jedno i drugie).

Pisząc prosty mam na myśli osoby z tego forum które się znają na tym. Dla nich jest to mały problem, że ja nie potrafię napisać tego programu od tak to nie znaczy ze jest trudne.

To jak dla mnie jest łatwo napisać szyfrator sekcji plików PE to znaczy że to jest łatwe? Bo chyba zaliczam się do tych którzy się znają.
Doświadczenie i kierunki rozwoju są dla każdego inne, więc nie mów 'łatwe' czy 'trudne'. Dla każdego co innego jest łatwe a co innego jest trudne.

Tak jeszcze przy okazji jesteś pewien że umiesz nazywać wątki? http://4programmers.net/Forum/Newbie/100389-prosba_o_tagowanie_watkow_-_nie_uzywaj_prefiksow

A teraz wracamy do pytania...

Wywala błąd exitcode 103. Może ktoś powiedzieć co oznacza?

Google ci powie szybciej niż ja, więc lepiej żebym odesłał ciebie do googla bo następnym razem być może skorzystasz. Teraz też skorzystaj, taki trening.

Poza tym już ci napisałem:

Debugger twoim przyjacielem.

Naprawdę, taki problem wpisać w googla Debugger Turbo Pascal (czy jakie tam środowisko masz)? Uwierz mi, programista bez Debuggera to jak rower bez hamulców: Można, tylko to niebezpieczne i głupie.
Poczytaj sobie, może nawet coś po Polsku znajdziesz, a jeżeli jakimś cudem Debugger ci nie pomoże to wrzuć callstack z Debuggera i może jakieś stany zmiennych (wszystko jest w google, masz linka gdybyś nie znał: www.google.pl ).

0

Dobra, skoro ma być nauka, to będzie nauka.

Po co deklarujesz 2 razy identyczny typ pod różnymi nazwami? Chodzi mi o pierwsze linijki Twojego kodu. Deklarujesz jako dwa różne typy array[1..1000] of string. Zupełnie bez sensu. To ma być jeden typ po prostu.

Czyli np:

type
  TArrayOfStr = array[1..1000] of string;

zamiast:

type
  tablica = array[1..1000] of string;
  tablica2 = array[1..1000] of string;
0

to ci sie w ogole kompiluje? masz dwa razy repeat i tylko raz until

1

Trochę bałaganu zauważyłem w tym kodzie;

type tablica=array[1..1000] of string;
 type tablica2=array[1..1000] of string;

Przypomnę, że nie ma sensu w ten sposób tworzyć zmiennych tablicowych; Właściwym sposobem jest zadeklarowanie typu i wykorzystanie go przy deklaracji:

type
  TLinesArr = array [1 .. 1000] of String;
var
  laInput, laOutput: TLinesArr;

I nie deklarujcie macierzy jak humaniści - macierze powinno się indeksować od 0; Poza tym co to za identyfikatory Tab1, Tab2? Zmiennym nadaje się nazwy takie, żeby patrząc na nie można było się szybko domyślić do czego służą; Po tym można się domyślić, że trzeba poszukać w kodzie ich (prze)znaczenia;

Następna sprawa:

procedure wczytaj;
  begin
  assign(plk,'z:\slowa.txt');
  reset(plk);
   i:=1;
    for i:=1 to 1000 do
     begin
      read(plk,w);
       tab[i]:=w;
        close(plk);
      end;
  end;

Trochę w niej bałaganu; Zwróć uwagę na pętlę:

for i:=1 to 1000 do
     begin
      read(plk,w);
       tab[i]:=w;
        close(plk);
      end;

Otwierasz plik, w pętli zaczynasz wczytywanie linii i od razu po pierwszym przejściu pętli zamykasz plik; Musisz to wyrzucić poza pętlę:

procedure Wczytaj;
begin
  Assign(Plk, 'Z:\Slowa.txt');
  Reset(Plk);

  for I := 1 to 1000 do
    ReadLn(Plk, Tab[I]);

  Close(Plk);
end;

Przede wszystkim możesz w pętli wczytywać linijki z pliku bezpośrednio do macierzy, zmienna w nie jest potrzebna; Poza tym niepotrzebnie przed pętlą inicjujesz zmienną i (i := 1;); Następnym błędem jest odczyt kolejnych linii z pliku procedurą Read - musisz zastosować ReadLn by działało prawidłowo;

Następnie strasznie pomieszana jest procedura zapisująca:

procedure zapisz;
   begin
     assign(plk,'z:\slowa.txt');
     rewrite(plk);
      begin
        for i:=1 to 1000 do
        writeln(tab2[i]);
      end;
     close(plk);
    end;

Powinieneś ją zrobić w ten sposób:

procedure Zapisz;
begin
  Assign(Plk, 'Z:\Slowa.txt');
  ReWrite(Plk);

  for I := 1 to 1000 do
    WriteLn(Plk, Tab2[I]);

  Close(Plk);
end;

Dlaczego? Już tłomaczę; Po pierwsze to niepotrzebnie objąłeś pętlę w blok begin .. end - nie trzeba tego robić; Po drugie to nie wpisujesz w ogóle słów z macierzy do pliku, bo pierwszym argumentem procedury WriteLn powinna być zmienna plikowa (tu: plk), której nie podałeś, więc wszystko zapewne lądowało na ekranie monitora; Po trzecie - formatowanie...

Przyjrzyjmy się głównej części programu:

begin
 clrscr;
 wczytaj;
 repeat
  for i:=1 to 1000 do
   begin
    k:=length(tab[i])+1;
     repeat until k>0;
     tab2[i]:=tab[i]+tab[i][k];
     k:=k-1;
   end;
   end;
  zapisz;
 end.

Tragedia... Dlaczego nie napiszesz sobie funkcji odwracającej łańcuch? Było by Ci łatwiej, a kod byłby przejrzysty:

function Odwroc(Lancuch: String): String;
var
  I: Word;
begin
  Result := '';

  for I := Length(Lancuch) downto 1 do
    Result := Result + Lancuch[I];
end;

Wystarczy teraz ją wywołać w pętli i zapisywać do pliku; Po co Ci tam repeat i dlaczego nie jest domknięty o until??? Nie rozumiem... Wracając do funkcji odwracającej łańcuch - wystarczy ją wywołać dla każdego pola tablicy i później zapisać wartości do pliku, np. tak:

Wczytaj;

for I := 1 to 1000 do
  Tab2[I] := Odwroc(Tab2[I]);

Zapisz;

I będzie działać bez problemu;

To, co powinieneś zrobić:

  1. podawać tablice jako argument procedur,
  2. podawać nazwę pliku jako argument procedur,
  3. dzielić kod na procedury (zabrakło odwracającej łańcuch),
  4. używać zmiennych lokalnych w procedurach/funkcjach,
  5. stosować styl wielbłądzi w nazewnictwie każdego elementu kodu (jezyka),
  6. formatować kod na bieżąco,
  7. nazywać zmienne, procedury i funkcje po angielsku (spolszczanie nie ma sensu...);
    To chyba tyle, jeśli chodzi o uwagi z mojej strony; Przede wszystkim polecam myśleć podczas pisania programu i starać się samemu rozwiązywać zawarte w kodzie błędy - samodzielność to nie wada;

Bóg ukarze mnie za polskie identyfikatory w tym przykładzie...

0
furious programming napisał(a):

Bóg ukarze mnie za polskie identyfikatory w tym przykładzie...

Tym razem ci daruję mój synu.

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