Ha az egér-kurzor ilyen:, akkor a szövegrész „kinyitható”; az aláhúzott szövegre kattintva annak leírását megjelenítheti! Egyéb pöttyözött szöveg súgást (hintet) tartalmaz.
Ugrás ide:
Alulról felfelé felépített
   fák – Családfák

Családfák ábrázolása
A CsalFa típusa
Feladatok
Házi feladatok
„Alulról” fák

Alulról felfelé felépített fák – Családfák

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.

Családfák megvalósítása

Családfák ábrázolása – algoritmikusan

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ó – kódolás

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!




Feladatok

0. feladat

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!

1. feladat

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:

2. feladat

Készítse el a CsalFa kékített tagfüggvényeit!




Házi feladatok
  1. Fejezze be a gyakorlaton befejezetlen maradt programot! Tesztelje ki alaposan: próbálja ki különféle elemtípus esetére!


Szlávi Péter