qweir205 Napisano Maj 25, 2015 Zgłoś Share Napisano Maj 25, 2015 Mam pytanie.Jak powinien wyglądać schemat takiego algorytmu. Mam rekord na którego podstawie powstaje główna lista. I jak zrobić by w kontakcie można było wpisać wiele np numerów czy emaili ,Wiem że to ma być za pomocą listy w liście głównej.Pytam sie was jak zroobić by wczytywać np kilka numerów czy emaili do kazdego kontaktu. program baza_kontaktow; uses crt; type wskaznik = ^kontakt; kontakt = record ID:integer; imie : string[20]; nazwisko: string[20]; miasto: string[20]; ulica: string[20]; nr_d: integer; nr_m: string[20]; kod_p: string[6]; poczta: string[20]; numer:real; email:string[30]; next : wskaznik; prev : wskaznik; end; var head:wskaznik; procedure dodaj_kontakt(var head : wskaznik); var tmp, pom : wskaznik; i,n:byte; begin clrscr; new(tmp); write('Nazwisko: '); readln(tmp^.nazwisko); write('Imie: '); readln(tmp^.imie); write('Numer telefonu:'); readln(tmp^.numer); write('Email:'); readln(tmp^.email); write('Miasto: '); readln(tmp^.miasto); write('Ulica: '); readln(tmp^.ulica); write('Numer domu:'); readln(tmp^.nr_d); write('Numer mieszkania:'); readln(tmp^.nr_m); write('Kod pocztowy:'); readln(tmp^.kod_p); write('Poczta:'); readln(tmp^.poczta); tmp^.next := nil; if head = nil then begin tmp^.ID:=1; tmp^.prev := nil; head := tmp ; end else begin pom := head; while pom^.next <> nil do pom := pom^.next; pom^.next := tmp; tmp^.prev := pom; tmp^.next := nil; tmp^.ID:=tmp^.prev^.ID+1; end; end; procedure wyswietl(head : wskaznik); begin clrscr; if head = nil then write('Brak kontaktow') else begin while head <> nil do begin writeln('ID:',head^.ID,' | Nazwisko i imie:',head^.nazwisko, ' ', head^.imie,' | Numer tel.:',head^.numer:9:0,' | Email:',head^.email,' | ADRES:',head^.miasto,' ul.',head^.ulica,' ',head^.nr_d,' m.',head^.nr_m, ' ',head^.kod_p,' ',head^.poczta); writeln; head := head^.next; end; end; readln; end; procedure usun_dane(var head : wskaznik); begin if head = nil then write('brak elemntow do usuniecia') else begin while head <> nil do begin dispose(head); head := head^.next; end; end; end; function szukaj(head : wskaznik; nazwisko : string) : wskaznik; begin while (head <> nil) and (head^.nazwisko <> nazwisko) do head := head^.next; szukaj := head; end; procedure usun_wybrany_kontakt(var head : wskaznik); var pom, tmp , pom2: wskaznik; nazwisko : string[30]; begin write('Podaj nazwisko: '); readln(nazwisko); tmp := szukaj(head, nazwisko); if tmp = nil then write('Nie ma takiego ukontaktu') else begin if tmp = head then begin head := head^.next; head^.prev := nil; dispose(tmp); end else begin pom := head; while pom^.next <> tmp do pom := pom^.next; pom^.next := tmp^.next; if tmp^.next <> nil then tmp^.next^.prev := pom; dispose(tmp); end; end; readln; end; procedure wyszukaj(var head : wskaznik); var pom, tmp , pom2: wskaznik; nazwisko : string[30]; begin write('Podaj nazwisko: '); readln(nazwisko); tmp := szukaj(head, nazwisko); if tmp = nil then write('Nie ma takiego kontaktu') else begin if tmp <> nil then begin writeln('ID:',tmp^.ID,' | Nazwisko i imie:',tmp^.nazwisko, ' ', tmp^.imie,' | Numer tel.:',tmp^.numer:9:0,' | Email:',tmp^.email,' | ADRES:',tmp^.miasto,' ul.',tmp^.ulica,' ',tmp^.nr_d,' m.',tmp^.nr_m, ' ',tmp^.kod_p,' ',tmp^.poczta); writeln; end; end; readln; end; var i : integer; tmp : wskaznik; begin repeat clrscr; writeln('1. Dodaj kontakt'); writeln('2. Wyswietl kontakty'); writeln('3. Usun wybrany kontakt'); writeln('4. Usun wszystkie kontakty'); writeln('5. Zapisz kontakty do pliku'); writeln('6. Usun plik'); writeln('7. Wyszukaj kontakt'); writeln('0. Wyjscie'); writeln; write('Twoj wybor: '); readln(i); if i = 1 then dodaj_kontakt(tmp); if i = 2 then wyswietl(tmp); if i = 3 then usun_wybrany_kontakt(tmp); if i = 4 then usun_dane(tmp); if i = 7 then wyszukaj(tmp); until i = 0; end. Link do komentarza Udostępnij na innych stronach More sharing options...
Kaczus Napisano Maj 26, 2015 Zgłoś Share Napisano Maj 26, 2015 Podejścia do problemu sa 2. 1) jeśli znasz maksymalną ilość numerów i adresów, to przewidujesz miejsce na nie w strukturze (mało eleganckie, ale szybkie i proste) 2) mozesz skonstruować kolejne struktury, ktore byłyby powiązane z glownym rekordem. W efekcie będziesz miał 3 tabele - tabela glowna, oraz tabele powiązane, gdzie będą np pola id, id_kontakt, adresemail i podobnie z telefonem. Powiązanie poprzez numer id_kontakt. Link do komentarza Udostępnij na innych stronach More sharing options...
qweir205 Napisano Maj 26, 2015 Autor Zgłoś Share Napisano Maj 26, 2015 No właśnie mam zrobić to dynamicznie. Myślałem czy to będzie działało gdy w rekordzie dam wskażnik na inny rekord np z numerem i jakby ta lista z numerami była podczepiana do listy głównej,ale nie wiem czy sie tak da. Wrzucam to co zrobiłem ,kompiluje ale nie działa. Jesem początkujący i nie moge rozgryść tego. program baza_kontaktow; uses crt; type wskaznik = ^kontakt; wskaznik2 = ^numery; kontakt = record ID:integer; imie : string[20]; nazwisko: string[20]; miasto: string[20]; ulica: string[20]; nr_d: integer; nr_m: string[20]; kod_p: string[6]; poczta: string[20]; numer:real; email:string[30]; numer2: wskaznik2; next : wskaznik; prev : wskaznik; end; numery = record numer:real; next : wskaznik2; end; var head:wskaznik; procedure dodaj_numery(var head2 :wskaznik2;i:byte); var num,pom2:wskaznik2; begin new(num); writeln('Podaj ',i,' numer'); readln(num^.numer); num^.next:=nil; if head2=nil then head2:=num else begin pom2:=head2; while pom2^.next <> nil do pom2:=pom2^.next; pom2^.next:=num; end; end; procedure dodaj_kontakt(var head : wskaznik); var tmp, pom : wskaznik; num:wskaznik2; i,n:byte; begin clrscr; new(tmp); write('Nazwisko: '); readln(tmp^.nazwisko); write('Imie: '); readln(tmp^.imie); write('Numer telefonu:'); readln(tmp^.numer); write('Email:'); readln(tmp^.email); write('Miasto: '); readln(tmp^.miasto); write('Ulica: '); readln(tmp^.ulica); write('Numer domu:'); readln(tmp^.nr_d); write('Numer mieszkania:'); readln(tmp^.nr_m); write('Kod pocztowy:'); readln(tmp^.kod_p); write('Poczta:'); readln(tmp^.poczta); writeln('Ile kontaktow?'); readln(n); for i:=1 to n do begin num:=tmp^.numer2; dodaj_numery(num,i); end; tmp^.next := nil; if head = nil then begin tmp^.ID:=1; tmp^.prev := nil; head := tmp ; end else begin pom := head; while pom^.next <> nil do pom := pom^.next; pom^.next := tmp; tmp^.prev := pom; tmp^.next := nil; tmp^.ID:=tmp^.prev^.ID+1; end; end; procedure wyswietl_numery(head2:wskaznik2); var i:byte; begin i:=0; if head2 = nil then write('Brak numerow') else begin while head2<>nil do begin i:=i+1; writeln('Numer',i,': ',head2^.numer); head2:=head2^.next; end;end; end; procedure wyswietl(head : wskaznik); begin clrscr; if head = nil then write('Brak kontaktow') else begin while head <> nil do begin writeln('ID:',head^.ID,' | Nazwisko i imie:',head^.nazwisko, ' ', head^.imie,' | Numer tel.:',head^.numer:9:0,' | Email:',head^.email,' | ADRES:',head^.miasto,' ul.',head^.ulica,' ',head^.nr_d,' m.',head^.nr_m, ' ',head^.kod_p,' ',head^.poczta); wyswietl_numery(head^.numer2); head := head^.next; end; end; readln; end; var i : integer; tmp : wskaznik; begin repeat clrscr; writeln('1. Dodaj kontakt'); writeln('2. Wyswietl kontakty'); writeln('0. Wyjscie'); writeln; write('Twoj wybor: '); readln(i); if i = 1 then dodaj_kontakt(tmp); if i = 2 then wyswietl(tmp); until i = 0; end. Link do komentarza Udostępnij na innych stronach More sharing options...
Kaczus Napisano Maj 26, 2015 Zgłoś Share Napisano Maj 26, 2015 Zrobić to można na kilka sposobów, ja zrobiłbym 2 listę z adresami, 3 z telefonami - struktura taka jak podałem. Sortowałbym po id_kontakt. Dla optymalizacji można dać z kontaktu link do pierwszych elementów w pozostałych list. Link do komentarza Udostępnij na innych stronach More sharing options...
qweir205 Napisano Maj 26, 2015 Autor Zgłoś Share Napisano Maj 26, 2015 A jak powiązać wszystkie te listy przez id?Nie mam sposobu jak przepisać wartość id kontaktu do id numerów i emaili? Link do komentarza Udostępnij na innych stronach More sharing options...
Kaczus Napisano Maj 27, 2015 Zgłoś Share Napisano Maj 27, 2015 A jak powiązać wszystkie te listy przez id?Nie mam sposobu jak przepisać wartość id kontaktu do id numerów i emaili? w kontaktach masz id osoby, ten sam id przypisujesz do numerów i adresów. później jak masz posortowane tamte listy wzgledem tego id, wyszukanie to chwila. Link do komentarza Udostępnij na innych stronach More sharing options...
qweir205 Napisano Maj 27, 2015 Autor Zgłoś Share Napisano Maj 27, 2015 Dzięki za pomoc.Wszystko hula Juz zapis do pliku zrobiłem,jeszcze odczyt i póżniej mysle że z górki Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.