Vots empresa 2¶
El fitxer vots.txt conté el resultat de
la votació efectuada en una empresa. A cada línia hi ha el nom d’un
accionista, el número d’accions que té, un booleà corresponent a si és
un soci fundador de l’empresa, i un altre booleà corresponent a si aprova
la reforma proposada. Conté les línies següents:
Dani 100 True True
Manel 5 False True
Maria 30 True True
Joan 20 True True
Nuria 150 False False
les dues primeres línies corresponen al soci fundador Dani, que té 100 accions i al soci (no-fundador) Manel, amb 5 accions. Tots dos han aprovat la reforma.
Desa les funcions següents al mòdul vots2 (fitxer
vots2.py).
Dissenya la funció
persona(), que rep com a paràmetre un string amb una línia com l’anterior i retorna un tuple amb un string representant el nom, un enter representant el nombre d’accions i dos booleans representant si és soci fundador i si aprova la reforma. La funció ha d’estar documentada amb el següent doctest:>>> persona('Dani 100 True True') ('Dani', 100, True, True) >>> persona('Manel 5 False True') ('Manel', 5, False, True)
Dissenya la funció
llegir()que, donat el nom d’un fitxer, retorni una llista amb tuples com les descrites a l’apartat anterior, una per a cada persona del fitxer. La funció ha d’estar documentada amb el següent doctest:>>> lv = llegir('vots.txt') >>> lv == [ ... ('Dani', 100, True, True), ... ('Manel', 5, False, True), ... ('Maria', 30, True, True), ... ('Joan', 20, True, True), ... ('Nuria', 150, False, False)] True
Els socis fundadors tenen dret a veto. Es a dir, si un soci fundador vota en contra de la reforma, aquesta queda rebutjada. Dissenya una funció anomenada
veto()que rebi una llista de tuples com la descrita anteriorment i retorni True si algun soci fundador ha votat en contra i False en cas contrari. La funció ha d’estar documentada amb el següent doctest:>>> veto( [('Dani', 100, True, True), ('Manel', 5, False, True)]) False >>> veto( [('Manel', 5, False, False), ('Dani', 100, True, False)]) True
El vot de cada accionista està ponderat pel número d’accions que té. Així, per exemple, el vot d’un accionista val 200 si té 200 accions. Escriu una funció anomenada
percentatge()que, donada una llista de tuples com les anteriors, retorni el tant per cent de vots que han acceptat la proposta. La funció ha d’estar documentada amb el següent doctest:>>> percentatge( [('Dani', 100, True, True),('Manel', 25, False, False)] ) 80.0 >>> percentatge( [('Dani', 100, True, True), ('Manel', 5, False, True), ('Nuria', 95, False, False)] ) 52.5
Dissenya la funció
aprovada()que donat un string amb el nom del fitxer que conté una votació retornaTruesi la reforma s’ha aprovat i False altrament. La reforma s’aprovarà si ningú amb dret a veto hi ha votat en contra i si més de la meitat dels vots (ponderats) són favorables. S’han d’usar les funcions dissenyades anteriorment. En l’exemple del fitxervots.txt, la reforma s’aprovaria ja que cap soci fundador l’ha vetat i hi ha 155 vots a favor i 150 en contra.>>> aprovada('vots.txt') True
Jocs de proves i solució
Disposeu de jocs de proves al fitxer test-vots2.txt i
d’una solució al fitxer vots2.py.