Program - Mini Słownik polsko-angielski z operacjami na rekordach

0

Witam,
Dostałem na lekcji programowania zadanie napisania mini słownika polsko-angielskiego, który definicje słów
przechowywać ma w typie rekordowym, mającym dwa pola : pl i en.

program slowplen;
uses crt;
type TWpis = Record             {typ rekord zawierajacy dwa pola : en i pl, przechowujacy polskie slowa i ich angielskie odpowiedniki}
             pl : string[20];
             en : string[20];
             end;

var
     slow : TWpis;
     slownik : file of TWpis; {definicja pliku}
     wybor : byte;  {zmienna pomocnicza do obsługi menu}
     slowo : string;

procedure Dopisz; {Dopisywanie slow do slownika}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
   WriteLn('Podaj polskie slowo: ');
   Read(slow.pl);
   WriteLn('Podaj angielski odpowiednik: ');
   Read(slow.en);
   Write(slownik, slow);
End;

procedure Znajdz; {Wyszukiwanie angielskich odpowiednikow slow}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
   WriteLn('Podaj slowo: ');
   ReadLn(slowo);
End;

procedure Wyswietl; {Wyswtietlenie wszystkich slow w slowniku}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
End;

procedure Zakoncz; {Zakonczenie dzialania programu}
Begin
  halt;
End;

BEGIN
   ClrScr;
   wybor := 0;
   WriteLn('***************************************');
   WriteLn('*    Mini słownik polsko-angielski    *');
   WriteLn('*    1. Dopisz do slownika            *');
   WriteLn('*    2. Znajdz angielski odpowiednik  *');
   WriteLn('*    3. Wyswietl wszystkie slowa      *');
   WriteLn('*    4. Zakoncz program               *');
   WriteLn('***************************************');
   Read(wybor);
{   case wybor of
   1 : Dopisz;
   2 : Znajdz;
   3 : Wyswietl;
   4 : Zakoncz;
   end;
   ReadLn; }
END.

Program niby działa (chodzi mi o pierwszy punkt), ale wyłącza się tylko jak wpisze 1 i wcisnę Enter.
Mam pytanie : co w tym programie jest nie tak ? 
I drugie : jak zrobić wczytywanie z pliku , które odczytuje te hasła (które są w rekordach).
Nie mam pojęcia o co chodzi.
0

Nie dziwota, że się konczy, bo tak jest napisany. Musiał byś zrobić pętlę repeat ... until Wybor = 4. Poza tym lepsze jest chyba ReadKey, skoro już korzystasz z modułu Crt. A wczytywanie i zapis pliku rekordowego realizujesz przez instrukcje Read, Write, FileSize oraz Close do zamknięcia pliku. Pogoogluj, pomyśl, pokombinuj sam i jak będą konkretne problemy, to wtedy pisz na forum. Nigdy z ogólnikami lub po gotowca. Nie od tego są fora nawet takie jak to. Poza tym mam "deżawi". Chyba jakiś Twój kolega [?] już dzisiaj pytał o zrobienie podobnego słownika.

0

Dobrze - zrobiłem pętlę repeat, jednakże po wcisnieciu entera pokazuje sie tylko menu. Wydaje się, że procedura nie działa. Tylko dlaczego ?

0

Ponieważ coś zepsułeś.
Wrzuć aktualny kod.

0

Proszę bardzo :

program slowplen;
uses crt;
type TWpis = Record             {typ rekord zawierajacy dwa pola : en i pl, przechowujacy polskie slowa i ich angielskie odpowiedniki}
             pl : string[20];
             en : string[20];
             end;

var
     slow : TWpis;
     slownik : file of TWpis; {definicja pliku}
     wybor : byte;  {zmienna pomocnicza do obsługi menu}
     slowo : string;

procedure Dopisz; {Dopisywanie slow do slownika}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
   WriteLn('Podaj polskie slowo: ');
   Read(slow.pl);
   WriteLn('Podaj angielski odpowiednik: ');
   Read(slow.en);
   Write(slownik, slow);
