Free Pascal- niedziałające przeszukiwanie zbioru

Więc tak napisałem prostą bazę danych. Oczywiście nie jest idealna i mam w niej kilka błędów. To jest jedna z procedur użytych w bazie. Wystepuje w niej błąd i nie wiem gdzie jest. Czy mógłby ktoś sprawdzić.

Procedure Wprowadzanie(var osoba: dane; var ilosob: byte);

Var

i: byte;

Begin

writeln('WPROWADZANIE DANYCH DO BAZY: ');

writeln;

Repeat

write('Podaj ile osob chcesz wprowadzic do dziennika: ');

readln(ilosob);

if ilosob=0 then writeln(‘Podano zle dane!’);

Until ilosob>0

assign(f,‘minibaza.dat’);

rewrite(f);

for i:=1 to ilosob do

Begin

clrscr;

writeln('OSOBA ',i);

writeln;

Repeat

write('Imie: '); readln(osoba_.imie); {BLAD WYSPTEPUJE W TEJ LINIJCE PISZE: Illegal qualifire i “)” expected but “.” found}_

if length(osoba_.imie)<3 then writeln(‘Podano zle dane!’);_

Until length(osoba_.imie)>=3;_

fro czy for?

Już poprawiłem lecz nie tutaj jest błąd. Po prost źle skopiowałem tekst z stad te ‘fro’ :slight_smile:

Nie wiem czy bezpośrednio da się tak wczytać: readln(osoba_.imie);_

Chyba musisz użyć jakiejś pośredniej zmiennej i dopiero jej zawartość przypisać do osoba_.imie_

Pokaż czym są ‘dane’ (var osoba: dane;)

Type

dane=record

imie, nazwisko: string;

dzienur, miesiacur, rokur: integer;

End;

Var

f: file of dane;

osoba: array[1…20] of dane;

decyzja, opcja: byte;

t: text;

Oto początek programu. A co do tego aby użyc zmiennej pomocniczej: nei trzeba używać. Robiłem już program na rekordach wi dało sie w ten sposob wczytac to jest po prostu zmienna i musi się dać wczytać. Jesli mielibyśmy użyć dodatkowych zmiennych a rekordow byloby nie wiem ile to ile zmiennych trzebaby bylo zadeklarowac.

Argument osoba funkcji Procedure Wprowadzanie(var osoba: dane; var ilosob: byte); deklarujesz jako dane, a używasz operatora indeksowania [] – więc pewnie chodziło Ci o przekazanie tablicy osób

Baza uruchamia się poprawnie. Wpisywanie danych do bazy działa, ale jak chce aby dane zostaly wypisane to pojawia się runtime error, nie wiem czemu. Oto kod

Procedure Wyprowadzanie;

Var

i: byte;

Begin

clrscr;

writeln(‘WYPISANIE BAZY DANYCH’);

writeln;

assign(f,‘minibaza.dat’);

reset(f);

while not eof(f) do

Begin

for i:=1 to ilosob do

Begin

read(f, osoba_);_

with osoba do

Begin

write('Imie: '); writeln(osoba_.imie);_

write('Nazwisko: '); writeln(osoba_.nazwisko);_

write('Data urodzenia: '); write(osoba_.dzienur); write(’.’); write(osoba__.miesiacur); write(’.’); writeln(osoba__.rokur);_

End;

End;

End;

End;

Pewnie przekraczasz rozmiar tablicy osoba.

Oraz, otwierasz plik ale go nie zamykasz. Otwierasz niepotrzebnie, bo go nie czytasz.

dobra prawie wszystko juz dizła ale mam jescze 2 problemy:

1 problem:

Chce dodac do abzy opcje exportu danych do pliku txt w wybranym miejscu na dysku. Oto procedura co jest w niej nie tak, co mam zmienic i jak zrobic aby wczytane dane byly wykorzystywane przy sciezce:

Procedure Eksportuj;

Var

dysk: char;

sciezka, nazwa: string;

i: byte;

Begin

write('Podaj dysk: ');

readln(upcase(dysk));

write('Podaj wzgledna sciezke: ');

readln(sciezka);

write('Podaj nazwe pliku: ');

readln(nazwa);

assign(f,‘minibaza.dat’);

reset(f);

while not eof(f) do

Begin

for i:=1 to ilosob do

Begin

read(f, osoba_);_

with osoba do

Begin

assign(t, ‘C:\Users\anton86993\Desktop\MiniBazaDanych\EXPORT FILES\plik1.txt’);

rewrite(t);

write('Imie: '); writeln(osoba_.imie);_

write('Nazwisko: '); writeln(osoba_.nazwisko);_

write('Data urodzenia: '); write(osoba_.dzienur); write(’.’); write(osoba__.miesiacur); write(’.’); writeln(osoba__.rokur);_

close(t);

End;

End;

End;

close(f);

writeln(‘EKSPORTOWANIE ZOSTALO POMYSLNIE ZAKONCZONE!’);

delay(1500);

End;

2 problem

Gdy chce przeszukac baze danych wdelug dango kryterum wykorzystuje zmienna opcja, ktora mowi wedlug czego ma przeszukac. Program sie kompiluje tylko ze jak wezme byle jakie kryterium to nei przechodiz dalej tylko sie zapetla. oto procedura:

Procedure Przeszukuj;

Var

opcja: byte;

Begin

Repeat

write('Wedlug jakich kryteri zamierzasz szukac: ');

readln(opcja);

if (opcja>6) then writeln(‘WYBIERZ POPRAWNA OPCJE!’);

Until (opcja<=6);

End;

OTO PROGRAM GLOWNY:

Begin

Repeat

Menu;

Repeat

Wybor;

Until decyzja in [1, 2, 3, 4, 5, 6, 7];

if decyzja<>7 then

Begin

case decyzja of

1: Wprowadzanie;

2: Wyprowadzanie;

3: Begin

Repeat

PrzeszukajMenu;

Repeat

Przeszukuj;

Until opcja in [1, 2, 3, 4, 5, 6];

if opcja<>6 then

Begin

case opcja of

1: SzukajWgImienia;

2: SzukajWgNazwiska;

3: SzukajWgDniaUr;

4: SzukajWgMiesiacaUr;

5: SzukajWgRokuUr;

6: Exit;

End;

End;

Until opcja=6;

End;

4: writeln(‘OPCJA AKTUALNIE NIEDOSTEPNA!’);

5: Eksportuj;

6: Clrscr;

7: Exit;

End;

End;

Until decyzja=7;

End;

SORRY ŻE PYTAM SIĘ O TAK GŁUPIE I BŁACHE SPRAWY ALE JESTEM DOPIERO POCZĄTKUJĄCYM NIEDOSWADCZONYM PROGRAMISTA I MUSZE SIĘ JAKOS NAUCZYC, A JAK WIADOMO CZLOWIEK NAJLEPIEJ UCZY SIE NA WŁASNYCH BŁĘDACH :slight_smile: NEI OD RAZU KRAKOW ZBUDOWANO :stuck_out_tongue_winking_eye:

assign(f,dysk+sciezka+nazwa);

A co odnośnie pkt. 2?

anton86993 , proszę zapoznaj się z tą stroną oraz tym tematem, a następnie popraw tytuł tematu, używając przycisku ac7a4cd89050aa6e.gif

ad pkt. 2

Program się nie zawiesza tylko oczekuje na wprowadzenie, nie pokazując że czegoś oczekuje od użytkownika.

Jednak może być jeszcze coś nie widzę w jaki sposób przekazujesz wartość zmiennej opcja z PrzeszukajMenu do głównego programu.

Temat uważam za zamknięty!