[Pascal] Wyszukiwanie po rekordach


(Dzony) #1

Witam, w programie który napisałem opartym na tablicach i rekordach nie mam pojęcia jak wprowadzić wyszukiwanie poprzez rekordy... Kombinowałem już na kilka sposobów, próbowałem wprowadzać dodatkową zmienną, zresztą; proszę o poprawienie opcji szukaj. Reszta zdaje się działać normalnie :wink:

program Ksiazka_Telefoniczna;

uses CRT;

 type

 spis_osob = record

  Imie,nazwisko,adres,miasto,numer:string;

  spis_osob:array[1..100] of string;

  end;

 var

  osoba:spis_osob;

  r,r2:char;

  ilosc:byte;

  d1:byte;

  plik:text;


PROCEDURE Wprowadz;

begin

  ClrScr;

  Ilosc:=ilosc+1;

  writeln('Imie');

  readln(osoba.Imie[ilosc]);

  writeln('Nazwisko');

  readln(osoba.nazwisko[ilosc]);

  writeln('Adres');

  readln(osoba.adres[ilosc]);

  writeln('Miasto');

  readln(osoba.miasto[ilosc]);

  writeln('Numer telefonu');

  readln(osoba.numer[ilosc]);


 end;


procedure Wyswietl;

begin

  ClrScr;

  write('Numer wpisu ? (1..', ilosc ,') :');

  readln(d1);

  writeln('Imie : ',osoba.Imie[d1] );

  writeln('Nazwisko : ',osoba.nazwisko[d1] );

  writeln('Adres : ',osoba.adres[d1] );

  writeln('Miasto : ',osoba.miasto[d1] );

  writeln('Numer telefonu : ',osoba.numer[d1] );

  writeln;

  write('Naciśnij Enter...');

  r2:=readkey;

end;



procedure Zapisz;

begin

  assign(plik,'BAZA.GIO');

  rewrite(plik);

  writeln(plik,ilosc);

  d1:=0;

  repeat

    d1:=d1+1;

    writeln(plik,osoba.Imie[d1] );

    writeln(plik,osoba.nazwisko[d1] );

    writeln(plik,osoba.adres[d1] );

    writeln(plik,osoba.miasto[d1] );

    writeln(plik,osoba.numer[d1] );

  until d1=ilosc;

  close(plik);

end;


procedure czytaj;

begin

  assign(plik,'BAZA.GIO');

  reset(plik);

  readln(plik,ilosc);

  d1:=0;

  repeat

    d1:=d1+1;

    readln(plik,osoba.Imie[d1] );

    readln(plik,osoba.nazwisko[d1] );

    readln(plik,osoba.adres[d1] );

    readln(plik,osoba.miasto[d1] );

    readln(plik,osoba.numer[d1] );

  until d1=ilosc;

  close(plik);

end;


procedure szukaj;

begin

  writeln('Proszę wprowadzić nazwisko:');

  readln(osoba.nazwisko);

  for ilosc:=1 to d1 do

    if osoba.nazwisko = spis_osob[d1] then

    writeln('znaleziono: ', osoba.nazwisko[d1], ' miejscowosc: ', osoba.miasto[d1]);

    readln;


begin

  Ilosc:=0;

  repeat

  ClrScr;

  writeln('1. Nowy wpis');

  writeln('2. Wyświetl wpisy');

  writeln('3. Odczyt z bazy');

  writeln('4. Zapis do bazy');

  writeln('9. Koniec programu');

    repeat

      r:=readkey;

    until (r>='1') and (r<='9');

  If r='1' then Wprowadz;

  If r='2' Then Wyswietl;

  If r='3' Then Czytaj;

  If r='4' Then Zapisz;

  If r='5' Then Szukaj;

  Until r='9';

End.

z góry dzięki za pomoc w poprawieniu :>.


([alex]) #2

To nie może działać:

  1. rekord typu spis_osob nie jest w stanie przechowywać więcej niż jedną osobę.

  2. osoba.Imie[d1] - zwróci znak o numerze d1 z jedynego rekordu w rekordzie osoba

  3. w procedurze szukaj brakuje end;

Proponuje:

spis_osob = array[1..100] of record

Imie,nazwisko,adres,miasto,numer:string;

end;

zamiast: osoba.Imie[N], piszemy osoba[N].Imie tak samo z nazwiskiem, miastem itd.

Dla szukania wczytać z klawiatury nazwisko do dodatkowej zmiennej: n1:string;

procedure szukaj;

begin

  ClrScr;

  writeln('Proszę wprowadzić nazwisko:');

  readln(n1);

  for d1:=1 to ilosc do

    if n1 = spis_osob[d1].nazwisko then

    begin

       writeln('Imie : ',osoba[d1].Imie );

       writeln('Nazwisko : ',osoba[d1].nazwisko );

       writeln('Adres : ',osoba[d1].adres );

       writeln('Miasto : ',osoba[d1].miasto );

       writeln('Numer telefonu : ',osoba[d1].numer );

       Break;

    end;

  write('Naciśnij Enter...');

  readkey;

end;

(Dzony) #3

