Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca...

33
Politecnico Politecnico di Milano di Milano Esercizi C su array e matrici Esercizi C su array e matrici Massimo, media e varianza, ordinamento, Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, ricerca e merge, matrice simmetrica, puntatori puntatori

Transcript of Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca...

Page 1: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

PolitecnicoPolitecnicodi Milanodi Milano

Esercizi C su array e matriciEsercizi C su array e matrici

Massimo, media e varianza, ordinamento, ricerca e Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatorimerge, matrice simmetrica, puntatori

Page 2: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 22 - -

ArrayArray

Array o vettoreComposto da una serie di celleint vett[4] = {3, 5, -6, 10};

vett

0 1 2 3

Stesso tipo per tutte le celleAlloca tutte le celle“lunghezza” dell’array

Tipicamente serve un contatore.

3 5 -6 10

Page 3: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 33 - -

Media e varianzaMedia 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 ai si ottengono:

n

ax

n

ii

1

1

)()( 1

2

n

xaxVar

n

ii

Utilizziamo la funzione predefinita pow(base,esp) che calcola baseesp.

Page 4: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 44 - -

#include <stdio.h>#include <math.h>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];

} .

Media e varianzaMedia e varianza

Page 5: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 55 - -

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);

}

Media e varianzaMedia e varianza

Se l’utente inserisce un solo numero?Verificare l’input dell’utente…

Page 6: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 66 - -

Trova il massimoTrova il massimo

Leggere un insieme di numeri interi e inserirlo in un array. L’insieme sarà terminato dal numero zeroTrovare quindi:

Il numero massimoLa posizione della cella nella quale il numero massimo è stato inserito.

Page 7: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 77 - -

Trova il massimoTrova il massimo#include <stdio.h>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);}

} .

Page 8: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 88 - -

Trova il massimoTrova 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);

}

Page 9: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 99 - -

Ricerca lineareRicerca lineare

L’utente inserisce in un array un certo numero di interiL’utente inserisce un numero e l’elaboratore controlla se è presente nell’arraySe il numero è presente, si visualizza la posizione in cui è stato trovato

Page 10: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1010 - -

Ricerca lineareRicerca lineare

#include <stdio.h>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); .

Page 11: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1111 - -

Ricerca lineareRicerca 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); }} .

Page 12: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1212 - -

Merge di due array ordinatiMerge 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 differentiL’elaboratore crea un terzo array ordinato, utilizzando i due array inseriti dall’utenteInfine, quest’ultimo array viene visualizzato

10

20

30

40

50

10

30

20

40

50

i1 i2im

Page 13: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1313 - -

Merge di due array ordinatiMerge di due array ordinati

#include <stdio.h>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]);

} .

Page 14: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1414 - -

Merge di due array ordinatiMerge di due array ordinati

for (i2 = 0; i2 < n2; i2++){

printf ("Array2, numero: ");scanf ("%d", &array2[i2]);

}i1 = 0;i2 = 0; .

Page 15: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1515 - -

Merge di due array ordinatiMerge 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++;

}} .

Page 16: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1616 - -

Merge di due array ordinatiMerge di due array ordinati

for (im = 0; im < n1 + n2; im++){

printf ("%d\n", merge[im]);}

} .

Page 17: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1717 - -

L’utente inserisce in un array un certo numero di interiL’elaboratore ordina l’array in senso crescente e lo visualizza

Ordinamento per inserzioneOrdinamento per inserzione

0

1

2

3

4

0

1

2

3

4

20

30

0

1

2

3

4

20

20

30

0

1

2

3

4

10

20

25

30

0

1

2

3

4

10

20

25

30

40

0

1

2

3

4

10

L’algoritmo viene applicato mentre l’utente inserisce i dati

Page 18: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1818 - -

#include <stdio.h>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; .

Ordinamento per inserzioneOrdinamento per inserzione

Page 19: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 1919 - -

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;

} .

Ordinamento per inserzioneOrdinamento per inserzione

Page 20: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2020 - -

for (i = 0; i < tot; i++){

printf ("%d\n", numeri[i]);}

} .

Ordinamento per inserzioneOrdinamento per inserzione

Page 21: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2121 - -

Ordinamento con Bubble SortOrdinamento con Bubble Sort

Lo stesso testo dell’esercizio precedenteUsiamo l’algoritmo di ordinamento noto con il nome di “bubble sort” (ordinamento a bolle)

20

10

30

40

0

1

2

3

4

25

25

10

30

40

0

1

2

3

4

20

10

25

30

40

0

1

2

3

4

20

20

25

30

40

0

1

2

3

4

10

L’utente inserisce i dati in modo disordinatoL’algoritmo viene applicato alla fine della fase di inserimento

Page 22: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2222 - -

Ordinamento con Bubble SortOrdinamento con Bubble Sort

Come si effettua lo scambio del contenuto di due variabili?Serve una variabile temporanea:

10 20a tempb

10 20a 10tempb

20 20a 10tempb

20 10a 10tempb

Page 23: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2323 - -

#include <stdio.h>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]);

} .

Ordinamento con Bubble SortOrdinamento con Bubble Sort

Page 24: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2424 - -

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); .

Ordinamento con Bubble SortOrdinamento con Bubble Sort

Page 25: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2525 - -

for (i = 0; i < tot; i++){

printf ("%d\n", numeri[i]);}

} .

Ordinamento con Bubble SortOrdinamento con Bubble Sort

Page 26: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2626 - -

MatriceMatrice

Composta da una matrice di celleint mat[2][4] = {{3,5,7,2},{-4,6,1,1}};

Stesso tipo per tutte le celleAlloca tutte le celle“lunghezze” della matrice

Tipicamente servono due contatori.

mat

0 1 2 3

0

1

3 5 7 2

-4 6 1 1

Page 27: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2727 - -

Matrice simmetricaMatrice simmetrica

L’utente inserisce una matrice quadrata, composta di numeri reali, ed il programma verifica (e visualizza) se è simmetricaLa dimensione della matrice inserita dall’utente è fissata all’interno del programmaRicordiamo che una matrice quadrata è simmetrica sse per ogni i,j vale ai,j = aj,i

1 7 3 8

7 5 4 11

3 4 0 13

8 11 13 6

0

1

2

3

0 1 2 3

Page 28: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2828 - -

#include <stdio.h>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]);

}} .

Matrice simmetricaMatrice simmetrica

Page 29: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 2929 - -

simmetrica = 1;riga = 0;do /* righe */{

colonna = riga + 1;do /* colonne */{

if (matrice[riga][colonna]!= matrice[colonna][riga]){

simmetrica = 0;}colonna++; .

Matrice simmetricaMatrice simmetrica

Page 30: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 3030 - -

Matrice simmetricaMatrice 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");}

} .

Page 31: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 3131 - -

PuntatoriPuntatori

Un puntatore contiene un riferimento ad un’altra variabile

125a

(1000)

int a = 125, *p;p = &a;*p = 128;printf (“%d”, *p);

1000 p

(2000)

Page 32: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 3232 - -

Array e puntatoriArray 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! */

Page 33: Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori.

- - 3333 - -

Array e puntatoriArray e puntatori

#include <stdio.h>

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]); }}.