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ó retorna True si 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 fitxer vots.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.