Risoluzione Tracce di Esame II Modulo: differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
(Appello 27 Giugno 2017)
Riga 1: Riga 1:
 
__FORCETOC__
 
__FORCETOC__
 +
 +
== 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.
 +
 +
<syntaxhighlight lang="python" line>
 +
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)
 +
 +
</syntaxhighlight>
 +
 +
Di seguito la funzione Main che richiama i metodi definiti.
 +
 +
<syntaxhighlight lang="python" line>
 +
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()
 +
 +
</syntaxhighlight>
 +
 +
'''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:
 +
 +
[[File:Es3_image.png]]
 +
 +
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.
 +
 +
<syntaxhighlight lang="python" line>
 +
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()
 +
 +
</syntaxhighlight>
 +
 +
'''Esercizio 4''': Si ha la necessità di definire una classe di punti 3D. Scrivere il programma Python che permette di definire la classe, gli attributi e i metodi che:
 +
 +
# inizializzano il punto con una posizione predefinita;
 +
# restituiscono in una stringa le coordinate del punto;
 +
# permettono di spostare le coordinate del punto indicando la nuova posizione;
 +
# permettono di calcolare la distanza tra due punti;
 +
# permettono di effettuare un controllo (vero/falso) dati tre punti (vedi nota importante 2).
 +
 +
Scrivere, inoltre, un breve main che mostri il funzionamento dei metodi definiti.
 +
 +
'''NOTA IMPORTANTE 1''': il metodo che permette di implementare il punto d) deve essere richiamato nel seguente modo: ''a.calcola_distanza(b)'' dove a e b sono due punti 3D, mentre il metodo che permette di implementare il punto e) deve essere richiamato nel seguente modo: ''a.check_condition(b,c)'' dove a,b e c sono tre punti 3D.
 +
'''NOTA IMPORTANTE 2''': Il controllo da effettuare è il seguente. Dati i tre segmenti di misure A (es. a-b), B (es. b-c), C (es. a-c) calcolate grazie alle coordinate dei tre punti, il controllo restituirà valore vero nella seguente condizione: ciascun segmento deve essere minore della somma degli altri due e maggiore della loro differenza, ovvero si devono verificare tutte le seguenti condizioni:
 +
 +
[[File:Es4_image.png]]
 +
 +
AIUTO: a-b è equivalente alla distanza tra due punti; la funzione che permette di calcolare il valore assoluto è fabs
 +
 +
'''Codice Python'''
 +
Di seguito il codice python che definisce la classe di punti 3D.
 +
 +
<syntaxhighlight lang="python" line>
 +
import math
 +
class Punto3D:
 +
    def __init__(self,x,y,z):
 +
        self.__x = x
 +
        self.__y = y
 +
        self.__z = z
 +
 +
    def calc_dist(self, b):
 +
        x= quadrato_differenza(self.__x,b.get_x())
 +
        y= quadrato_differenza(self.__y,b.get_y())
 +
        z= quadrato_differenza(self.__z,b.get_z())
 +
        return math.sqrt(x+y+z)
 +
 +
    def set_pos(self,x,y,z):
 +
        self.__x = x
 +
        self.__y = y
 +
        self.__z = z
 +
 +
    def get_x(self):
 +
        return self.__x
 +
 +
    def get_y(self):
 +
        return self.__y
 +
 +
    def get_z(self):
 +
        return self.__z
 +
 +
    def __str__(self):
 +
        return "(x: "+str(self.__x) + ", y: "+str(self.__y)+", z: "+str(self.__z)+")"
 +
 +
    def check_condition(self,b,c):
 +
        A = self.calc_dist(b)
 +
        B = b.calc_dist(c)
 +
        C = self.calc_dist(c)
 +
        if (A<B+C) and (B<A+C) and (C<A+B) and (A>math.fabs(B-C)) and (B>math.fabs(A-C)) and (C>math.fabs(A-B)):
 +
            return True
 +
        else:
 +
            return False
 +
 +
 +
 +
def quadrato_differenza(a,b):
 +
    return (a-b)**2
 +
 +
</syntaxhighlight>
 +
 +
Di seguito la funzione main che mostra il funzionamento dei metodi definiti.
 +
 +
<syntaxhighlight lang="python" line>
 +
import punto
 +
 +
 +
def main():
 +
    a = punto.Punto3D(0.0,0.0,0.0)
 +
    b = punto.Punto3D(1.0,0.0,0.0)
 +
    c = punto.Punto3D(1.0,1.0,1.0)
 +
 +
    print("a")
 +
    print(a)
 +
    print()
 +
    print("b")
 +
    print(b)
 +
    print()
 +
    print("c")
 +
    print(c)
 +
    print()
 +
    print("distanza tra a e b\t" + str(a.calc_dist(b)))
 +
    print("distanza tra a e c\t" + str(a.calc_dist(c)))
 +
 +
 +
    if (a.check_condition(b,c)):
 +
        print("condizione vera tra a,b e c")
 +
    else:
 +
        print("condizione falsa tra a,b e c")
 +
 +
    a.set_pos(1,2,3)
 +
    print("nuova posizione di a")
 +
    print(a)
 +
       
 +
main()
 +
 +
</syntaxhighlight>
 +
  
 
== Appello 27 Giugno 2017 ==
 
== Appello 27 Giugno 2017 ==

Versione delle 09:37, 28 lug 2017


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.

  1. class Persona:
  2.     def __init__(self, nome, indirizzo, eta):
  3.         self.__nome = nome
  4.         self.__indirizzo = indirizzo
  5.         self.__eta = eta
  6.  
  7.     def __str__(self):
  8.         return "Nome: "+self.__nome+", Indirizzo: "+self.__indirizzo+", Età: "+ str(self.__eta)
  9.  
  10.  
  11. class Studente(Persona):
  12.     def __init__(self, nome, indirizzo, eta, voto):
  13.         Persona.__init__(self, nome, indirizzo, eta)
  14.         self.__voto = voto
  15.  
  16.     def __str__(self):
  17.         return Persona.__str__(self)+", Voto: "+ str(self.__voto)
  18.  
  19.  
  20. class Lavoratore(Persona):
  21.     def __init__(self, nome, indirizzo, eta, stipendio):
  22.         Persona.__init__(self, nome, indirizzo, eta)
  23.         self.__stipendio = stipendio
  24.  
  25.     def __str__(self):
  26.         return Persona.__str__(self)+", Stipendio: "+ str(self.__stipendio)

Di seguito la funzione Main che richiama i metodi definiti.

  1. import ereditarieta
  2.  
  3. def main():
  4.     p = ereditarieta.Persona("Paolo", "Via Italia, 5", 34)
  5.     s = ereditarieta.Studente("Antonio", "Via delle Camelie, 19", 14, 7)
  6.     l = ereditarieta.Lavoratore("Marco", "Piazza Garibaldi, 2", 54, 1000)
  7.     print(p)
  8.     print(s)
  9.     print(l)
  10.  
  11. 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:

Es3 image.png

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:

  1. acquisisce da tastiera il nome del file da leggere;
  2. legge il file e carica sia la lista dei nominativi che quella del monte ore;
  3. carica il dizionario con i dati inseriti nelle due liste;
  4. salva su file binario il dizionario;
  5. acquisisce da tastiera il costo orario uguale per tutti i dipendenti;
  6. stampa a schermo le informazioni contenute nel dizionario secondo il formato riportato in precedenza;
  7. gestisce le eccezioni che possono essere sollevate.

Codice Python Di seguito il codice python che implementa quanto richiesto.

  1. import pickle
  2.  
  3. def carica_dati():
  4.     try:
  5.         #infile = open('dati.txt','r')
  6.         namefile = input('Inserire il nome del file e la sua estensione: ')
  7.         infile = open(namefile,'r')
  8.         dati = infile.readlines()
  9.         infile.close()
  10.     except Exception as err:
  11.         dati = list()
  12.         print("File non esistente")
  13.         return dati
  14.     else:
  15.         return dati
  16.  
  17. def carica_liste(dati):
  18.     nominativi = list()
  19.     ore= list()
  20.     for i in range(0,len(dati),2):
  21.         nominativi.append(dati[i].rstrip('\n'))
  22.         ore.append(float(dati[i+1].rstrip('\n')))
  23.     return nominativi, ore
  24.  
  25. def carica_dizionario(n, o):
  26.     d = dict()
  27.     for i in range(0,len(n)):
  28.         d[n[i]] = o[i]
  29.     return d
  30.  
  31. def salva_dizionario(d):
  32.     file = open('log.dat','wb')
  33.     pickle.dump(d, file)
  34.     file.close()
  35.  
  36. def visualizza_info(d, paga_oraria):
  37.     for key in d:
  38.         totale = d[key]*paga_oraria
  39.         print("Nominativo dipendente: "+key+"\t"+ str(d[key]) + " ore lavorate\t Costo orario: "+str(paga_oraria)+ "€\t Paga lorda € "+str(totale))
  40.  
  41.  
  42. def main():
  43.     dati = carica_dati()
  44.     if (len(dati)>0):
  45.  
  46.         try:
  47.  
  48.             nominativi, ore = carica_liste(dati)
  49.  
  50.             monte_ore_lav = carica_dizionario(nominativi, ore)
  51.  
  52.             paga_oraria = float(input('Inserire la paga oraria in Euro: '))
  53.  
  54.             salva_dizionario(monte_ore_lav)
  55.             visualizza_info(monte_ore_lav, paga_oraria)
  56.  
  57.         except Exception as err:
  58.             print(err)
  59.  
  60. main()

Esercizio 4: Si ha la necessità di definire una classe di punti 3D. Scrivere il programma Python che permette di definire la classe, gli attributi e i metodi che:

  1. inizializzano il punto con una posizione predefinita;
  2. restituiscono in una stringa le coordinate del punto;
  3. permettono di spostare le coordinate del punto indicando la nuova posizione;
  4. permettono di calcolare la distanza tra due punti;
  5. permettono di effettuare un controllo (vero/falso) dati tre punti (vedi nota importante 2).

Scrivere, inoltre, un breve main che mostri il funzionamento dei metodi definiti.

NOTA IMPORTANTE 1: il metodo che permette di implementare il punto d) deve essere richiamato nel seguente modo: a.calcola_distanza(b) dove a e b sono due punti 3D, mentre il metodo che permette di implementare il punto e) deve essere richiamato nel seguente modo: a.check_condition(b,c) dove a,b e c sono tre punti 3D. NOTA IMPORTANTE 2: Il controllo da effettuare è il seguente. Dati i tre segmenti di misure A (es. a-b), B (es. b-c), C (es. a-c) calcolate grazie alle coordinate dei tre punti, il controllo restituirà valore vero nella seguente condizione: ciascun segmento deve essere minore della somma degli altri due e maggiore della loro differenza, ovvero si devono verificare tutte le seguenti condizioni:

Es4 image.png

AIUTO: a-b è equivalente alla distanza tra due punti; la funzione che permette di calcolare il valore assoluto è fabs

Codice Python Di seguito il codice python che definisce la classe di punti 3D.

  1. import math
  2. class Punto3D:
  3.     def __init__(self,x,y,z):
  4.         self.__x = x
  5.         self.__y = y
  6.         self.__z = z
  7.  
  8.     def calc_dist(self, b):
  9.         x= quadrato_differenza(self.__x,b.get_x())
  10.         y= quadrato_differenza(self.__y,b.get_y())
  11.         z= quadrato_differenza(self.__z,b.get_z())
  12.         return math.sqrt(x+y+z)
  13.  
  14.     def set_pos(self,x,y,z):
  15.         self.__x = x
  16.         self.__y = y
  17.         self.__z = z
  18.  
  19.     def get_x(self):
  20.         return self.__x
  21.  
  22.     def get_y(self):
  23.         return self.__y
  24.  
  25.     def get_z(self):
  26.         return self.__z
  27.  
  28.     def __str__(self):
  29.          return "(x: "+str(self.__x) + ", y: "+str(self.__y)+", z: "+str(self.__z)+")"
  30.  
  31.     def check_condition(self,b,c):
  32.         A = self.calc_dist(b)
  33.         B = b.calc_dist(c)
  34.         C = self.calc_dist(c)
  35.         if (A<B+C) and (B<A+C) and (C<A+B) and (A>math.fabs(B-C)) and (B>math.fabs(A-C)) and (C>math.fabs(A-B)):
  36.             return True
  37.         else:
  38.             return False
  39.  
  40.  
  41.  
  42. def quadrato_differenza(a,b):
  43.     return (a-b)**2

Di seguito la funzione main che mostra il funzionamento dei metodi definiti.

  1. import punto
  2.  
  3.  
  4. def main():
  5.     a = punto.Punto3D(0.0,0.0,0.0)
  6.     b = punto.Punto3D(1.0,0.0,0.0)
  7.     c = punto.Punto3D(1.0,1.0,1.0)
  8.  
  9.     print("a")
  10.     print(a)
  11.     print()
  12.     print("b")
  13.     print(b)
  14.     print()
  15.     print("c")
  16.     print(c)
  17.     print()
  18.     print("distanza tra a e b\t" + str(a.calc_dist(b)))
  19.     print("distanza tra a e c\t" + str(a.calc_dist(c)))
  20.  
  21.  
  22.     if (a.check_condition(b,c)):
  23.         print("condizione vera tra a,b e c")
  24.     else:
  25.         print("condizione falsa tra a,b e c")
  26.  
  27.     a.set_pos(1,2,3)
  28.     print("nuova posizione di a")
  29.     print(a)
  30.  
  31. main()


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.

  1. class Persona:
  2.     def __init__(self, nome, indirizzo, eta):
  3.         self.__nome = nome
  4.         self.__indirizzo = indirizzo
  5.         self.__eta = eta
  6.  
  7.     def __str__(self):
  8.         return "Nome: "+self.__nome+", Indirizzo: "+self.__indirizzo+", Età: "+ str(self.__eta)
  9.  
  10.  
  11. class Studente(Persona):
  12.     def __init__(self, nome, indirizzo, eta, voto):
  13.         Persona.__init__(self, nome, indirizzo, eta)
  14.         self.__voto = voto
  15.  
  16.     def __str__(self):
  17.         return Persona.__str__(self)+", Voto: "+ str(self.__voto)
  18.  
  19.  
  20. class Lavoratore(Persona):
  21.     def __init__(self, nome, indirizzo, eta, stipendio):
  22.         Persona.__init__(self, nome, indirizzo, eta)
  23.         self.__stipendio = stipendio
  24.  
  25.     def __str__(self):
  26.         return Persona.__str__(self)+", Stipendio: "+ str(self.__stipendio)

Di seguito la funzione Main che richiama i metodi definiti.

  1. import ereditarieta
  2.  
  3. def main():
  4.     p = ereditarieta.Persona("Paolo", "Via Italia, 5", 34)
  5.     s = ereditarieta.Studente("Antonio", "Via delle Camelie, 19", 14, 7)
  6.     l = ereditarieta.Lavoratore("Marco", "Piazza Garibaldi, 2", 54, 1000)
  7.     print(p)
  8.     print(s)
  9.     print(l)
  10.  
  11. 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:

Es3 image.png

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:

  1. acquisisce da tastiera il nome del file da leggere;
  2. legge il file e carica sia la lista dei nominativi che quella del monte ore;
  3. carica il dizionario con i dati inseriti nelle due liste;
  4. salva su file binario il dizionario;
  5. acquisisce da tastiera il costo orario uguale per tutti i dipendenti;
  6. stampa a schermo le informazioni contenute nel dizionario secondo il formato riportato in precedenza;
  7. gestisce le eccezioni che possono essere sollevate.

Codice Python Di seguito il codice python che implementa quanto richiesto.

  1. import pickle
  2.  
  3. def carica_dati():
  4.     try:
  5.         #infile = open('dati.txt','r')
  6.         namefile = input('Inserire il nome del file e la sua estensione: ')
  7.         infile = open(namefile,'r')
  8.         dati = infile.readlines()
  9.         infile.close()
  10.     except Exception as err:
  11.         dati = list()
  12.         print("File non esistente")
  13.         return dati
  14.     else:
  15.         return dati
  16.  
  17. def carica_liste(dati):
  18.     nominativi = list()
  19.     ore= list()
  20.     for i in range(0,len(dati),2):
  21.         nominativi.append(dati[i].rstrip('\n'))
  22.         ore.append(float(dati[i+1].rstrip('\n')))
  23.     return nominativi, ore
  24.  
  25. def carica_dizionario(n, o):
  26.     d = dict()
  27.     for i in range(0,len(n)):
  28.         d[n[i]] = o[i]
  29.     return d
  30.  
  31. def salva_dizionario(d):
  32.     file = open('log.dat','wb')
  33.     pickle.dump(d, file)
  34.     file.close()
  35.  
  36. def visualizza_info(d, paga_oraria):
  37.     for key in d:
  38.         totale = d[key]*paga_oraria
  39.         print("Nominativo dipendente: "+key+"\t"+ str(d[key]) + " ore lavorate\t Costo orario: "+str(paga_oraria)+ "€\t Paga lorda € "+str(totale))
  40.  
  41.  
  42. def main():
  43.     dati = carica_dati()
  44.     if (len(dati)>0):
  45.  
  46.         try:
  47.  
  48.             nominativi, ore = carica_liste(dati)
  49.  
  50.             monte_ore_lav = carica_dizionario(nominativi, ore)
  51.  
  52.             paga_oraria = float(input('Inserire la paga oraria in Euro: '))
  53.  
  54.             salva_dizionario(monte_ore_lav)
  55.             visualizza_info(monte_ore_lav, paga_oraria)
  56.  
  57.         except Exception as err:
  58.             print(err)
  59.  
  60. main()

Esercizio 4: Si ha la necessità di definire una classe di punti 3D. Scrivere il programma Python che permette di definire la classe, gli attributi e i metodi che:

  1. inizializzano il punto con una posizione predefinita;
  2. restituiscono in una stringa le coordinate del punto;
  3. permettono di spostare le coordinate del punto indicando la nuova posizione;
  4. permettono di calcolare la distanza tra due punti;
  5. permettono di effettuare un controllo (vero/falso) dati tre punti (vedi nota importante 2).

Scrivere, inoltre, un breve main che mostri il funzionamento dei metodi definiti.

NOTA IMPORTANTE 1: il metodo che permette di implementare il punto d) deve essere richiamato nel seguente modo: a.calcola_distanza(b) dove a e b sono due punti 3D, mentre il metodo che permette di implementare il punto e) deve essere richiamato nel seguente modo: a.check_condition(b,c) dove a,b e c sono tre punti 3D. NOTA IMPORTANTE 2: Il controllo da effettuare è il seguente. Dati i tre segmenti di misure A (es. a-b), B (es. b-c), C (es. a-c) calcolate grazie alle coordinate dei tre punti, il controllo restituirà valore vero nella seguente condizione: ciascun segmento deve essere minore della somma degli altri due e maggiore della loro differenza, ovvero si devono verificare tutte le seguenti condizioni:

Es4 image.png

AIUTO: a-b è equivalente alla distanza tra due punti; la funzione che permette di calcolare il valore assoluto è fabs

Codice Python Di seguito il codice python che definisce la classe di punti 3D.

  1. import math
  2. class Punto3D:
  3.     def __init__(self,x,y,z):
  4.         self.__x = x
  5.         self.__y = y
  6.         self.__z = z
  7.  
  8.     def calc_dist(self, b):
  9.         x= quadrato_differenza(self.__x,b.get_x())
  10.         y= quadrato_differenza(self.__y,b.get_y())
  11.         z= quadrato_differenza(self.__z,b.get_z())
  12.         return math.sqrt(x+y+z)
  13.  
  14.     def set_pos(self,x,y,z):
  15.         self.__x = x
  16.         self.__y = y
  17.         self.__z = z
  18.  
  19.     def get_x(self):
  20.         return self.__x
  21.  
  22.     def get_y(self):
  23.         return self.__y
  24.  
  25.     def get_z(self):
  26.         return self.__z
  27.  
  28.     def __str__(self):
  29.          return "(x: "+str(self.__x) + ", y: "+str(self.__y)+", z: "+str(self.__z)+")"
  30.  
  31.     def check_condition(self,b,c):
  32.         A = self.calc_dist(b)
  33.         B = b.calc_dist(c)
  34.         C = self.calc_dist(c)
  35.         if (A<B+C) and (B<A+C) and (C<A+B) and (A>math.fabs(B-C)) and (B>math.fabs(A-C)) and (C>math.fabs(A-B)):
  36.             return True
  37.         else:
  38.             return False
  39.  
  40.  
  41.  
  42. def quadrato_differenza(a,b):
  43.     return (a-b)**2

Di seguito la funzione main che mostra il funzionamento dei metodi definiti.

  1. import punto
  2.  
  3.  
  4. def main():
  5.     a = punto.Punto3D(0.0,0.0,0.0)
  6.     b = punto.Punto3D(1.0,0.0,0.0)
  7.     c = punto.Punto3D(1.0,1.0,1.0)
  8.  
  9.     print("a")
  10.     print(a)
  11.     print()
  12.     print("b")
  13.     print(b)
  14.     print()
  15.     print("c")
  16.     print(c)
  17.     print()
  18.     print("distanza tra a e b\t" + str(a.calc_dist(b)))
  19.     print("distanza tra a e c\t" + str(a.calc_dist(c)))
  20.  
  21.  
  22.     if (a.check_condition(b,c)):
  23.         print("condizione vera tra a,b e c")
  24.     else:
  25.         print("condizione falsa tra a,b e c")
  26.  
  27.     a.set_pos(1,2,3)
  28.     print("nuova posizione di a")
  29.     print(a)
  30.  
  31. main()