End;

procedure Znajdz; {Wyszukiwanie angielskich odpowiednikow slow}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
   WriteLn('Podaj slowo: ');
   ReadLn(slowo);
End;

procedure Wyswietl; {Wyswtietlenie wszystkich slow w slowniku}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
End;

procedure Zakoncz; {Zakonczenie dzialania programu}
Begin
  halt;
End;

BEGIN
   ClrScr;
   wybor := 0;
   repeat
   WriteLn('***************************************');
   WriteLn('*    Mini słownik polsko-angielski    *');
   WriteLn('*    1. Dopisz do slownika            *');
   WriteLn('*    2. Znajdz angielski odpowiednik  *');
   WriteLn('*    3. Wyswietl wszystkie slowa      *');
   WriteLn('*    4. Zakoncz program               *');
   WriteLn('***************************************');
   if wybor = 1 Then Dopisz Else if wybor = 2 then Znajdz;
   ReadLn;
until wybor = 4;
   case wybor of
   1 : Dopisz;
   2 : Znajdz;
   3 : Wyswietl;
   4 : Zakoncz;
   end;
   ReadLn;
END.
0

Zdajesz sobie sprawę, że programując przez permutacje donikąd nie dojdziesz?
1.Ten case znajduje się poza blokiem repeat..until
2.Po co Ci ten case, skoro masz drabinkę if-ów: if wybor = 1 Then Dopisz Else if wybor = 2 then Znajdz;?
3.Nigdzie nie wczytujesz niczego do zmiennej wybor.

0

bo zapomniałem ich usunąć, chciałem sprawdzić czy działa procedura.
[update] teraz dostaje runtime error...

0

Niemniej, i tak nie robisz najważniejszego: nie wczytujesz żadnej wartości do zmiennej wybor, więc masz tutaj de facto undefined-behavior.

0

Na tym forum jest miliard tematów na temat zapisu i odczytu rekordów do pliku...

Użyję wyszukiwarki forum za Ciebie. Proszę oto lista linków które Ci mogą pomóc w ulepszeniu programu:
http://4programmers.net/Forum/Newbie/138478-losowanie_pytan
http://4programmers.net/Forum/Delphi_Pascal/198310-problem_z_powtarzaniem_pytan
http://4programmers.net/Forum/Newbie/198147-quiz_-_co_jeszcze_zrobic
http://4programmers.net/Forum/Newbie/207886-deklarowanie_tablicy_ktorej_dlugosc_zalezy_od_inputu
http://4programmers.net/Forum/Delphi_Pascal/211975-wczytywanie_rekordu_z_pliku
http://4programmers.net/Forum/Newbie/211948-zapisywanie_rekord_do_pliku_oraz_ich_odczyt_w_programie
http://4programmers.net/Forum/Delphi_Pascal/136762-odczyt_wartosci_z_pliku_rekordowego_i_przekazanie_do_procedury
http://4programmers.net/Forum/Delphi_Pascal/208314-freepascal_-_zapis_i_odczyt_typu_rekordowego_do_pliku
http://4programmers.net/Forum/Newbie/132683-edycja_rekordow_w_pliku

Plus użyję jeszcze googla za Ciebie. Proszę lista pomocnych linków:
http://turbo-pascal.lubi.pl/l3.htm
http://turbopascal.helion.pl/r-07.htm
http://turbopascal.helion.pl/r-19.htm
http://pascal.kurs-programowania.pl/turbo_pascal,rekordy_i_wska%C5%BAniki.html
http://www.unit1.pl/450,txt
http://turbopascal.helion.pl/r-14.htm
http://turbopascal.helion.pl/index.htm
http://www.pascal.eu.org/

I na dodatek jeśli byś pisał w turbo pascalu to kolejne trzy linki:
http://www.freepascal.org/
http://www.lazarus.freepascal.org/
http://pl.wikipedia.org/wiki/Lazarus

GOOGLE NIE BOLI!!!

