Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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 possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Es. temperature dei giorni dellultima settimana 1 riga per ogni giorno Una colonna per ogni ora del giorno in cui si è presa la temperatura Lun Mar Mer
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 possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Per individuare un particolare elemento della tabella bisogna specificare due indici indice di riga indice di colonna Es. a[0][1] specifica lelemento nella riga 0 e nella colonna 1 Nome della matrice
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 possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Es. a[2][2] specifica lelemento nella riga 2 e nella colonna 2 Nome della matrice a[2][2] I vettori che per identificare un particolare elemento richiedono due indici sono detti vettori bidimensionali o matrici Una matrice con m righe e n colonne è detta matrice m x n
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Matrici a[i][j] identifica lelemento della matrice a in posizione (i,j) Dichiarazione di una variabile di tipo matrice int b[2][2]; /* b è una matrice di interi costituita da due righe e due colonne */ int b[2][2]; /* b è una matrice di interi costituita da due righe e due colonne */ Dichiarazione e inizializzazione int b[2][2]={{1,2},{3,4}}; (in alternativa possiamo ad esempio prendere da input i vari valori della matrice) Se non vengono forniti tutti I valori di una riga i rimanenti Sono inizializzati a 0 a[0][0]a[0][1]a[0][2]a[0][3] a[1][0]a[1][1]a[1][2]a[1][3] a[2][0]a[2][1]a[2][2]a[2][3]
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Allocazione di memoria per matrici 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] Gli elementi della matrice sono memorizzati in celle consecutive di memoria, Una riga dopo laltra
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Allocazione di memoria per matrici 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] Se a[0][0] memorizzato nella cella 1800 in che cella è memorizzato lelemento i,j (assumendo una cella, un intero)? &a[0][0] + (i*n)+ j Serve conoscere il numero di colonne n per sapere in che cella trovare un generico elemento di una matrice !!
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un primo esempio.. include include void printmatrice(int [ ][3]); int main() { 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);printmatrice(matrix3); return 0; } IN OUTPUT Serve indicare il numero di colonne per consentire di saper trovare lelemento (i,j)
Prof.ssa Chiara Petrioli -- corso 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 dellanno – 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 dellanno
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include #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++) { printf (la media dei suoi esami è %f\n,media(studentGrades, i, NUM_ESAMI)); }} Alunno che stiamo considerando
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/2007Puntatori I puntatori sono delle variabili che come valore contengono degli indirizzi di memoria int count; count contiene un _valore_ intero count contiene un _valore_ intero int *countPtr; La variabile countPtr contiene lindirizzo di una locazione di memoria che contiene un valore intero. La variabile countPtr contiene lindirizzo di una locazione di memoria che contiene un valore intero countPtr Il nome di una variabile intera (es. count) fa direttamente riferimento ad un valore intero; Una variabile puntatore fa indirettamente riferimento ad un valore intero (deriferimento). Variabili di tipo puntatore devono essere dichiarate e inizializzate Es. int * countPtr; /*dichiarazoine*/ float * fcountPtr; countPtr = &count; /*inizializzazione*/ fcountPtr=NULL; /*NULL è una costante simbolica predefinita In molti file di intestazione incluso stdio.h. Se una variabile puntatore è inizializzata a NULL non punta ad alcuna locazione di memoria*/
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatore di indirizzo & (operatore unario di indirizzo) restituisce lindirizzo di memoria associato al suo operando; int y=5; int *yPtr; yPtr=&y; 5 y 3200
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatore di indirizzo & (operatore unario di indirizzo) restituisce lindirizzo di memoria associato al suo operando; int y=5; int *yPtr; yPtr=&y; 5 y 3200 Viene allocata memoria per la variabile puntatore yPtr. Nella locazione di yPtr viene memorizzato lindirizzo di memoria associato alla variabile y yPtr 3200 & deve essere applicato ad una variabile. Non Può essere applicato a costanti, espressioni o a variabili dichiarate con la specifica di classe di memoria register
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatore di deriferimento Loperatore * (detto operatore di deriferimento o di risoluzione dellindirizzo) 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 Loperatore * (detto operatore di deriferimento o di risoluzione dellindirizzo) consente di accedere al valore contenuto nella locazione di memoria puntata da una variabile puntatore 5 y 3200 yPtr 3200 *yPtr è il valore contenuto nella locazione di memoria il cui indirizzo è memorizzato in yPtr 5
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esempio La specifica di conversione %p di printf consente di stampare in output indirizzi di locazioni di memoria #include main() { int a; int *aPtr; a=7; aPtr=&a; printf(The address of a is %p \n The value of aPtr is %p \n\n,&a,aPtr); printf(The value of a is %d \n The value of *aPtr is %d \n\n,a,*aPtr); printf(Proving that * and & are complements of each other \n); printf(&*aPtr=%p \n *&aPtr=%p \n,&*aPtr,*&aPtr); return 0; }
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 Chiamata per riferimento delle funzioni Come può essere realizzata in C? Se vogliamo poter modificare il contenuto di una variabile x con cui invochiamo una funzione e far sì che tali modifiche permangano anche alluscita dalla funzione possiamo usare come parametro formale un puntatore (quindi passare lalla funzione lindirizzo di x)… Un esempio..
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esempio /*eleva al cubo una variabile usando una chiamata per valore*/ #include #include int cubeByValue(int); int main() { int number =5; printf(Il valore originale del numero è: %d\n,number); number=cubeByValue(number); printf(il nuovo valore del numero è: %d\n,number); return 0; } int cubeByValue(int n) { return n*n*n; } Il valore originale del numero è: 5 Il nuovo valore del numero è: 125
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria…
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria…
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria…
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio 2 /*eleva al cubo una variabile usando una chiamata per riferimento*/ #include #include void cubeByReference(int *); int main() { int number =5; printf(Il valore originale del numero è: %d\n,number); cubeByReference(&number); printf(il nuovo valore del numero è: %d\n,number); return 0; } void cubeByReference(int *nPtr) {*nPtr=(*nPtr)*(*nPtr)*(*nPtr);} Il valore originale del numero è: 5 Il nuovo valore del numero è: 125
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… int number=5;cubeByReference(&number); 5 number 6200
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… int number=5;cubeByReference(&number); 5 number 6200 void cubeByReference(int *nPtr) {*nPtr=(*nPtr)*(*nPtr)*(*nPtr);} Invochiamo la funzione cubeByReference Viene allocata memoria per la variabile puntatore nPtr Viene copiato in nPtr il valore dellargomento con cui è stata invocata la funzione &number OVVERO lindirizzo della locazione di memoria della variabile number OVVERO
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… int number=5;cubeByReference(&number); 5 number 6200 void cubeByReference(int *nPtr) {*nPtr=(*nPtr)*(*nPtr)*(*nPtr);} Invochiamo la funzione cubeByReference 6200 Si esegue listruzione*nPtr=(*nPtr)*(*nPtr)*(*nPtr); *nPtr è il valore contenuto nella locazione di memoria puntata da nPtr 5 Listruzione quindi dice di elevare al cubo 5 e di memorizzare il valore risultante nella locazione di memoria puntata da nPtr
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… int number=5;cubeByReference(&number); 5 number 6200 void cubeByReference(int *nPtr) {*nPtr=(*nPtr)*(*nPtr)*(*nPtr);} Invochiamo la funzione cubeByReference 6200 Listruzione quindi dice di elevare al cubo 5 e di memorizzare il valore risultante nella locazione di memoria puntata da nPtr Il cubo di 5 è
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… int number=5;cubeByReference(&number); printf(il nuovo valore del numero è: %d\n,number); return 0; 5 number 6200 void cubeByReference(int *nPtr) {*nPtr=(*nPtr)*(*nPtr)*(*nPtr);} Si ritorna il controllo al main che esegue la prossima istruzione 6200 Si stampa il valore di number 125 La memoria allocata per nPtr viene rilasciata 125
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Passaggio per valore evita di compromettere i valori delle variabili con cui sono invocate le funzioni (spesso non si vogliono modificare tali valori) Passaggio parametri per riferimento evita di dover allocare, ad ogni invocazione di funzione, memoria per copiare quantità di dati di input grandi che possono dover essere passati alla funzione esempio: se la funzione ha come input un vettore abbiamo bisogno solo di un parametro di tipo puntatore in cui copiare la locazione di memoria associata al primo elemento del vettore
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Qualificatore const Consente di specificare che il valore di una particolare variabile NON dovrà essere modificato Il compilatore intercetterà qualsiasi tentativo di modificare una variabile che sia stata dichiarata const e, nel caso in cui tale variabile sia modificata, darà un errore o un warning. serve a proteggere da errori nellimplementazione del codice rendere più facile il debugging serve a proteggere da errori nellimplementazione del codice rendere più facile il debugging
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Modi di passare un puntatore a una funzione Puntatore variabile a dati variabili – i dati possono essere modificati attraverso il puntatore –Il valore della variabile puntatore potrà essere modificato in modo che il puntatore possa fare riferimento ad altri dati
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esempio #include #include void convertToUppercase (char *); main(){ char string[ ]=caratteri; printf(la stringa prima della conversione è %s\n,string); convertToUppercase(string); /*converte le lettere minuscole della stringa in maiuscole*/ printf(dopo la conversione la stringa è %s\n,string); return 0; } void convertToUppercase(char *s) { while (*s != \0) { if (*s >= a && *s = a && *s<= z)*s-=32;++s;}} La stringa prima della conversione è:pippo Dopo la conversione la stringa è PIPPO Vengono modificati i caratteri della Stringa. s punta a caratteri diversi della stringa durante lesecuzione della funzione
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Altri casi… Puntatore variabile a dati costanti (i dati non possono essere modificati) #include #include void printCharacters (const char *); main(){ char string [ ]=stampa i caratteri; printf (la stringa è:\n); printCharacters (string); putchar(\n); return 0; } void printCharacters(const char *s) { for (;*s!=\0;s++) putchar(*s);} la stringa è: stampa i caratteri
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Altri casi… Puntatore costante a dati variabili – il puntatore fa sempre riferimento alla stessa locazione di memoria –Tramite il puntatore si può cambiare il valore della locazione di memoria int *const ptr; Puntatore costante a dati costanti –il puntatore fa sempre riferimento alla stessa locazione di memoria –Il valore della locazione di memoria non può essere modificato const int *const ptr;
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio #include #include main () { int x=5,y; const int *const ptr=&x; *ptr=7; ptr=&y; ptr=&y; return 0; return 0;} Cannot modify a const object
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Bubblesort (versione 2) #include #include #define SIZE 10 void bubbleSort(int *,const int); void swap (int *,int*); main(){ int i,a[SIZE]={2,6,4,8,10,12,89,68,45,37}; printf(ordine originale \n); for (i=0;i<=SIZE-1;i++) printf(%d,a[i]); bubbleSort (a,SIZE); printf(dati in ordine crescente \n); for (i=0;i<=SIZE-1;i++) printf(%d,a[i]);printf(\n); return 0; }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Bubblesort void bubbleSort(int *array, const int size) { int pass,j; for (pass=1;pass <=size-1;pass++) for (j=0;j<=size-2;j++) if(array[j]>array[j+1])swap(&array[j],&array[j+1]);}
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Swap void swap (int *element1Ptr, int *element2Ptr) { int temp; temp=*element1Ptr;*element1Ptr=*element2Ptr;*element2Ptr=temp;}
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Caratteri e stringhe Un carattere può essere visto come un intero Ha associato un intero, il codice ASCII corrispondente 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 Inizializzazione di una stringa char color [ ]= blue; char color [ ]={b,l,u,e,\0}; blue\0 La dimensione del vettore è determinata automaticamente
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 Inizializzazione di una stringa char word[20]; printf (inserisci stringa \n); scanf(%s, word); blue\0 word indica lindirizzo della cella di memoria in cui è memorizzato il primo elemento del vettore
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Manipolazione dei caratteri Libreria standard Libreria standard
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Manipolazione dei caratteri Libreria standard Libreria standard
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 =0)&&(c<=9));} /*verifica se c è una lettera*/ int isalpha (int c) { return (((c>=a)&&(c =A)&&(c =a)&&(c =A)&&(c<=Z)));}
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 =0)&&(c<=9));} /*verifica se c è una lettera*/ int isalpha (int c) { return (((c>=a)&&(c =A)&&(c =a)&&(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, largomento 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 #include 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, islower(!)?! is a: ! is not a, lowercase letter); )} According to islower: p is a lowercase letter P is not a lowercase letter 5 is not a lowercase letter ! Is not a lowercase letter (espressione 1)?espressione2:espressione 3;
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 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/2007Esempio#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; } Enter a line of text: This is a test. The line entered was: This is a test.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007
Manipolazione di stringhe (string.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 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 Esercizio 2 /*individua la prima occorrenza del carattere c nella stringa s. Restituisce lindice 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 Correzione esercizi degli esoneri Compito C, terzo esercizio Data una sequenza di caratteri s1 ed una stringa s2 diciamo che s1 è contenuta in s2 se i caratteri di s1, s1[0], s1[1], s1[2]…, compaiono tutti, nello stesso ordine, nella stringa s2 (possibilmente intervallati, preceduti o seguiti da altri caratteri). Si scriva una funzione che date due stringhe s3 e s4 calcoli la lunghezza del prefisso piu lungo di s3 contentuto in s4.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correzione 1 #include #include int prefisso_stringa_contenuta(char *, char*); …. int prefisso_stringa_contenuta(char *s1, char *s2) { int i,j, L1, L2, tot, finito; int i,j, L1, L2, tot, finito; i=tot=L1=L2=finito=0; i=tot=L1=L2=finito=0; L1=strlen(s1); L1=strlen(s1); L2=strlen(s2); L2=strlen(s2); for (j=0;((j<L2)&&(!finito));j++){ for (j=0;((j<L2)&&(!finito));j++){ if (s2[j]==s1[i]){ if (s2[j]==s1[i]){ tot++; tot++; i++; i++; if (i==L1) if (i==L1) finito=1; finito=1; } } return tot; return tot;}
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Risoluzione esercizi dellesonero Compito A, terzo esercizio Date due stringhe s1 e s2 diciamo che s1 è contenuta in s2 se i caratteri di s1, s1[0], s1[1], s1[2]…, fino al carattere di fine stringa eslcuso, compaiono tutti, nello stesso ordine, nella stringa s2 (possibilmente intervallati, preceduti o seguiti da altri caratteri). Si scriva una funzione che date due stringhe s1 e s2 verifichi se s1 è contenuta in s2.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correzione 2 int stringa_contenuta(char *s1, char *s2) { int i,j, L1, L2, tot, finito; int i,j, L1, L2, tot, finito; i=tot=L1=L2=finito=0; i=tot=L1=L2=finito=0; L1=strlen(s1); L1=strlen(s1); L2=strlen(s2); L2=strlen(s2); for (j=0;((j<L2)&&(!finito));j++){ for (j=0;((j<L2)&&(!finito));j++){ if (s2[j]==s1[i]){ if (s2[j]==s1[i]){ tot++; tot++; i++; i++; if (i==L1) if (i==L1) finito=1; finito=1; } } return (tot==L1); return (tot==L1);}
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correzione esercizi di esonero Esercizio 1, compito C Un elemento di un vettore di interi è un massimo locale se il suo valore è strettamente maggiore del valore dellelemento di indice immediatamente inferiore (se esiste) E del valore dellelemento di indice immediatamente superiore (se esiste). Si scriva una funzione che dato un vettore di interi calcoli il numero dei massimi locali del vettore.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione 3 int num_max_locali(int v[ ], int num) { int j, count; if (num == 0) return 0; if ( num == 1 ) return 1; count=0; for (j=0;j<num;j++) { if ( j == num-1 && v[j] > v[j-1] ) { count ++; } else if ( j == 0 && v[j] > v[j+1] ) { count ++; } else if ( v[j-1] < v[j] && v[j+1] < v[j] ) { count ++; }} return count; }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correzione esercizi degli esoneri Compito A, primo esercizio Un elemento di un vettore di interi è un minimo locale se il suo valore è strettamente minore del valore dellelemento di indice immediatamente inferiore (se esiste) E del valore dellelemento di indice immediatamente superiore (se esiste). Si scriva una funzione che dato un vettore di interi calcoli la somma dei valori dei minimi locali del vettore
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione 4 int somma_min_locali(int v[ ], int num) /*restituiamo 0 se la funzione non ha minimi locali. */ { int j, sum; sum=0; if ( num == 1 ) return v[ 0 ]; return v[ 0 ]; for (j=0;j<num;j++) { if ( j==num-1 && v[j] < v[j-1] ) { sum += v[j]; } else if ( j==0 && v[j] < v[j+1] ) { sum += v[j]; } else if ( v[j-1] > v[j] && v[j+1] > v[j] ) { sum += v[j]; }} return sum; }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Risoluzione esercizi di esonero Compito A, esercizio 2 Un k quadrato di una matrice m*n, m>=k, n>=k è una sottomatrice quadrata k*k della matrice Si scriva una funzione che data una matrice di interi, ed un intero k, calcoli la somma dei valori degli elementi più piccoli dei k quadrati
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 K quadrati Sottomatrici k*k
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione 5 int somma_min_k_quadrati(int M[ ][MAX_COLONNE], int m, int n, int k) { /*Pre: la funzione assume k<=m, k<=n*/ int i,j,r,s; int min; int sum=0; for (i=0;i<m-k+1;i++){ for (j=0;j<n-k+1;j++){ for (j=0;j<n-k+1;j++){ min=M[i][j]; min=M[i][j]; for (r=i;r<i+k;r++){ for (r=i;r<i+k;r++){ for (s=j;s<j+k;s++){ for (s=j;s<j+k;s++){ if (M[r][s]<min) if (M[r][s]<min) min=M[r][s]; min=M[r][s]; } } sum+=min; sum+=min; }} return sum; }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Risoluzione esercizi di esonero Compito A, esercizio 2 Un k quadrato di una matrice m*n, m>=k, n>=k è una sottomatrice quadrata k*k della matrice Si scriva una funzione che data una matrice di interi, un intero k, ed un intero h calcoli il numero di k quadrati della matrice tali che la somma degli elemetnti del k quadrato sia uguale a h.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione 6 int conta_h_k_quadrati(int M[ ][MAX_COLONNE], int m, int n, int k, int h) { /*Pre: la funzione assume k<=m, k<=n*/ int i,j,r,s; int sum; int count=0; for (i=0;i<m-k+1;i++){ for (j=0;j<n-k+1;j++){ for (j=0;j<n-k+1;j++){ sum=0; sum=0; for (r=i;r<i+k;r++){ for (r=i;r<i+k;r++){ for (s=j;s<j+k;s++){ for (s=j;s<j+k;s++){ sum+=M[r][s]; sum+=M[r][s]; } } if (sum ==h) if (sum ==h) count++; count++; }} return count; }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007
Altri esercizi Ulteriori problemi per esercitarsi
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 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 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; for (j=0;s[j]!=\0,j++) ;j--; for (i=0;((s[i]==s[j])&&(i<=j));i++,j--) ; return ((i>j)?1:0); } Posiziona lindice j sullultimo carattere della stringa
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio 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 lelemento in posizione i è maggiore dellelemento in posizione i+1
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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; } Numero di elementi del vettore