Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza,, ordinamento, ricerca e merge, matrice simmetrica, puntatori Array Array o vettore Composto da una serie di celle int vett[4] = 3, 5, -6, 10; vett 3 5-6 10 0 1 2 3 Stesso tipo per tutte le celle Alloca tutte le celle lunghezza dell array Tipicamente serve un contatore - 2-1
Media e varianza Leggere un insieme di numeri, inserirlo in un array e calcolare la media e la varianza L utente dovrà esplicitamente indicare quanti numeri vuole inserire nell array Ricordiamo che la media e la varianza di n dati a i si ottengono: n ai ( ai x) i= x = 1 i= 1 Var( x) = n n 1 Utilizziamo la funzione predefinita pow(base,esp) che calcola base esp n 2-3 - Media e varianza #include <stdioh> #include <mathh> void main() const unsigned int MAX = 1000; float arraynumeri[max]; unsigned int i, num; float totale = 0, media, varianza; printf ("quanti numeri (max %u): ", MAX); scanf ("%u", &num); /* assumo num < MAX */ for (i = 0; i < num; i++) printf ("Dato (%u): ", i); scanf ("%f", &arraynumeri[i]); totale = totale + arraynumeri[i]; - 4-2
Media e varianza media = totale / num; totale = 0; for (i = 0; i < num; i++) totale = totale + pow(arraynumeri[i]-media, 2); varianza = totale / (num 1); printf ("Media:%f, varianza:%f", media, varianza); Se l utente inserisce un solo numero? Verificare l input dell utente - 5 - Trova il massimo Leggere un insieme di numeri interi e inserirlo in un array L insieme sarà terminato dal numero zero Trovare quindi: Il numero massimo La posizione della cella nella quale il numero massimo è stato inserito - 6-3
Trova il massimo #include <stdioh> void main() const unsigned int MAX = 1000; int arraynumeri[max], dato, max; unsigned int i, num = 0, posizmax; arraynumeri[0] = 0; /* se non immetto niente */ scanf ("%d", &dato); while (dato!= 0 && num < MAX) arraynumeri[num] = dato; num = num + 1; if (num < MAX) /* Non leggo il dato seguente */ /* se l array è finito */ scanf ("%d", &dato); - 7 - Trova il massimo max = arraynumeri[0]; posizmax = 0; for (i = 1; i < num; i++) if (arraynumeri[i] > max) max = arraynumeri[i]; posizmax = i; printf ("Max:%d, posizione:%u", max, posizmax); - 8-4
Ricerca lineare L utente inserisce in un array un certo numero di interi L utente inserisce un numero e l elaboratore controlla se è presente nell array Se il numero è presente, si visualizza la posizione in cui è stato trovato - 9 - Ricerca lineare #include <stdioh> void main() unsigned int i, n, trovato = 0; int numeri [100], num; printf ("Quanti numeri: "); scanf ("%u", &n); for (i = 0; i < n; i++) printf ("Numero %u: ", i); scanf ("%d", &numeri[i]); printf ("Numero da cercare: "); scanf ("%d", &num); - 10-5
Ricerca lineare i = 0; do if (numeri[i] == num) trovato = 1; else i++; while (trovato == 0 && i < n); if (trovato) printf ("Numero: %d ", numeri[i]); printf ("Posizione: %u\n", i); - 11 - Merge di due array ordinati L utente inserisce due array composti da numeri interi ed ordinati in senso crescente Le lunghezze dei due array possono essere differenti L elaboratore crea un terzo array ordinato, utilizzando i due array inseriti dall utente Infine, quest ultimo array viene visualizzato i1 10 30 im 10 20 30 40 50-12 - i2 20 40 50 6
Merge di due array ordinati #include <stdioh> void main() const int MAX = 100; int array1[max], array2[max], merge[2 * MAX]; unsigned int n1, n2, i1, i2, im; printf ("Lungh array 1: "); scanf ("%u", &n1); printf ("Lungh array 2: "); scanf ("%u", &n2); for (i1 = 0; i1 < n1; i1++) printf ("Array1, numero: "); scanf ("%d", &array1[i1]); - 13 - Merge di due array ordinati for (i2 = 0; i2 < n2; i2++) printf ("Array2, numero: "); scanf ("%d", &array2[i2]); i1 = 0; i2 = 0; - 14-7
Merge di due array ordinati for (im = 0; im < n1 + n2; im++) if (i1 < n1 && array1[i1] < array2[i2] i2 >= n2) merge[im] = array1[i1]; i1++; else merge[im] = array2[i2]; i2++; - 15 - Merge di due array ordinati for (im = 0; im < n1 + n2; im++) printf ("%d\n", merge[im]); - 16-8
Ordinamento per inserzione L utente inserisce in un array un certo numero di interi L elaboratore ordina l array in senso crescente e lo visualizza L algoritmo viene applicato mentre l utente inserisce i dati 0 20 10 1 30 20 2 3 4 30 25 30 40-17 - Ordinamento per inserzione #include <stdioh> void main() unsigned int tot; int ultima, i, candidata, sposta; int n, numeri[100]; printf ("Quanti numeri: "); scanf ("%u", &tot); for (ultima = 0; ultima < tot; ultima++) printf ("Numero: "); scanf ("%d", &n); candidata = 0; - 18-9
Ordinamento per inserzione while (n >= numeri[candidata] && candidata <= ultima) candidata++; /* Sposto a partire dal fondo, altrimenti sovrascrivo La variabile ultima indica l'ultima casella occupata */ for (sposta=ultima; sposta>=candidata; sposta--) numeri[sposta + 1] = numeri[sposta]; numeri[candidata] = n; - 19 - Ordinamento per inserzione for (i = 0; i < tot; i++) printf ("%d\n", numeri[i]); - 20-10
Ordinamento con Bubble Sort Lo stesso testo dell esercizio precedente Usiamo l algoritmo di ordinamento noto con il nome di bubble sort (ordinamento a bolle) L utente inserisce i dati in modo disordinato L algoritmo viene applicato alla fine della fase di inserimento 0 1 2 3 4 25 20 10 25 10 20 10 25 30 40-21 - Ordinamento con Bubble Sort Come si effettua lo scambio del contenuto di due variabili? Serve una variabile temporanea: a 10 b 20 temp a 10 b 20 temp 10 a 20 b 20 temp 10 a 20 b 10 temp 10-22 - 11
Ordinamento con Bubble Sort #include <stdioh> void main() unsigned int tot, i, scambio; int numeri [100], temporanea; printf ("Quanti numeri: "); scanf ("%u", &tot); for (i = 0; i < tot; i++) printf ("Numero: "); scanf ("%d", &numeri[i]); - 23 - Ordinamento con Bubble Sort do scambio = 0; for (i = 0; i < tot - 1; i++) if (numeri[i] > numeri[i + 1]) /* inizio scambio di due variabili */ temporanea = numeri[i]; numeri[i] = numeri[i + 1]; numeri[i + 1] = temporanea; /* fine scambio di due variabili */ scambio = 1; while (scambio == 1); - 24-12
Ordinamento con Bubble Sort for (i = 0; i < tot; i++) printf ("%d\n", numeri[i]); - 25 - Matrice Composta da una matrice di celle int mat[2][4] = 3,5,7,2,-4,6,1,1; 0 1 3 5 7 2-4 6 1 1 0 1 2 3 mat Stesso tipo per tutte le celle Alloca tutte le celle lunghezze della matrice Tipicamente servono due contatori - 26-13
Matrice simmetrica L utente inserisce una matrice quadrata, composta di numeri reali, ed il programma verifica (e visualizza) se è simmetrica La dimensione della matrice inserita dall utente è fissata all interno del programma Ricordiamo che una matrice quadrata è simmetrica sse per ogni i,j vale a i,j = a j,i 0 1 2 3 0 1 2 3 1 7 3 8 7 5 4 11 3 4 0 13 8 11 13 6-27 - Matrice simmetrica #include <stdioh> void main() const unsigned int DIM = 3; unsigned int riga, colonna; unsigned int simmetrica; float matrice [DIM][DIM]; for (riga = 0; riga < DIM; riga++) for (colonna = 0; colonna < DIM; colonna++) printf ("numero (%u,%u): ", riga, colonna); scanf ("%f", &matrice[riga][colonna]); - 28-14
Matrice simmetrica simmetrica = 1; riga = 0; do /* righe */ colonna = riga + 1; do /* colonne */ if (matrice[riga][colonna]!= matrice[colonna][riga]) simmetrica = 0; colonna++; - 29 - Matrice simmetrica while (colonna < DIM && simmetrica == 1); riga++; while (riga < DIM - 1 && simmetrica == 1); if (simmetrica == 1) printf ("Matrice simmetrica\n"); else printf ("Matrice non simmetrica\n"); - 30-15
Puntatori Un puntatore contiene un riferimento ad un altra variabile int a = 125, *p; p = &a; *p = 128; printf ( %d, *p); a (1000) 125 (2000) 1000 p - 31 - Array e puntatori Il nome dell array, usato senza le parentesi, rappresenta l indirizzo in memoria della prima cella (ovvero, un puntatore ad essa) L indirizzo non può essere modificato (ovvero, il nome rappresenta un puntatore costante) int vetta[4], vettb[4]; int *pintero; pintero = vetta; /* Corretto: pintero punta a vetta */ vettb = vetta; /* Errore di compilazione! */ vetta = pintero; /* Errore di compilazione! */ - 32-16
#include <stdioh> Array e puntatori void main() int numeri[5] = 6, 8, -3, 4, 10; int *pint; unsigned int i; pint = numeri; /* pint diventa un alias */ for (i = 0; i < 5; i++) printf ("%d\n", numeri[i]); printf ("%d\n", *(pint + i)); printf ("%d\n", pint[i]); - 33-17