Informatica (A-K) 19. Linguaggio C -6 Una struttura è un insieme finito di variabili (dette campi) non necessariamente dello stesso tipo, ognuna identificata con un nome l insieme dei campi è denominato record sintassi struct nome_struttura { tipo1 nome_variabile1;... tipon nome_variabilen; La struttura definisce un nuovo tipo di dato Corso di Laurea in Ingegneria Civile & Ambientale A.A. 2011-2012 2 Semestre Prof. Giovanni Pascoschi 2 Istruzione typedef Esempio struct studente { char nome[20]; char indirizzo[50]; char datanascita[8]; int matricola; int num_esami; ; Dichiarazione di una variabile di tipo struct struct studente stud; per poter descrivere in maniera piu concisa un tipo struttura si puo usare la parola chiave typedef ; ; typedef struct daticd cddata; /*definisce un nuovo tipo */ cddata disco; 3 4
Esempio Dopo aver definito una variabile struttura, si accede ai singoli campi mediante la notazione. (punto) i campi di una struttura possono essere usati come qualunque variabile dello stesso tipo esempio: disco.prezzo=10; printf( %s,disco.titolo); disco.copie++; 5 #include <stdio.h> struct studente { char nome[20]; char indirizzo[50]; char datanascita[8]; int matricola; int num_esami; float media; ; struct studente stud; int main( ){ scanf( %s %s %s %s %d %d,stud.cognome, stud.nome, stud.indirizzo, stud.datanascita, &stud.matricola, &stud.num-esami); stud.media= 28.5; printf( %s %s %s %s %d %d %f,stud.cognome, stud.nome, stud.indirizzo, stud.datanascita, stud.matricola, stud.num-esam, stud.media); return 0; 6 Esempi strutture di dati Una volta definito un tipo dati struttura, essa si comporta come un qualsiasi altro tipo di dati. Si puo ad esempio: assegnare una variabile struttura ad un altra far si che una funzione restituisca una struttura alla funzione chiamante passare strutture sia per valore che per referenza (riferimento) cddata cd1 = { Toccata e fuga, Bach, 30, sinfonia ; cddata cd2 = cd1; //uguaglianza tra strutture void stampa_cd(cddata x) { // passaggio per valore printf( %s %s %f %s \n,x.autore,x.titolo,x.prezzo,x.genere); void prezzo_scontato(cddata *x) { // passaggio per referenza *x.prezzo=*x.prezzo * 80/100; 7 8
Tabelle di dati La tabella di dati è un array di strutture ; ; struct daticd CD[100]; // tabella costituita da 100 CD Istruzione typedef per poter descrivere in maniera piu concisa un tipo struttura si puo usare la parola chiave typedef ; ; typedef struct daticd cddata; /*definisce un nuovo tipo */ cddata CD[100]; /* tabella costituita da 100 CD */ 9 10 Tabelle di dati : Esempio 1 ; char titolo[20]; char genere[20]; ; struct daticd CD[100]; // tabella costituita da 100 CD CD[5].prezzo = 13; CD[8].giorno_vendita.gg= 5; CD[8].giorno_vendita.mm= 6; CD[8].giorno_vendita.aa= 2012; Classifica di una gara ciclistica #include <stdio.h> struct time { int hh,mm,ss; int totsecondi; ; struct concorrente { int pettorale; char squadra[20]; struct time tempo; ; typedef struct concorrente partec; partec tab[200]; /* tabella costituita da 200 corridori */ 11 12
void caricatabella( ); void ordina( ); void swap( ); void stampa( ); int main( ) { caricatabella( ); ordina( ); stampa( ); return 0; ; 13 void caricatabella( ){ int i; for(i=0; i<200; i++){ printf( inserisci numero pettorale ); scanf( %d, &tab[i].pettorale); printf( inserisci cognome ); scanf( %s, tab[i].cognome); printf( inserisci squadra ); scanf( %s, tab[i].squadra); printf( inserisci ore impiegate ); scanf( %d, &tab[i].tempo.hh); printf( inserisci minuti impiegati ); scanf( %d, &tab[i].tempo.mm); printf( inserisci secondi impiegati ); scanf( %d, &tab[i].tempo.ss); tab[i].tempo.totsecondi=tab[i].tempo.hh*3600+ tab[i].tempo.mm*60+tab[i].tempo.ss; ; 14 void ordina( ){ int i, j; for(i=0; i<199; i++){ for(j=i+1; j<200; j++){ if(tab[i].tempo.totsecondi>tab[j].tempo.totsecondi){ swap(&tab[i], &tab[j]); void stampa( ){ int i; printf( %s %s %s %s %s %s \n, Pettorale, Cognome, Ore, Minuti, Secondi, Posizione ); for(i=0; i<200; i++) { printf( %d %s %d %d %d %d \n, tab[i].pettorale, tab[i].cognome, tab[i].tempo.hh, tab[i].tempo.mm, tab[i].ss, i+1); ; void swap(partec *a, partec *b); partec comodo; comodo = *a; *a = *b; *b = comodo; ; 15 16
Riepilogo della lezione Fine della lezione Tabelle in C Tabelle in C Domande? 17 18 Esercizio 1 In una libreria costituita da 1000 libri, ciascun libro è identificato dalle seguenti informazioni: ID, titolo, autore, codice ISBN, prezzo, casa editrice, data edizione. Implementare le seguenti funzioni (variabili globali): 1) Caricamento della tabella relativa alla libreria 2) Calcolo del prezzo medio dei libri 3) Ordinamento in ordine crescente di prezzo della tabella 19