Baza danych na wskaźnikach.

0

Witam, pisze program na zaliczenie w pascalu. Program to baza danych salonu samochodowego... Opierać ma ona się na tym, że jeden samochod może zostać wypozyczony tylko przez jednego klienta, ale jeden klient może wypożyczyć wiele samochodow.
może nieco dla rozjaśnienia:

http://i.imgur.com/IpFezOJ.png

stworzyłem już strukture drzewa binarnego dla klientów(kluczem nazwisko), dla samochodów(kluczem marka) , ich wyświetlanie oraz wyszukiwanie wg marki. teraz mam 2 małe(...) problemy, z którymi męcze się od kilku godzin.

  1. jak zaimplementować wskaźnik z klienta na samochod, ktory on wybierze ? (wpisując id samochodu)

typy:

type
   samochod = record
      marka, model, silnik, wyposazenie :string[20];
      cena:real;
      id,id_klienta:integer;

   end;
   klient = record
      imie,nazwisko:string[20];
      id_klienta:integer;
   end;

PS=^SamEle;
     SamEle=record
        dane:samochod;
        l,r:PS;
     end;
PK=^KliEle;
    KliEle=record
      dane:klient;
      next:PK;
      l,r:PK;
      samochod:PS;
     end;              

a tutaj procedura wstawiania klienta do drzewa, w której nie wiem jak zrobić wskaźnik na wybrany samochod...

procedure wstawklienta(var root2: PK;nowy_kli:klient);
  begin
     if root2=nil then
      begin
       new(root2);
       root2^.dane:=nowy_kli;
       root2^.samochod:= ???????;
       root2^.r:=nil;
       root2^.l:=nil;
      end
      else
       begin
        if root2^.dane.nazwisko>nowy_kli.nazwisko then
         wstawklienta(root2^.r,nowy_kli)
        else
         wstawklienta(root2^.l,nowy_kli);
       end;
  end;        
procedure wstawsam(var root: PS;var nowy_sam: samochod);
  begin
     if root=nil then
      begin
       new(root);
       root^.dane:=nowy_sam;
       root^.r:=nil;
       root^.l:=nil;
      end
      else
       begin
        if root^.dane.marka>nowy_sam.marka then
         wstawsam(root^.r,nowy_sam)
        else
         wstawsam(root^.l,nowy_sam);
       end;
  end;        
  1. jak zapisać i odczytać drzewo do/z pliku? z listą jednokierunkową nie miałem problemów, działała bez zarzutów, ale tam nie było rekurencji. w drzewach wykorzystuje się rekurencję...

przeszukałem chyba cały internet i rozwiązania, ani wskazówki nie znalazłem :(

0

Pierwsza i podstawowa zasada zapisywania list do plików. Nie zapisuj wskaźnika do pliku.

0

dlaczego?

czyli zapis:

write(Plik, t^);
         writeln;
         t:=t^.next; 

jest błędem? w takim razie jak inaczej zapisać? ...

dobra, znalazłem temat na forum mniej więcej o co chodzi z tym że nie moge... ale to i tak nic mi nie pomaga przy rozwiązaniu obydwu problemów..

0

Ad.1. Wskaźniki już są zaimplementowane, nie trzeba je więcej implementować, wystarczy użyć.
Ad.2. Do pliku zapisuj same rekordy bez wskaźników np postorder, podczas odczytu normalnie je dodajesz do drzewa.

0
  1. właśnie w tym problem jak je użyć? chce, aby dla klienta był przypisany dowolny samochod z drugiego drzewa. Dla przykładu:

Imie: Jan
Nazwisko: Kowalski
id_klienta: 2002 (dowolny losowy int)
Czy chcesz klientowi przypisać samochód?(T/N)    {wypozyczenie samochodu}

Jeżeli tak, to 

id_samochodu: 5     {tu uzytkownik sam wpisuje jakie id, jeżeli wpisze id, które nie istnieje, wyswietli się komunikat, że id samochodu nie istnieje }

Jeżeli nie, to wyjście, a potem w dowolnej chwili można przypisać istniejącemu klientowi samochod.
  1. wiem, że musze każdy rekord z osobna, problem w tym, jak naraz zająć się dwojgiem dzieci? we wstawianiu czy wyświetlaniu, wykorzystuje się rekurencje:
procedure wyswietlkli(root2:PK);
begin
      if root2<>nil then
       begin
           wyswietlkli(root2^.r);
           writeln ('Imie       : ',root2^.dane.imie);
           writeln ('Nazwisko   : ',root2^.dane.nazwisko);
           writeln ('ID_Klienta : ',root2^.dane.id_klienta);
           writeln;
           wyswietlkli(root2^.l);
       end;
end;           

w procedurze zapisu chyba tej rekurencji nie moge wykorzystać, bo wtedy za każdym razem byłby otwierany plik? doszedłem do wersji, gdzie zapisywana jest tylko jedna gałąź(left)

procedure zapiszsam(t:PS;nazwa:String);
var
plik: File of samochod;
decyzja:char;

begin
      writeln('Podaj pelna nazwe pliku dozapisu: ');
      readln(nazwa);
      if PlikIstnieje(nazwa)=true then
       begin
        write('Podany plik istnieje! Chcesz nadpisac plik? (T/N)');
        readln(decyzja);
       if (decyzja='t')or(decyzja='T') then
        begin
         assign(plik, nazwa);
         rewrite(plik);
         while t <> nil do
          begin
           write(Plik, t^.dane);
           writeln;
           t:=t^.l;

         end;
         close(plik);
         writeln('Zapis zakonczony, wcisnij dowolny klawisz');
         readln;
       end;

      end;                                          

2

Ad.1. Z czym konkretnie masz problem? Ze znalezieniem samochodu wg Id czy z przypisaniem wskaźnikowi znalezionego samochodu?
Ad.2. "... w procedurze zapisu chyba tej rekurencji nie moge wykorzystać ...": - Kto ci powiedział taką głupotę:

procedure zapiszsam(t:PS;nazwa:String);
plik: File of samochod;
decyzja:char;
   procedure zapisuje(node:PS);
   begin
     if node=nil then Exit;
     Write(t^.dane);
     zapisuje(t^.l);
     zapisuje(t^.r);
   end; 
begin
   ...
   zapisuje(t);
   ...
end;
0

O kurde... rzeczywiscie, przeogromne dzięki. Zapisywanie i odczytywanie mi działa.

No to teraz ten większy problem...

Mam procedure wyszukującą samochód po marce, wiec z procedurą wyszukującą po ID nie będe miał problemów. Problem jest

_13th_Dragon napisał(a):

z przypisaniem wskaźnikowi znalezionego samochodu?

jeszcze raz w wielkim skrócie:

  1. wpisuje klientów do bazy
  2. po wpisaniu nazwiska, chce wypozyczyć/przypisać mu dany samochod lub nie
    2a) jeżeli tak to:
    • wpisuje id samochodu
    • jeżeli id nie ma, to odpowiedni komunikat że samochodu nie ma ( lub napisze procedure z dostępnymi id)
    • jeżeli jest takie id, to szukam w drzewie samochododow id (?)
    • przypisuje klientowi znaleziony samochod ( jak? )
      2b) jeżeli nie
    • wyjście do menu
    • i potem w kazdej chwili moge klientowi bez samochodu przypisac nowy // z tym też
    • lub klientowi ktory ma samochod przypisac nowy (klient moze miec wiele samochodow) // mam
    • pamiętając o tym, że jeden samochod moze miec jednego klienta... // problem(brak pomysłu na procedury)
