Risoluzione Tracce di Esame II Modulo
Indice
[nascondi]Appello 27 Giugno 2017
Esercizio 2: Si ha la necessità di definire tre classi in Python: persona, studente, lavoratore. Le ultime due classi elencate, ovvero studente e lavoratore sono classe derivate dalla classe persona. Scrivere il codice Python che permette di definire le tre classi su elencate (tenendo conto del concetto di ereditarietà) e un piccolo main che ne richiama i metodi definiti. NOTA IMPORTANTE: si definiscano solo gli attributi (3 per la classe persona, 1 specifico di studente, 1 specifico di lavoratore) e i metodi init e str.
Codice Python Di seguito il codice python che modella l'ereditarietà tra le classi.
class Persona:
def __init__(self, nome, indirizzo, eta):
self.__nome = nome
self.__indirizzo = indirizzo
self.__eta = eta
def __str__(self):
return "Nome: "+self.__nome+", Indirizzo: "+self.__indirizzo+", Età: "+ str(self.__eta)
class Studente(Persona):
def __init__(self, nome, indirizzo, eta, voto):
Persona.__init__(self, nome, indirizzo, eta)
self.__voto = voto
def __str__(self):
return Persona.__str__(self)+", Voto: "+ str(self.__voto)
class Lavoratore(Persona):
def __init__(self, nome, indirizzo, eta, stipendio):
Persona.__init__(self, nome, indirizzo, eta)
self.__stipendio = stipendio
def __str__(self):
return Persona.__str__(self)+", Stipendio: "+ str(self.__stipendio)
Di seguito è definito una funzione main che richiama i metodi definiti.
import ereditarieta
def main():
p = ereditarieta.Persona("Paolo", "Via Italia, 5", 34)
s = ereditarieta.Studente("Antonio", "Via delle Camelie, 19", 14, 7)
l = ereditarieta.Lavoratore("Marco", "Piazza Garibaldi, 2", 54, 1000)
print(p)
print(s)
print(l)
main()
Esercizio 3: Si ha la necessità di leggere da file (.txt) i nomi dei dipendenti e il monte ore (numero non intero) degli stessi.
In particolare, il file è strutturato nel seguente modo:
I nominativi e i monte ore dovranno essere caricati prima in due liste distinte e successivamente ricopiate in un dizionario avente come chiave il nominativo e come elemento il monte ore. Il programma termina, dopo gli opportuni salvataggi, con la stampa a schermo dei nominativi con annesso monte ore e paga lorda (N.B. la paga lorda va calcolata basandosi su un costo orario unico per tutti i dipendenti acquisito da tastiera) secondo il seguente esempio: Nominativo dipendente: Paolo Rossi 47.8 ore lavorate Costo orario: 12.37 € Paga lorda: € 591.28 Nominativo dipendente: Luigi Bianchi 25.4 ore lavorate Costo orario: 12.37 € Paga lorda: € 314.20 …
Scrivere il codice Python, opportunamente strutturato in funzioni, dell’algoritmo che:
- acquisisce da tastiera il nome del file da leggere;
- legge il file e carica sia la lista dei nominativi che quella del monte ore;
- carica il dizionario con i dati inseriti nelle due liste;
- salva su file binario il dizionario;
- acquisisce da tastiera il costo orario uguale per tutti i dipendenti;
- stampa a schermo le informazioni contenute nel dizionario secondo il formato riportato in precedenza;
- gestisce le eccezioni che possono essere sollevate.
Codice Python Di seguito il codice python che implementa quanto richiesto.
import pickle
def carica_dati():
try:
#infile = open('dati.txt','r')
namefile = input('Inserire il nome del file e la sua estensione: ')
infile = open(namefile,'r')
dati = infile.readlines()
infile.close()
except Exception as err:
dati = list()
print("File non esistente")
return dati
else:
return dati
def carica_liste(dati):
nominativi = list()
ore= list()
for i in range(0,len(dati),2):
nominativi.append(dati[i].rstrip('\n'))
ore.append(float(dati[i+1].rstrip('\n')))
return nominativi, ore
def carica_dizionario(n, o):
d = dict()
for i in range(0,len(n)):
d[n[i]] = o[i]
return d
def salva_dizionario(d):
file = open('log.dat','wb')
pickle.dump(d, file)
file.close()
def visualizza_info(d, paga_oraria):
for key in d:
totale = d[key]*paga_oraria
print("Nominativo dipendente: "+key+"\t"+ str(d[key]) + " ore lavorate\t Costo orario: "+str(paga_oraria)+ "€\t Paga lorda € "+str(totale))
def main():
dati = carica_dati()
if (len(dati)>0):
try:
nominativi, ore = carica_liste(dati)
monte_ore_lav = carica_dizionario(nominativi, ore)
paga_oraria = float(input('Inserire la paga oraria in Euro: '))
salva_dizionario(monte_ore_lav)
visualizza_info(monte_ore_lav, paga_oraria)
except Exception as err:
print(err)
main()