poprawiłem w sposób który poleciłeś, i mimo iż wszystko się kompiluje, zdaje się działać poprawnie o porównywać szukaną zmienną z rekordem a następnie to wyświetlać, nie robi tego...

program Ksiazka_Telefoniczna;

uses CRT;

 type

 spis_osob = array[1..100] of record

  Imie,nazwisko,adres,miasto,numer:string;

  end;

 var

  osoba:spis_osob;

  r,r2:char;

  ilosc:byte;

  d1:byte;

  plik:text;

  n1:string;


PROCEDURE Wprowadz;

begin

  ClrScr;

  Ilosc:=ilosc+1;

  writeln('Imie');

  readln(osoba[ilosc].Imie);

  writeln('Nazwisko');

  readln(osoba[ilosc].nazwisko);

  writeln('Adres');

  readln(osoba[ilosc].adres);

  writeln('Miasto');

  readln(osoba[ilosc].miasto);

  writeln('Numer telefonu');

  readln(osoba[ilosc].numer);


 end;


procedure Wyswietl;

begin

  ClrScr;

  write('Numer wpisu ? (1..', ilosc ,') :');

  readln(d1);

  writeln('Imie : ',osoba[d1].Imie );

  writeln('Nazwisko : ',osoba[d1].nazwisko );

  writeln('Adres : ',osoba[d1].adres );

  writeln('Miasto : ',osoba[d1].miasto );

  writeln('Numer telefonu : ',osoba[d1].numer );

  writeln;

  write('Naciśnij Enter...');

  r2:=readkey;

end;



procedure Zapisz;

begin

  assign(plik,'BAZA.GIO');

  rewrite(plik);

  writeln(plik,ilosc);

  d1:=0;

  repeat

    d1:=d1+1;

    writeln(plik,osoba[d1].Imie );

    writeln(plik,osoba[d1].nazwisko );

    writeln(plik,osoba[d1].adres );

    writeln(plik,osoba[d1].miasto );

    writeln(plik,osoba[d1].numer );

  until d1=ilosc;

  close(plik);

end;


procedure czytaj;

begin

  assign(plik,'BAZA.GIO');

  reset(plik);

  readln(plik,ilosc);

  d1:=0;

  repeat

    d1:=d1+1;

    readln(plik,osoba[d1].Imie );

    readln(plik,osoba[d1].nazwisko );

    readln(plik,osoba[d1].adres );

    readln(plik,osoba[d1].miasto );

    readln(plik,osoba[d1].numer );

  until d1=ilosc;

  close(plik);

end;


procedure szukaj;

begin

  ClrScr;

  writeln('Proszę wprowadzić nazwisko:');

  readln(n1);

  for d1:=1 to ilosc do

    if n1='spis_osob[d1].nazwisko' then

    begin

       writeln('Imie : ',osoba[d1].Imie );

       writeln('Nazwisko : ',osoba[d1].nazwisko );

       writeln('Adres : ',osoba[d1].adres );

       writeln('Miasto : ',osoba[d1].miasto );

       writeln('Numer telefonu : ',osoba[d1].numer );

       Break;

    end;

  write('Naciśnij Enter...');

  readkey;

end;


begin

  Ilosc:=0;

  repeat

  ClrScr;

  writeln('1. Nowy wpis');

  writeln('2. Wyświetl wpisy');

  writeln('3. Odczyt z bazy');

  writeln('4. Zapis do bazy');

  writeln('5. Szukaj wpisu');

  writeln('9. Koniec programu');

    repeat

      r:=readkey;

    until (r>='1') and (r<='9');

  If r='1' then Wprowadz;

  If r='2' Then Wyswietl;

  If r='3' Then czytaj;

  If r='4' Then Zapisz;

  If r='5' Then szukaj;

  Until r='9';

End.

jeśli ktoś mógłby na to rzucić raz jeszcze okiem i doszukać się błędu w owej procedurze, byłbym wdzięczny.


([alex]) #4
if n1=osoba[d1].nazwisko then

Czy ty cokolwiek rozumiesz w tym kodzie ?


(Dzony) #5

Tak :wink:.


([alex]) #6

To wywal Break; w wyszukiwaniu :stuck_out_tongue: , może być kilka osób o tym samym nazwisku.


(Dzony) #7

Próbowałeś to kompilować? Instrukcja warunkowa if.. then writeln zostaje pominięta i przechodzi do ''nacisnij enter...' , jak gdyby pętla była nieprawidłowa :razz:


([alex]) #8

To zmień sobie kod na:

procedure szukaj;

    begin

      ClrScr;

      writeln('Proszę wprowadzić nazwisko:');

      readln(n1);

      for d1:=1 to ilosc do

        if n1=osoba[d1].nazwisko then

        begin

           writeln('Imie : ',osoba[d1].Imie );

           writeln('Nazwisko : ',osoba[d1].nazwisko );

           writeln('Adres : ',osoba[d1].adres );

           writeln('Miasto : ',osoba[d1].miasto );

           writeln('Numer telefonu : ',osoba[d1].numer );

           write('Szukacz dalej [T/N]: ');

           repeat

              r2:=UpCase(readkey);

           until (r2='T') or (r2='N');

           if r2<>'T' then Break;

        end;

    end;