0

Widzę że potrzebujesz przynajmniej pobieżnie przejrzeć pierwszy lepszy kurs.
Bo skoro nawet z tym: " - wyjście do menu // z tym" masz problem, czyli nie wiesz że istnieje exit; - to czytać podstawy.

0

nie mam problemu z wyjściem do menu, tylko z tym jak to wszystko zorganizować... czyli cały punkt 2)b
chodzi mi o strukture, jak to wszystko ładnie ogarnąć.

ale to jest problem kolejny, nad którym rozwodził się bede gdy uda mi się przypisać samochód klientowi :)

serio nikt nie chce pomóc? :(

stanąłem na tym... i nie wiem co dalej... jak przypisać cholernemu klientowi samochód lub samochód klientowi? jeżeli to dwa osobne drzewa(czy też listy - jak kto woli) ? :< święta są a ja zamiast z rodziną to sie męcze nad tak błahą sprawą... programista ze mnie marny będzie.

0
klient = record
  imie, nazwisko : string[20];
  id_klienta : integer;
  id_samochodu : Integer;
end;
1

@babubabu, przecież on zadeklarował to lepiej:

PK=^KliEle;
    KliEle=record
      dane:klient;
      next:PK;
      l,r:PK;
      samochod:PS;
     end;

Ale wg mnie koleś chce gotowca nie mniej nie więcej.

0

13th Dragon, chce to przede wszystkim zrozumieć. zrozumiałem listy i drzewa ale jako pojedyńcze struktury, za cholere nie wiem jak mam jednemu elementowi przypisać inny element z innego drzewa

takie coś? :

write('Samochod (ID): ');
readln(nowy_kli.id_samochodu);
if root2^.samochod^.dane.id=nowy_kli.id_samochodu then
nowy_kli.id_samochodu:=nowy_sam.id 
0

kombinowałem z tym ... przy tym wyżej nie chciało się skompilować, więc próbowałem

write('Samochod (ID): ');
readln(nowy_kli.id_samochodu);
root2^.samochod^.dane.id:=nowy_kli.id_samochodu;

skompilowało się to, lecz
przy

root2^.samochod^.dane.id:=nowy_kli.id_samochodu;

wywala "SIGSEGV" wiec nie wiem juz jak to zapisać...

0

@ogs, w odpowiedzi na Twój PM - podaj link do całego projektu to sprawdzę pod debugerem, bo wątek już ma kilkanaście postów i nie chce mi się zbytnio analizować co się w kodzie zmieniło; Dużo łatwiej będzie po prostu uruchomić pod debugerem ten projekt i podglądać zmienne/parametry.

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