Et simpelt stamtrae

Tags:    c++

<< < 12 > >>
Hej alle

Jeg har sat mig den opgave at lave et meget simpelt stamtrae i c++ med nogle tilsvarende krav til. Opgaven er at gemme data i et element svarende til, lad os sige, minimum 6 forfædre plus egen person. Selve dataen skal omfatte fornavn, fødselsår og rolle (familie status -fx. mor).


Det vil med andre ord sige at programmet skal se sådan ud:

Mig
Far Mor
Farmor Farfar Mormor Morfar

Farmor's forældre: Mormor's forældre:
Oldemor + Oldefar Oldemor + Oldefar

Farfar's forældre: Mofarr's forældre:
Oldemor + Oldefar Oldemor + Oldefar

Problemet er så bare hvordan jeg griber opgaven an på den mest simple måde.
Havde blandt andet tænkt på at repræsentere familiemedlemmerne i sin egen fornuftig datastruktur. Elementerne skal have mindst 2 forskellige typer, fordelt på de 3 variable/attributter/felter og så skal elementerne være i en passende container. Og containeren kunne udskrives på skærmen med brug af en iterator.

Forslag til hvordan jeg griber det hele an - punkt til punkt?

På forhånd tak for hjælpen.



11 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Lav det som en træstruktur hvor hver knude (class People) kan have en liste af børn og 2 forældre (far, mor) herefter kan du kravle gennem træet ved altid at have pointere til de forskellige forældre.
Du kan også gemme de andre data'er på brugeren.
Hvis du så skal gemme dine data kan det gøres i en database med de samme værdier som angivet før og så bygge træet op fra den person som ingen forældre har (toppen) eller hvis du vil begynde nede fra så ham der ingen børn har.



Okay, tak for hjælpen. Jeg har prøvet mig til frem, men er stadig en del usikker:

- Blandt andet med hvordan jeg får "rolle" med ind og hvordan jeg kan programmere resten af "familien efter mig, mor og far".

Fold kodeboks ind/udKode 






Du starter med at lave en Person klasse med alle de informationer du skal have for en person, dvs. navn, alder, tlf. nr. osv.

Du kan så give alle personer et unikt nummer, 0, 1, 2, osv.

Du kan bruge et stor globalt array (eller bedre, std::vector eller måske en std::map) til at indeholde alle dine personer. Således at person med nummer 0, er i index 0, personen med nummer 1 er i index 1. OSV.

Derpå skal du have tilføjet "relationer", i dette enkle tilfælde, give hver person én far og én mor, samt et antal (0..N) børn. Det betyder at en person skal nummeret på sin far (eller -1, hvis der ikke er nogen far) og nummeret på sin mor, hvis der er en.

I starten kan du bare gå ud fra at alle kun får børn med én anden person, så alle deres børn er helsøskende, og alle kan kun have én partner. Så ens søskende er ens mor eller fars børn, ens partner er ens børns anden forælder, osv.

Senere er det måske smartere at bruge pointere til at angive "relationer" og på et eller andet tidspunkt skal du nok også begynde at tage højde for at man kan have børn med mere end én anden.



Derpå skal du have tilføjet "relationer", i dette enkle tilfælde, give hver person én far og én mor, samt et antal (0..N) børn. Det betyder at en person skal nummeret på sin far (eller -1, hvis der ikke er nogen far) og nummeret på sin mor, hvis der er en.

Eller mere korrekt, hvert barn har en pointer til sin mor og en pointer til sin far.



Jeg tænkte blot at det muligvis var enklere at starte med at bruge et index i stedet for en pointer, i dette tilfælde gør det ikke den store forskel.



Tak for svaret til jer begge.

Bertel : Okay, det var meget på en gang :), men tusind tak det var nemlig lige det jeg mente med "punkt til punkt".

- Jeg har nu prøvet mig lidt frem, men da c++ ikke er min stærkeste side er jeg meget i tvivl om hvordan jeg får "sat" det hele sammen.
- Jeg har skrevet lidt kode, men er meget usikker omkring den, og hvordan kommer jeg videre herfra?:

Fold kodeboks ind/udKode 






Det var mere noget i stil med dette jeg tænkte på:
Fold kodeboks ind/udKode 


Men jeg er bange for at det er lidt for indviklet til dig, måske skulle du kikke på noget der er enklere, end at lave et stamtræ.



Ja, den er nok en anelse for indviklet for mig, men har stadig (nu hvor du har brugt tid på den) kigget den igennem og prøvet at forstå den :)

Og håber du vil forklare mig en ting jeg ikke er helt med på. Det er det med personlist. Hvad er det dét gør?
Fold kodeboks ind/udKode 


- Hvis jeg nu skulle have, for at gøre det her færdigt, farmor, farfar, mormor, morfar og oldeforældrene til henholdsvis Farmor's, farfar's, mormor's og morfar's med ...Hvad skulle jeg så gøre? Er der en enkelt måde at gøre det på?

- Kender du, ser ud til at du har meget styr på c++, eventuelt nogle opgaver el. hjemmesider man kunne kigge på hvor c++ er forklaret på et begynderniveau?

På forhånd mange tak for din tid og hjælp.






peronList er en uordnet liste over alle personer i familien. Det er her alle person informationer er gemt. Man burger et index til at "vælge" en person i listen. I mit lille eksempel har "far" som hedder "Peter" index 0.

Denne linje:
AddFather(personList[2], personList[0]);
Gør at personList[2] (Jonas) får personList[0] (Peter) som far og at Peter (far) får Jonas som barn.

Hvis du vil give Jonas en farfar, gør du det ved at give far (Peter) en far, først opfinder vi en ny ældre person i familien:
personList[4].Name = "Knud";
personList[4].Alder = 90;

Så kan vi angive Knud som far til Peter:
AddFather(personList[0], personList[4]);

Det næste logiske skridt kunne være at lave en funktion, i stil med ListFather, som udskriver en persons fars far, dvs: ListFatherFather, husk at tage højde for at ikke alle har en farfar.

Jeg har skrevet en artikel om grundlæggende C++, du kunne prøve at læse den.



Okay, nu forstår jeg det i hvert fald meget bedre end før. Jeg har prøvet at tilføje farmor, farfar, mormor, morfar på men der er et eller andet galt, for den melder om en fejl i listFatherfather:

- I første omgang har jeg kun tilføjet farfar til for lige at afprøve det, men det samme ønsker jeg at gøre med farmor, mormor, morfar (at de bliver tilføjet til "mig").

Fold kodeboks ind/udKode 






<< < 12 > >>
t