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