Arbre genealògic ================ .. py:module:: genealogia Volem utilitzar un digraf de :ref:`networkx ` per a representar un arbre genealògic familiar. Els nodes del graf seran els noms de les persones (strings). Cada persona rebrà com a màxim dues arestes dirigides des dels seus dos progenitors, en cas que es coneguin. A més a més, cada node tindrà associat un `atribut de nodes de networkx `_, anomenat :py:attr:`'naix'`, corresponent a la data de naixement. Aquest atribut serà una instància de la classe :py:class:`datetime.date`. Per exemple, el següent arbre genealògic representa una família amb 20 persones: .. image:: familia.svg :align: center Deseu totes les funcions d'aquest exercici en el mòdul de nom :file:`genealogia.py`. Funció `afegir_persona` ----------------------- .. function:: afegir_persona(g, nom, data, mare, pare) :param networkx.DiGraph g: Graf que representa un arbre genealògic :param str nom: nom d'una persona :param datetime.date data: data del seu naixement :param str mare: noms del seu primer progenitor :param str pare: noms del seu segon progenitor Afegeix a *g* la persona *nom*, assignant-li com a data de naixement *data* i com a progenitors *mare* i *pare*. Si un dels dos progenitors és desconegut, el valor del paràmetre *pare* i/o *mare* serà un string buit; en aquest cas, no s'ha d'establir la relació de parentesc del(s) progenitor(s) desconegut(s). Quan s'especifiquen, tant *pare* com *mare* han de ser nodes ja existents al graf *g*. Per exemple, el següent exemple crea el graf d'un fragment de l'arbre genealògic de la figura anterior: .. literalinclude:: tests-afegir.txt :language: python :end-before: --fi-enunciat Al fitxer :download:`tests-afegir.txt` hi teniu altres jocs de proves , incloent la creació de l'arbre genealògic de l'exemple sencer. .. note:: Per tal de poder fer proves fàcilment us proporcionem el fitxer :download:`familia.py`, on hi ha la funció :py:func:`graf_familia`, que crea i retorna el graf complet de l'exemple de la figura. Per comoditat, podeu fer servir aquesta funció en el desenvolupament de la resta d'apartats. Cal, però, que la hàgiu desenvolupat correctament la funció :py:func:`afegir_persona`. Funció `nets` ------------- .. py:function:: nets(g, nom) :param networkx.DiGraph g: Graf que representa un arbre genealògic :param str nom: nom d'una persona Retorna una llista ordenada lexicogràficament amb els noms dels nets de la persona donada. A la llista retornada no hi pot haver noms repetits. Per exemple, essent *g* el graf genealògic corresponent a la figura anterior, aquesta funció ha de respondre així: .. literalinclude:: tests-nets.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de proves complementaris al fitxer :download:`tests-nets.txt`. Funció `avis` ------------- .. py:function:: avis(g, nom) :param networkx.DiGraph g: Graf que representa un arbre genealògic :param str nom: nom d'una persona Retorna una llista ordenada lexicogràficament amb els noms dels avis coneguts de la persona donada. A la llista retornada no hi pot haver noms repetits. Per exemple, essent *g* el graf genealògic corresponent a la figura anterior, aquesta funció ha de respondre així: .. literalinclude:: tests-avis.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de proves complementaris al fitxer :download:`tests-avis.txt`. Funció `germans` ---------------- .. py:function:: germans(g, nom) :param networkx.DiGraph g: Graf que representa un arbre genealògic :param str nom: nom d'una persona Retorna el conjunt de noms (un :py:class:`set` de python) amb els noms dels germans de la persona donada. Considerem que dues persones són germanes si en el graf hi consta que són filles del mateix pare i mare. Per exemple, essent ``g`` el graf genealògic corresponent a la figura anterior, aquesta funció ha de respondre així: .. literalinclude:: tests-germans.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxers :download:`tests-germans.txt`. Funció `Primer_avantpassat` --------------------------- .. py:function:: primer_avantpassat(g, nom) :param networkx.DiGraph g: Graf que representa un arbre genealògic :param str nom: nom d'una persona Retorna el nom de l'avanpassat de la persona donada que va néixer abans, segons consta en *g*. Per exemple, essent ``g`` el graf genealògic corresponent a la figura anterior, aquesta funció ha de respondre així: .. literalinclude:: tests-avantpassat.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxers :download:`tests-avantpassat.txt`. .. rubric:: Solucions Disposeu de les solucions proposades al fitxer :download:`genealogia.py`.