Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea in Informatica Università degli Studi “La Sapienza” (lezioni 8 e 9) Matrici e stringhe Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Array n-dimensionali I vettori possono avere più di un indice possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Lun Mar Mer Es. temperature dei giorni dell’ultima settimana 1 riga per ogni giorno Prof.ssa Chiara Petrioli -- corso di Una colonna per ogni ora del giorno in2006/2007 cui si è presa la temperatura programmazione 1, a.a. Array n-dimensionali I vettori possono avere più di un indice possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Nome della matrice Es. a[0][1] specifica l’elemento nella riga 0 e nella colonna 1 Per individuare un particolare elemento della tabella bisogna specificare due indici Prof.ssa Chiara Petrioli -- corso di indice di riga programmazione 1, a.a. 2006/2007 indice di colonna Array n-dimensionali I vettori possono avere più di un indice possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne a[2][2] Nome della matrice Es. a[2][2] specifica l’elemento nella riga 2 e nella colonna 2 I vettori che con per identificare particolare elemento richiedono due indici sono Una matrice m righe e n un colonne è detta matrice m xn detti vettori bidimensionali o matrici Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Matrici a[i][j] identifica l’elemento della matrice a in posizione (i,j) Dichiarazione di una variabile a[0][2] di a[0,0] tipo matrice a[0][1] a[0][3] int b[2][2]; /* b è una matrice di interi costituita da due righe e due colonne */ a[1][3] a[1][0] a[1][1] a[1][2] Dichiarazione e inizializzazione int b[2][2]={{1,2},{3,4}}; a[2][0] a[2][1] (in alternativa possiamo ad esempio prendere da input i vari valori della matrice) a[2][2] Se non vengono forniti tutti I valori di una riga i rimanenti Sono inizializzati a 0 a[2][3] Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Allocazione di memoria per matrici a[0][0] ….. Elem 1 riga 1 Elem 2 riga 1 Elem n riga 1 ….. ….. ….. Elem 1 riga 2 Elem 2 riga 2 Elem n riga 2 Elem 1 riga m Elem 2 riga m Elem n riga m Gli elementi della matrice sono memorizzati in celle consecutive di memoria, Prof.ssa Chiara Petrioli -- corso di Una riga dopo l’altra programmazione 1, a.a. 2006/2007 Allocazione di memoria per matrici a[0][0] ….. Elem 1 riga 1 Elem 2 riga 1 Elem n riga 1 ….. ….. ….. Elem 1 riga 2 Elem 2 riga 2 Elem n riga 2 Elem 1 riga m Elem 2 riga m Elem n riga m a[0][0] + (i*n)+ j Se a[0][0] memorizzato nella cella 1800 in che cella è memorizzato l’elemento i,j Prof.ssa Chiara Petrioli -- corso di (assumendo una cella, un intero)? Serve conoscere il numero di colonne n per sapere in che cella trovare un programmazione 1, a.a. 2006/2007 generico elemento di una matrice !! Un primo esempio.. include <stdio.h> void printmatrice(int [ ][3]); main() Serve indicare il numero di colonne per { consentire di saper trovare l’elemento (i,j) int matrix1[2][3]={{1,2,3},{4,5,6}}; int matrix2[2][3]={1,2,3,4,5}; int matrix3[2][3]={{1,2},{4}}; printmatrice(matrix1); printmatrice(matrix2); 123 printmatrice(matrix3); 456 return 0; } 123 IN OUTPUT 450 120 Prof.ssa Chiara Petrioli 4 0-- corso 0 di programmazione 1, a.a. 2006/2007 Un primo esempio… void printmatrice (int a[ ][3]) { int i,j; for (i=0; i<=1;i++) { for (j=0;j<=2;j++) printf (“%d ”, a[i][j]); printf(“\n”); } print(“\n”); } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che – prenda da input per ciascuno studente di una classe il voto conseguito in ciascuno degli esami dell’anno – calcoli e stampi il voto più basso e più alto tra quelli dei vari studenti e, per ciascuno studente,la media dei voti degli esami dell’anno Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> #define NUM_ESAMI 10 #define ALUNNI 100 int minimum (int [ ][NUM_ESAMI],int,int); int massimo (int [ ][NUM_ESAMI], int,int); float media(int [ ][NUM_ESAMI],int,int); Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione main() { int i,j; int studentGrades[ALUNNI][NUM_ESAMI]; for (i=0; i<ALUNNI;i++) for (j=0;j<NUM_ESAMI;j++) { printf(“inserisci voto %d esimo esame dell %d esimo alunno \n”, j,i); scanf(“%d”, &studentGrades[i][j]); } } printf(“il voto più basso e il voto più alto sono: %d \n %d \n”, minimum(studentGrades, ALUNNI, NUM_ESAMI), massimo(studentGrades, ALUNNI, NUM_ESAMI)); for (i=0; i<ALUNNI;i++) Alunno che stiamo { considerando printf (“la media dei suoi esami è %f\n”,media(studentGrades, i, NUM_ESAMI)); } Prof.ssa Chiara Petrioli -- corso di } programmazione 1, a.a. 2006/2007 Soluzione int minimum (int grades[ ][NUM_ESAMI],int alunni,int test) { int i,j; int lowgrade=100; /*upper bound del valore dei voti*/ for (i=0; i<alunni; i++) { for (j=0; j<test;j++) { if (grades[i][j]<lowgrade) lowgrade=grades[i][j]; } } return lowgrade; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione int massimo (int grades[ ][NUM_ESAMI],int alunni,int test) { int i,j; int highgrade=0; for (i=0; i<alunni; i++) { for (j=0; j<test;j++) { if (grades[i][j]>highgrade) highgrade=grades[i][j]; } } return highgrade; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione float media (int grades[ ][NUM_ESAMI],int alunno,int test) { int j; int total=0; for (j=0; j<test;j++) { total+=grades[alunno][j]; } return (float) total / test; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Dato un vettore di interi si scriva una funzione int ordinato(int [ ],int); che verifica se il vettore è ordinato in ordine crescente La funzione restituirà 0 se il vettore NON è ordinato; 1 se il vettore è ordinato Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione Se il vettore non è ordinato in ordine crescente allora esistono due posizioni consecutive i e i+1 del vettore tali che l’elemento in posizione i è maggiore dell’elemento in posizione i+1 1 2 4 3 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 7 8 Codice int ordinato (int v[ ], int n) { int i; for (i=0;i<n-1;i++) if (v[i]>v[i+1]) return 0; return 1; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Numero di elementi del vettore Caratteri e stringhe Un carattere può essere visto come un intero Ha associato un intero, il codice ASCII corrispondente Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Caratteri e stringhe Una stringa è un vettore di caratteri che termina con il carattere nullo ‘\0’ b l u e \0 Inizializzazione di una stringa char color [ ]= “blue”; char color [ ]={‘b’,’l’,’u’,’e’,’\0’}; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 La dimensione del vettore è determinata automaticamente Caratteri e stringhe Una stringa è un vettore di caratteri che termina con il carattere nullo ‘\0’ b l u e \0 Inizializzazione di una stringa char word[20]; printf (“inserisci stringa \n”); scanf(“%s”, word); Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 word indica l’indirizzo della cella di memoria in cui è memorizzato il primo elemento del vettore Manipolazione dei caratteri Libreria standard <ctype.h> Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Manipolazione dei caratteri Libreria standard <ctype.h> Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Manipolazione dei caratteri /*verifica se c è una cifra*/ int isdigit (int c) { return ((c>=‘0’)&&(c<=‘9’)); } /*verifica se c è una lettera*/ int isalpha (int c) { return (((c>=‘a’)&&(c<=‘z’))|| ((c>=‘A’)&&(c<=‘Z’))); } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Manipolazione dei caratteri /*restituisce la lettera minuscola corrispondente se c è una maiuscola, l’argomento inalterato in caso contrario*/ int tolower (int c) { if isupper( c ) c=c-’A’+’a’; return c; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Utilizzo delle funzioni di libreria per la manipolazione dei caratteri #include <stdio.h> #include <ctype.h> (espressione 1)?espressione2:espressione 3; int main ( ) { printf(“%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n”, “According to islower:”, islower(‘p’)?”p is a”: “p is not a ”, “lowercase letter”, islower(‘P’)?”P is a”: “P is not a ”, “lowercase letter”, islower(‘5’)?”5 is a”: “5 is not a ”, “lowercase letter”, According to islower: islower(‘!’)?”! is a”: “! is not a ”, p is a lowercase letter “lowercase letter”); P is not a lowercase letter ) 5 is not a lowercase letter } Prof.ssa Chiara Petrioli -- corso di ! Is not a lowercase letter programmazione 1, a.a. 2006/2007 Funzioni di libreria sulle stringhe (funzioni per la conversione delle stringhe, stdlib.h) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio di uso Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Funzioni di libreria sulle stringhe (funzioni per la scrittura e lettura di caratteri e stringhe) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio #include<stdio.h> main() { char c, sentence[80]; int i=0; puts (“Enter a line of text:”); while((c=getchar())!= ‘\n’) sentence[i++]=c; sentence[i]=‘\0’; puts(“\n The line entered was:”); puts(sentence); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Enter a line of text: This is a test. The line entered was: This is a test. Manipolazione di stringhe (string.h) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio di uso Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Confronto tra stringhe (string.h) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Altre funzioni stringh.h (per un elenco completo vedere il Deitel&Deitel) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Altre funzioni stringh.h (per un elenco completo vedere il Deitel&Deitel) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Stampa di una stringa void stampastringa(char s[]) { int i; for (i=0;s[i]!=‘\0’;i++) printf(“%c”,s[i]); printf(“\n”); } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio 1 /*calcola il numero di caratteri in una stringa*/ /*Post: restituisce il numero di caratteri della stringa (escluso il carattere di fine stringa */ int sizestringa(char s[]) { int i=0; while (s[i]!=‘\0’) i++; return i; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio 2 /*individua la prima occorrenza del carattere c nella stringa s. Restituisce l’indice di tale prima occorrenza; -1 se il carattere c non compare*/ int stringchr (char s[ ], int c) { int i=0, while ((s[i]!=c) && (s[i]!=‘\0’)) i++; return ((s[i]==‘\0’)?-1:i); } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio 3 Si scriva una funzione che data una stringa verifichi se tale stringa è palindroma Se o meno leggendo la stringa da destra a sinistra o da sinistra a destra si abbia lo stesso risultato abba è una stringa palindroma cwetyo NON è una stringa palindroma artutra è una stringa palindroma otto è una stringa palindroma Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Stringhe palindrome int palindroma (char s[ ]) { int i,j; Posiziona l’indice j sull’ultimo for (j=0;s[j]!=‘\0’,j++) carattere della stringa ; j--; for (i=0;((s[i]==s[j])&&(i<=j));i++,j--) ; return ((i>j)?1:0); } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Puntatori I puntatori sono delle variabili che come valore contengono deglidevono indirizzi Variabili di tipo puntatore essere di e inizializzate memoriadichiarate Es. int * countPtr; /*dichiarazoine*/ int count; float * fcountPtr; Il nome di una variabile intera (es. count) fa count contiene un _valore_ intero direttamente riferimento ad un valore intero; countPtr = &count; /*inizializzazione*/ Una variabile puntatore fa indirettamente riferimento fcountPtr=NULL; int *countPtr; ad un valore intero (deriferimento). /*NULL è una costante simbolica predefinita In molti file di intestazione incluso stdio.h. Se La variabile countPtr contiene l’indirizzo una variabile puntatore è inizializzata a NULL non di una locazione memoria che contiene punta ad alcunadi locazione di memoria*/ un valore intero. 5 2340 countPtr Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 2340 Operatore di indirizzo & (operatore unario di indirizzo) restituisce l’indirizzo di memoria associato al suo operando; int y=5; int *yPtr; yPtr=&y; 3200 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 5 y Operatore di indirizzo & deve essere applicato ad una variabile. Non & (operatore unario di indirizzo) restituisce Può essere applicato a costanti, espressioni o l’indirizzo di amemoria associato al suo variabili dichiarate con la specifica di classe di memoria register operando; int y=5; int *yPtr; yPtr=&y; 5 3200 3200 y yPtr Viene allocata memoria per la variabile puntatore yPtr. Nella locazione di yPtr viene memorizzato Prof.ssa Chiara Petrioli -- corsoassociato di l’indirizzo di memoria alla variabile y programmazione 1, a.a. 2006/2007 Operatore di deriferimento L’operatore * (detto operatore di deriferimento o di risoluzione dell’indirizzo) consente di accedere al valore contenuto nella locazione di memoria puntata da una variabile puntatore Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatore di deriferimento L’operatore * (detto operatore di deriferimento o di risoluzione dell’indirizzo) consente di accedere al valore contenuto nella locazione di memoria puntata da una variabile puntatore *yPtr è il valore contenuto nella locazione di memoria il cui indirizzo è memorizzato in yPtr 3200 5 5 3200 yPtr Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 y Esempio La specifica di conversione %p di printf consente di stampare in output indirizzi di locazioni di memoria Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizi di preparazione all’esonero Molti esercizi fatti tra lezione e esercitazione MA serve che vi esercitiate a risolvere VOI gli esercizi per superare l’esonero Esercizi alla fine dei capitoli del Deitel &Deitel possono aiutare Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizi di preparazione all’esonero Un consiglio: provate a realizzare alcune delle funzioni di libreria (ad esempio le funzioni di libreria elencate nel capitolo dei Deitel &Deitel sulle stringhe). Ottimo esercizio Per verificare di aver compreso il concetto di puntatore potete ad esempio realizzare tali funzioni in due versioni es. int strlen (char str2[]); int strlen (char * str2); Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007