Laboratorio di Programmazione M-Z
Transcript
Laboratorio di Programmazione M-Z
LAB PROG M-Z Lezione 06 struct Esercizio Laboratorio di Programmazione M-Z Docente: Dott. Francesco Strappaveccia [email protected] Università di Bologna, Sede di Cesena Tipi di dato strutturati LAB PROG M-Z Lezione 06 struct struct struct [ Tag ] { < Tipo1 > < Nome1 >; < Tipo2 > < Nome2 >; ... < TipoN > < NomeN >; } I Le strutture sono tipi di dato che permettono di raggruppare una o più variabili. I Ci permettono di raggruppare variabili di uno o più tipi differenti. I Ci permettono di avere un nome unico per referenziare gruppi di variabili differenti. I Le strutture aiutano ad organizzare dati complessi poiché permettono di trattare come un’entità unica insiemi di variabili logicamente correlate tra di loro. Esercizio Tipi di dato strutturati accesso ai campi, annidamento, assegnamento Per accedere ai campi di un tipo di dato struct, usiamo l’operatore . (punto). typedef struct { cher * name ; int electrons ; int protons } atom ; int main () { atom oxi ; oxi . name = ’o ’; oxi . electrons = 8; oxi . protons = 8; return 0; } Possiamo annidare strutture in strutture. typedef struct { char * name ; int electrons ; int protons } atom ; typedef struct { atom h1 ; atom h2 ; atom o } H2O ; typedef struct { atom h1 ; atom h2 ; atom o1 ; atom o2 ;} H2O2 ; int main () { atom oxi ; atom hy ; H20 water ; H2O2 oxi_water ; oxi . name = " o " ; oxi . electrons = 8; oxi . protons = 8; hy . name = " h " ; hy . ele = 1; hy . prot = 1; water . h1 = hy ; water . h2 = hy ; water . o1 = oxi ; oxi_water . h1 = hy ; oxi_water . h2 = hy ; oxi_water . o1 = oxi ; oxi_water . o2 = oxi ; return 0; } Possiamo assegnare a strutture solo strutture dello stesso tipo. ... oxi_water = oxi ; // ERRORE !! water = oxi_water ; // ERRORE LAB PROG M-Z Lezione 06 struct Esercizio Esercizio structures.h Descriviamo l’iter accademico di uno studente che si iscrive all’università, partendo dall’immatricolazione alla discussione della tesi. Dichiariamo la struct per descrivere lo studente: # define CREDITI 24 typedef struct { char * nome ; char * cognome ; int eta ; int matricola ; float media_p ; esami exs ; tirocinio training ; tesi th ; int laureato ; // 1 se laureato , 0 a l t r i m e n t i int voto_laurea ; } studente ; La struct per gli esami, la tesi, il tirocinio e la laurea: typedef struct { char * nome ; int voto ; int crediti ;} esame ; typedef struct { esame ex1 ; esame ex2 ; esame ex3 ;} esami ; typedef struct { char * titolo ; int punti_assegnati ; int tipo ; // 0 se c o m p i l a t i c a 1 se sperimentale } tesi ; typedef struct { char * argomento ; int voto ; int freq ; // 1 se effettuato , 0 a l t r i m e n t i int crediti ; } tirocinio ; typedef struct { int tot_crediti ; int punti_partenza ; int voto ;} laurea ; LAB PROG M-Z Lezione 06 struct Esercizio Esercizio Funzioni LAB PROG M-Z Lezione 06 struct // I n i z i a l i z z a studente studente Init_Studente () ; // I n i z i a l i z z a esami s o s t e n u t i esami Init_Esami () ; // S o s t i e n i Esami esame So st ie n iAnalisi () ; esame S o s t i e n i P r o g r a m m a z i o n e () ; esame So st ie n iAlgebra () ; // I n i z i a l i z z a t i r o c i n i o ; tirocinio init_Tirocinio () ; // I n i z i a l i z z a Tesi tesi Init_Tesi () ; // Calcola la media degli esami di uno studente float Calc_Media ( studente stud ) ; // Calcola Crediti int Calc_Crediti ( studente stud ) ; // Calcola Voto Partenza int Calc_Partenza ( float media ) ; // Laurea dello studente -> ritorna 1 se ok , 0 a l t r i m e n t i studente Laurea ( studente stud ) ; Esercizio Esercizio main Questo è il main a cui faremo rifermento: # include " structures . h " # include < stdlib .h > int main () { studente stud ; tesi th ; tirocinio train ; // I n i z i a l i z z i a m o i dati dello studente stud = Init_Studente () ; // Vengono s o s t e n u t i gli esami stud . exs = Init_Esami () ; // Viene s o s t e n u t o il t i r o c i n i o train = init_Tirocinio () ; stud . training = train ; // Viene svolta la tesi th = Init_Tesi () ; stud . th = th ; // Viene v a l u tata la carriera e discu ssa la tesi stud = Laurea ( stud ) ; if ( stud . laureato ) printf ( " Lo studente %s , % s si è laureato con la votazione di % d \ n " , stud . nome , stud . cognome , stud . voto_laurea ) ; else printf ( " Studia ancora un po ’\ n " ) ; return 0;} LAB PROG M-Z Lezione 06 struct Esercizio Esercizio Implementazione funzioni (structures.c) Riportiamo le implementazioni delle funzioni: LAB PROG M-Z Lezione 06 struct Esercizio studente Init_Studente () { studente stud ; stud . cognome = " Smith " ; stud . nome = " John " ; stud . matricola = 12345; stud . eta = 23; stud . laureato = 0; stud . media_p = 0.0; stud . voto_laurea = 0; stud . exs . ex1 . voto = 0; stud . exs . ex2 . voto = 0; stud . exs . ex3 . voto = 0; stud . exs . ex1 . crediti = 0; stud . exs . ex2 . crediti = 0; stud . exs . ex3 . crediti = 0; stud . exs . ex1 . nome = " " ; stud . exs . ex2 . nome = " " ; stud . exs . ex3 . nome = " " ; stud . th . p u nt i_assegnati = 0; stud . th . tipo = 0; stud . th . titolo = " " ; stud . training . argomento = " " ; stud . training . crediti = 0; stud . training . freq = 0; stud . training . voto = 0; return stud ; } Esercizio Esami LAB PROG M-Z Lezione 06 struct Esercizio // I n i z i a l i z z a esami s o s t e n u t i esami Init_Esami () { esami exs ; exs . ex1 = SostieniAlgebra () ; exs . ex2 = SostieniAnalisi () ; exs . ex3 = S o s t i e n i P r o g r a m m a z i o n e () ; return exs ; } // S o s t i e n i esame esame So st ie n iAnalisi () { esame esito ; esito . crediti = 6; esito . nome = " Analisi " ; esito . voto = 30; return esito ; } esame S o s t i e n i P r o g r a m m a z i o n e () { same esito ; esito . crediti = 6; esito . nome = " Programmazione " ; esito . voto = 30; return esito ; } esame So st ie n iAlgebra () { esame esito ; esito . crediti = 6; esito . nome = " Algebra " ; esito . voto = 24; return esito ; } Esercizio Inizializzazione Tirocinio e Tesi LAB PROG M-Z Lezione 06 struct Esercizio // I n i z i a l i z z a t i r o c i n i o ; tirocinio init_Tirocinio () { tirocinio train ; train . argomento = " Sistemi " ; train . crediti = 6; train . freq = 1; train . voto = 30; return train ; } // I n i z i a l i z z a Tesi tesi Init_Tesi () { tesi th ; th . tipo = 1; th . titolo = " Sistemi Complessi " ; th . p u nt i_ a ss egnati = 0; return th ; } Esercizio Calcolo media, crediti e voto di partenza LAB PROG M-Z Lezione 06 struct // Calcola la media degli esami di uno studente float Calc_Media ( studente stud ) { float media = 0.0; media = ( stud . exs . ex1 . voto * stud . exs . ex1 . crediti + stud . exs . ex2 . voto * stud . exs . ex2 . crediti + stud . exs . ex3 . voto * stud . exs . ex3 . crediti + stud . training . voto * stud . training . crediti ) / CREDITI ; return media ; } // Calcola Crediti int Calc_Crediti ( studente stud ) { int crediti = stud . exs . ex1 . crediti + stud . exs . ex2 . crediti + stud . exs . ex3 . crediti + stud . training . crediti ; return crediti ; } // Calcola Voto Partenza int Calc_Partenza ( float media ) { int partenza = 0; if ( media <= 23) partenza = 90; else { if ( media >=24 && media < 27) partenza = 100; else partenza = 105; } return partenza ; } Esercizio Esercizio Valutazione titoli e laurea LAB PROG M-Z Lezione 06 struct Esercizio // Laurea dello studente -> ritorna 1 se ok , 0 a l t r i m e n t i studente Laurea ( studente stud ) { studente res = stud ; // Copio il p a r a m e t r o di input su una v a r i a b i l e locale laurea grade ; // Laurea int laureato , crediti , votazione ; crediti = Calc_Crediti ( stud ) ; grade . tot_crediti = crediti ; if ( grade . tot_crediti < CREDITI ) return res ; else { // C a l c o l i a m o media res . media_p = Calc_Media ( stud ) ; grade . punti_partenza = Calc_Partenza ( res . media_p ) ; // d i s c u s s i o n e res . th . p u nti_assegnati = 5; grade . voto = grade . punti_partenza + res . th . punti_assegnati ; res . voto_laurea = grade . voto ; res . laureato = 1; return res ; } } Esercizio II Torneo Basket Tramite l’utillo dei tipi di dato strutturate, descrivere il seguente dominio applicativo: Abbiamo un torneo di basket composto da tre squadre, ognuna caratterizzata da: I I I I Un nome. 5 giocatori. 1 allenatore. Un punteggio. Ogni gioatore è caratterizzato da: I I I I I I Nome e Cognome. Numero. Ruolo. Media Punti. Percentuale di tiri da 2 e da 3. Età ed Altezza. L’allenatore della squadra è descritto invece da: I I Un Nome e Cognome. Dalle passate squadre allenate, caratterizzate a loro volta dall’anno in cui sono state allenate e dal loro nome. Si chiede di scrivere delle funzioni che: I I I I Inizializzino le strutture date descritte in precedenza. Stampino le seguenti statistiche: media età, altezza, percentuali di tiro per una squadra. Stampino la scheda di un giocatore e dell’allenatore. Stampino la classifica, ordinata, del torneo preso in considerazione. LAB PROG M-Z Lezione 06 struct Esercizio