A családi kapcsolatok „különlegessége” az, hogy a leszármazási viszonyban 1) a közvetlen őst egy szülőpár alkotja, 2) miközben közvetlen leszármazott akár több is lehet. Ilyen formán egy N-áris faként kezelhető.
A mi általunk megvalósítandó családfában a közvetlen ős szerepébe az anyát képzeljük, hogy az ábrázolási bonyodalmakat elkerüljük.
A családfa ábrázolásánál az előadás 2. diáján szereplőkből indulunk ki.
Most nem dinamikus láncolással oldjuk meg a fa ábrázolását, hanem a C++ STL vector-ával (azaz dinamikus tömbbel). Kérdés: Mik a vector fogalmához tartozó legfontosabb műveletek? Súgjak? clear(), push_back(e), size(), resize(m), [i], at(i), erase(i)
A családfákhoz létrehozzuk a CsalFa osztályt. Ennek adatait –a bináris fákhoz hasonlóan– két szinten definiáljuk, amelyek egy TElem típuson nyugszanak:
Típus CsalFaElem(TElem)=Rekord( def:Logikai [definiált-e?] elem:TElem szülő:Egész [szülőindex]) CsalFa(TElem)=Rekord( tagok:Tömb(CsalFaElem(TElem)) tagDb:Egész kapcsDb:Egész)
Megjegyzések:
A CsalFa típuskonstrukciót C++ sablon-osztályként implementáljuk – szokásunknak megfelelően. Óhatatlanul az ehhez tartozó „szókincs” kibővül és némileg módosul is az előadáson szereplőhöz képest. Pirossal ki is emeltük e nyelvi eltéréseket.
#define NincsOse 0 template <class TElem> struct CsalFaElem{ bool def;//definiált-e? TElem elem; int szulo;//szülőindex }; template <class TElem> class CsalFa{ private: typedef CsalFaElem<TElem> TVFE;//Vektoros CsalFaElem típus vector<TVFE> tagok; int tagDb; int kapcsDb; public: CsalFa(){//alap konstruktor tagDb=0; tagok.clear(); kapcsDb=0; //a nem használt 0. elem létrehozása: TVFE vfe; vfe.def=false; vfe.szulo=NincsOse; tagok.push_back(vfe); }; CsalFa(int tgDb){//konstruktor: //Ef: tgDb≥0 tagDb=tgDb; tagok.resize(tagDb+1); kapcsDb=0; for(int i=0;i<=tagDb;++i){ tagok[i].def=false; tagok[i].szulo=NincsOse; } }; void Ures(){ //Ef: ∃self tagDb=0; tagok.clear(); kapcsDb=0; TVFE vfe; vfe.def=false; vfe.szulo=NincsOse; tagok.push_back(vfe); }; void CsalFaFeltolt(string fN);//fájlból újratölt, átméretez bool UresE(); int TagDb();//családfa egyedeinek a száma int KapcsolatDb();//családfa kapcsolatok száma void BeillesztTag(int gyerek, TElem elem); void BeillesztKapcs(int gyerek, int szulo); int OsSzulo(int e); bool OseE(int utod, int os); bool DefinialtTagE(int dik); TElem TagErtek(int dik); int TagSzuloje(int dik); bool ValodiOseE(int utod, int os); int CsaladokSzama(); vector<TElem> Osok(); };
Kérdés, megjegyzés:
Töltse le CsalFa modul fejállományát: CsalFa0.h!
Töltse le a modul félig kész, implementációt tartalmazó CsaFa0.cpp fájlt, és a hiányzó részeket pótolja! A hiányzó részeket „üres kommentek” jelzik. Keressen ilyeneket: //... !
A családfa műveleteinek megvalósításánál az előadás 3-5. diáján szereplőkből indulhat ki. A fogalmazza meg a tagfüggvények előfeltételeit; és ezek telesülését assert()-ekkel ellenőriztesse!
Töltse le a próbaprogramot tartalmazó CsalFaProba0.cpp fájlt, és elemezze a futó program outputjainak és a kódnak egybevetésével! Majd folytassa további tesztelő részekkel! Ügyeljen arra, hogy hivatkozok az AltalanosRutinok.cpp include-ra, ezért azt is le kell töltenie, valamint a hivatkozást hozzá kell igazítania a letöltés helyéhez! Valami ilyesmire gondoltam: lássa az én megoldásom kezdeményét!
Ezekre a példa bemeneti fájlokra szüksége lehet:
Készítse el a CsalFa kékített tagfüggvényeit!