Pytanie do adminów:
Można utworzyć sobie szablon wiadomości? Bo takie ctrl+c ctrl+v męczy :P

0

wpisałem odpowiednią instrukcję która to robi - mam już ReadLn(wybor);
Tylko dostaje teraz runtime error ...
[update] rozwiązałem problem - to pamięc powoduje problem.

0

Po raz kolejny więc prosimy Cię o wrzucenie aktualnego kodu, ciężko wróżyć po 21:00.

0

@babubabu można pomyśleć nad takim szablonem. Ale pytający nawet nie próbował szukać niestety. To i szablonu by nie widział i i tak trzeba by było mu podać link "na tacy". Bo nawet tego co @Patryk27 napisał nie przeczytał chyba. Także @marcin1509: przeczytaj jeszcze raz uważnie odpowiedź @Patryk27 I... SIĘ DO UWAG NIEJ ZAWARTEJ ZASTOSUJ! Może jak się podrę trochę, to dotrze ;)

0
program slowplen;
uses crt;
type TWpis = Record             {typ rekord zawierajacy dwa pola : en i pl, przechowujacy polskie slowa i ich angielskie odpowiedniki}
             pl : string[20];
             en : string[20];
             end;

var
     slow : TWpis;
     slownik : file of TWpis; {definicja pliku}
     wybor : byte;  {zmienna pomocnicza do obsługi menu}
     slowo : string;

procedure Dopisz; {Dopisywanie slow do slownika}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
   WriteLn('Podaj polskie slowo: ');
   Read(slow.pl);
   WriteLn('Podaj angielski odpowiednik: ');
   Read(slow.en);
   ReadLn;
   Write(slownik, slow);
End;

procedure Znajdz; {Wyszukiwanie angielskich odpowiednikow slow}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
   WriteLn('Podaj slowo: ');
   ReadLn(slowo);
End;

procedure Wyswietl; {Wyswtietlenie wszystkich slow w slowniku}
Begin
   assign(slownik, 'slownik.dat');
   reset(slownik);
End;

procedure Zakoncz; {Zakonczenie dzialania programu}
Begin
  halt;
End;

BEGIN
   ClrScr;
   wybor := 0;
   repeat
   WriteLn('***************************************');
   WriteLn('*    Mini slownik polsko-angielski    *');
   WriteLn('*    1. Dopisz do slownika            *');
   WriteLn('*    2. Znajdz angielski odpowiednik  *');
   WriteLn('*    3. Wyswietl wszystkie slowa      *');
   WriteLn('*    4. Zakoncz program               *');
   WriteLn('***************************************');
   ReadLn(wybor);
   case wybor of
   1 : Dopisz;
   2 : Znajdz;
   3 : Wyswietl;
   4 : Zakoncz;
   end;
   until wybor = 4;
   ReadLn;
END.

teraz mam inny problem. Po wyswietleniu tekstu podaj polskie slowo i po wpisaniu tego slowa
wyskakuje drugi komunikat o angielski odpowiednik ale od razu pokazuje sie menu.

0

Podpowiedź: co robi funkcja Readln (bądź ReadKey, skoro już dołączyłeś moduł CRT).

0

czy chodzi ci o tą końcówkę ?
usunięcie tejże instrukcji nic nie pomaga .
@olesio - och , czytałem niestety odpowiedź patryka. I niestety w linkach które podał nie znalazłem nic, co rozwiałoby chociaż trochę moje wątpliwości.
mówisz że nie próbowałem szukać - hmm ... niestety trochę się pomyliłeś. Otóż szukałem, ale znalazłem taki sam problem prawie , jednakże nic tam nie pomogli.

0

@Patryk27, nie zrozumiał pytania. W funkcji Dopisz; zamień Read na ReadLn.

0

dzięki - pierwsza funkcja działa.
Jednakże chciałbym się skupić teraz na wyszukiwaniu. Nie mam pojęcia jak się do tego zabrać.
Wiem że na pewno trzeba zrobić pętlę for z Eof(slow), ale nie wiem co ma robić.

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