Stringhe e tipi di dati strutturati Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 21 Marzo 2013
Info sui Labs http://tinyurl.com/ieimlabextra Ricordate di portare un adattatore! Gli esercizi, tolto il primo lab, saranno diversi tra il Lunedì ed il Giovedì Dove: EG 7 Quando Lunedì: 15.30 18.30 Giovedì: 13.00 16.00 2
Immagini 17 11 28 07 09 12 100 100 100 Come si rappresenta? Creiamo una griglia (aka matrice) Ma cosa contiene la matrice? I punti rappresentati, ad esempio, come int Osservazioni 57 Come aumento la risoluzione? Come rappresento i colori? Lo vedremo dopo STRUCT 3
Array a più dimensioni Gli array a 1D realizzano i vettori, quelli a 2D realizzano le matrici, e così via Dichiarazione: int A[20][30]; A è una matrice di 20 30 elementi interi (600 variabili distinte) float F[20][20][30]; F è una matrice 3D di 20 20 30 variabili di tipo float (12.000!) Oppure a quattro dimensioni, ecc 4
Prodotto di matrici 0 1 2 3 0 1 2 3 4 0 3 7 10 0 2 1 0 4 3 1 1 3 11 2 * 7 9 6 1 2 2 5 8 9 24 5 1 2 5 0 11 0 3 8 7 0 1 2 3 c[1][2] = (a[1][k]*b[k][2]), con k = 0,..., 3 #define N 3 #define M 4 #define L 5... for (i=0; i<n; i++){ for (j=0; j<l; j++){ c[i][j] = 0; for (k=0; k<m; k++) } c[i][j] = c[i][j]+(a[i][k]*b[k][j]); printf( %d, c[i][j]); } printf( \n ); 0 1 2 0 1 2 3 4 18+ 22+6 5
Obiettivi Array particolari: le stringhe Dichiarazione di nuovi tipi di dato Dato strutturati 6
Le stringhe Array di caratteri: spesso chiamati stringhe Quando rappresentano caratteri da leggersi in fila Dichiarazione+inizializzazione di una stringa: char stringa[] = "word"; Il carattere nullo '\0' termina le stringhe Perciò l array stringa ha 5 elementi (non 4): w o r d \0 Dichiarazione equivalente: char stringa[] = {'w', 'o', 'r', 'd', '\0'}; 7
Problema: inserisci nome 8
Stringhe e caratteri Qual è la differenza tra 'x' e "x"? 'x' è una costante di tipo char, rappresentata in memoria da un intero "x" è una stringa costante, rappresentata in memoria da un array che contiene i caratteri: 'x' e '\0' ATTENZIONE Le stringhe non sono propriamente un tipo di dato (non sono un tipo base!) Non hanno operatori nativi, ma una serie di funzioni nella libreria standard che permettono di manipolarle 9
Operazioni su stringhe char str1[32]; /* str1 ha spazio per 32 char. */ char str2[64]; /* str2 ha spazio per 64 char. */ /* inizializza str1 con la stringa "alfa" */ strcpy(str1, "alfa"); /* str1 contiene "alfa" */ /* copia str1 in str2 */ strcpy(str2, str1); /* str2 contiene "alfa" */ /* lunghezza di str1 */ x = strlen(str1); /* x assume valore 4 */ /* scrivi str1 su standard output */ printf("%s", str1); /* scrive str1 su stdout */ /* leggi str1 da standard input */ scanf("%s", str1); /* str1 riceve da stdin */ 10
Operazioni su stringhe char str1[32]; char str2[64]; scanf("%s", str1); > ciao /* ora str1 contiene "ciao" */ strcpy(str2, str1);/* str2 riceve "ciao"*/ val = strlen(str2); /* val = 4 */ printf("%s\n", str2); > ciao /* stampa "ciao" */ Attenzione: strlen("") vale 0! 11
Problema: copia stringhe 12
Particolarità delle stringhe Il nome dell array rappresenta l indirizzo del suo primo elemento, perciò quando ci si vuole riferire all intero array nella scanf non si mette il simbolo &! scanf("%s", stringa); Questa scanf legge in input i caratteri fino a quando trova il carattere blank (lo spazio), o l invio Perciò se nel buffer si trova una stringa troppo lunga, essa è memorizzata oltre la fine dell array!!! Ed è un errore grave!!! 13
Problema: non esiste strcpy! 14
strcpy(s1, s2) E se non ci fosse la funzione strcpy()? Assegneremmo sempre un carattere alla volta! char s1[n], s2[m]; /* assegnamento di s2, omesso */ int i = 0; while( i <= strlen(s2) && i < N ) { } s1[i] = s2[i]; ++i; N.B. funziona correttamente se s2 è una stringa ben formata (cioè terminata da '\0') e se s1 è sufficientemente grande da contenere i caratteri di s2 (N >= strlen(s2)) 15
Confrontare due stringhe Una funzione apposita: strcmp(s1,s2) restituisce un intero confronta le due stringhe fino al \0 char str1[32], str2[64]; int diverse; /*... acquisizione di valori per le stringhe... (codice omesso)*/ diverse = strcmp(str1, str2); if( diverse == 0 ) printf("uguali\n"); else if( diverse < 0 ) printf("%s PRECEDE %s\n", str1, str2); else printf("%s SEGUE %s\n", str1, str2); 16
Pausa 15 17
Come rappresento un pixel? Il pixel è Il colore Come ottengo il verde? Con il formato RGB R: 91 G: 191 B: 33 PIXEL = {R, G, B} 18
Tipi di dati strutturati struct miastruttura { char campo1; float campo2; int campo3[2]; }; miastruttura???? campo1 campo2 campo3 19
Definire un nuovo tipo " 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(). 20
Definire un nuovo tipo " Tipi strutturati: typedef struct { char campo1; float campo2; int campo3[2]; } Record; ilmiorecord? A? 24.56? 23? 45 campo1 campo2 campo3 Record ilmiorecord; ilmiorecord.campo1 = 'A'; ilmiorecord.campo2 = 24.56; ilmiorecord.campo3[0] = 23; ilmiorecord.campo3[1] = 45; 21
Numeri complessi: problema 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. 22
Numeri complessi 23
Numeri complessi: note " "%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 24
Schedine: problema 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. 25
Schedine: dati 26
Schedine: inserimento dati 27
Schedine: copia valori 28
Schedine: stampa dei risultati 29
Squadra di calcio: problema 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). 30
Fonti per lo studio + Credits 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 31