Scaricare la presentazione
1
Esercizi C su array e matrici
Massimo, media e varianza, ordinamento, ricerca e merge, matrice simmetrica, puntatori
2
Array Array o vettore Composto da una serie di celle
int vett[4] = {3, 5, -6, 10}; vett 1 2 3 3 5 -6 10 Stesso tipo per tutte le celle Alloca tutte le celle “lunghezza” dell’array Tipicamente serve un contatore.
3
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 ai si ottengono: Utilizziamo la funzione predefinita pow(base,esp) che calcola baseesp.
4
Media e varianza #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]; }
5
Media e varianza Se l’utente inserisce un solo numero?
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…
6
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.
7
Trova 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 */ } }
8
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);
9
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
10
Ricerca 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);
11
Ricerca lineare i = 0; do { if (numeri[i] == num) trovato = 1; } else
} while (trovato == 0 && i < n); if (trovato) printf ("Numero: %d ", numeri[i]); printf ("Posizione: %u\n", i); }
12
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 i2 im 10 20 30 40 50
13
Merge 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]); }
14
Merge di due array ordinati
for (i2 = 0; i2 < n2; i2++) { printf ("Array2, numero: "); scanf ("%d", &array2[i2]); } i1 = 0; i2 = 0;
15
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++; }
16
Merge di due array ordinati
for (im = 0; im < n1 + n2; im++) { printf ("%d\n", merge[im]); } }
17
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 20 25 30 1 2 3 4 10 20 25 30 40 1 2 3 4 10 30 1 2 3 4 20 1 2 3 4 1 2 3 4 20 20 30 1 2 3 4 10
18
Ordinamento per inserzione
#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;
19
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; }
20
Ordinamento per inserzione
for (i = 0; i < tot; i++) { printf ("%d\n", numeri[i]); } }
21
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 20 25 30 40 1 2 3 4 10 25 10 30 40 1 2 3 4 20 20 10 30 40 1 2 3 4 25 10 25 30 40 1 2 3 4 20
22
Ordinamento con Bubble Sort
Come si effettua lo scambio del contenuto di due variabili? Serve una variabile temporanea: 10 20 a temp b 10 20 a temp b 20 a 10 temp b 20 10 a temp b
23
Ordinamento con Bubble Sort
#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]); }
24
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);
25
Ordinamento con Bubble Sort
for (i = 0; i < tot; i++) { printf ("%d\n", numeri[i]); } }
26
Matrice Composta da una matrice di celle
int mat[2][4] = {{3,5,7,2},{-4,6,1,1}}; mat 1 2 3 3 5 7 2 -4 6 1 Stesso tipo per tutte le celle Alloca tutte le celle “lunghezze” della matrice Tipicamente servono due contatori.
27
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 ai,j = aj,i 1 7 3 8 5 4 11 13 6 2
28
Matrice simmetrica #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]); } }
29
Matrice simmetrica simmetrica = 1; riga = 0; do /* righe */ {
colonna = riga + 1; do /* colonne */ if (matrice[riga][colonna]!= matrice[colonna][riga]) simmetrica = 0; } colonna++;
30
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"); }
31
Puntatori Un puntatore contiene un riferimento ad un’altra variabile …
int a = 125, *p; p = &a; *p = 128; printf (“%d”, *p); (1000) (2000) a 125 1000 p
32
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! */
33
Array 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]); } }.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.