DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Tipi di dati strutturati Marco D. Santambrogio – [email protected] Ver. aggiornata al 4 Marzo 2013 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Dichiarazione di nuovi tipi di dato • Dato strutturati 2 Definire un nuovo tipo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sinonimi: typedef int Intero; Intero a; int b; typedef char Stringa[10]; Stringa c; char d[10]; Tipi enumerativi: typedef enum {lun,mar,mer,gio,ven,sab,dom} Settimana; Settimana giorno; giorno = lun; giorno = 3; /* 3 equivale a gio */ Non funziona con scanf() e printf(). Definire un nuovo tipo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Tipi strutturati: typedef struct { char campo1; float campo2; int campo3[2]; } Record; ilMioRecord ? A campo1 Record ilMioRecord; ilMioRecord.campo1 = 'A'; ilMioRecord.campo2 = 24.56; ilMioRecord.campo3[0] = 23; ilMioRecord.campo3[1] = 45; ? 24.56 ? 23 ? 45 campo2 campo3 Numeri complessi: problema DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • L’utente inserisce due numeri complessi (parte reale e parte immaginaria) e l’elaboratore esegue l’operazione di somma Es: 3+4i + 5-6i = 8-2i • Il programma chiede all’utente se vuole calcolare un’altra somma. Se l’utente inserisce il carattere ‘q’ il programma termina, altrimenti ricomincia daccapo. Numeri complessi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Numeri complessi: note DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE "%f" stampa un numero float con il segno “-” se è negativo, senza segno se è positivo "%+f" stampa un numero float con il segno “-” se è negativo, con il segno “+” se è positivo "i" non fa parte degli specificatori di formato Una nota sulla scanf() DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Quando inserisco dei dati da tastiera, gli stessi vengono accodati nello standard input (stdin) del programma Anche in carattere ENTER finale viene accodato: Se inserisco: 123 [ENTER] Ottengo in stdin: 123 ‘\n’ Eseguo scanf(“%d”,&x); stdin diventa: ‘\n’ Inserisco il numero 432; stdin diventa: ‘\n’ 432 ‘\n’ Eseguo scanf(“%d”,&x); stdin diventa: ‘\n’ La scanf() scarta l’eventuale ‘\n’ che incontra prima del numero da leggere ma lascia il ‘\n’ finale. Una nota sulla scanf() DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Adesso proviamo a leggere un carattere: Inserisco il carattere ‘w’; stdin diventa: ‘\n’ ‘w’ Eseguo scanf(“%c”,&y); stdin diventa: ‘w’ ‘\n’ ‘\n’ • La scanf(), quando legge un carattere (e solo in questo caso), NON scarta l’eventuale ‘\n’ iniziale! Lo mette nella variabile y e lascia il resto in stdin Senza immettere nient’altro, eseguo un’altra scanf(“%c”,&y); stdin diventa: ‘\n’ • Questa volta la scanf() mette ‘w’ in y • Quindi: se devo leggere caratteri (“&c”) ma prima ho effettuato altre letture, devo togliere da stdin il carattere ‘\n’ rimasto. Schedine: problema DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il programma, partendo da un array di dimensione prefissata che contiene in ogni cella: data della giocata colonna con i tredici segni • Copia in un altro vettore solo le giocate dell’anno 2012 • Quindi, visualizza queste giocate. Schedine: dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Schedine: inserimento dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Schedine: copia valori DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Schedine: stampa dei risultati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Squadra di calcio: problema DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il programma, partendo da un array che contiene i dati personali dei calciatori di una squadra, permette di calcolare: totale goal fatti dalla squadra goal fatti dagli attaccanti goal fatti dai centrocampisti goal fatti dai difensori totale goal subiti dalla squadra • Il programma inoltre visualizza i dati personali di tutti i giocatori • Per ogni giocatore, il programma memorizza: numero di maglia ruolo goal fatti (subiti, se è un portiere). Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio Informatica arte e mestiere, S. Ceri, D. Mandrioli, L. Sbattella, McGrawHill • Capitolo 5 (No: 5.5.3, 5.5.4 e 5.6) • Credits Vito Perrone, Daniele Braga