Sei sulla pagina 1di 9

2

Problema
Si vuole un programma che chieda 10 numeri
dalla tastiera e li visualizzi dallultimo al primo
Vettori e matrici Soluzione attuale (con le conoscenze attuali)
Si possono definire 10 variabili, scrivere 10
scanf e quindi 10 printf
Considerazione
Ver. 2.4
E se fossero 100 numeri? 1000? 10000?
Soluzione ideale
Serve un metodo per definire tutte insieme N
variabili dello stesso tipo, inoltre queste
devono poter essere identificate
2010 - Claudio Fornaro - Corso di programmazione in C singolarmente tramite un numero

3 4

Vettori Vettori
Variabili scalari: contengono un solo valore Definizione (alloca mem. per tutti gli elementi)
Variabili vettoriali: contengono pi valori tipo nome[num_di_elementi ];
dello stesso tipo, detti elementi Esempio
Se il tipo di base (come char, int, long, int vett[10];
double, etc.) gli elementi del vettore sono definisce un vettore di 10 elementi di tipo int
variabili scalari di quel tipo vett:
Tutti gli elementi condividono lo stesso nome
e sono contraddistinti da un indice indicato tra num_di_elementi deve essere una costante
parentesi quadre: intera positiva (no const, no enum) nota al
a[1] a[2] a[3] a[4] momento della compilazione (quindi non si pu
in termini matematici questo si scrive: chiedere allutente mentre il programma gira),
a1 a2 a3 a4 in genere la si indica in una #define
5 6

Vettori Vettori
Lindice deve essere un valore di tipo intero Poich ciascun elemento del vettore del tipo
(non soltanto di valore intero) indicato nella definizione (nellesempio un
Il primo elemento ha indice 0: vett[0] int), pu essere utilizzato in tutti i contesti in
Lultimo elemento di un vettore di N elementi cui si pu usare una variabile di quel tipo
ha indice N1, in questo esempio vett[9] Esempi
Si accede ai singoli elementi indicando il nome int vett[10];
del vettore seguito dallindice dellelemento tra scanf("%d", &vett[4]);
parentesi quadre (costante o variabile): x = vett[4] * 5;
vett[7] vett[i] vett[k+1] infatti vett[4] un valore (scalare) di tipo
int

7 8

Vettori Vettori
Gli elementi del vettore sono allocati in Il nome di un vettore usato dal compilatore
locazioni di memoria contigue e successive come sinonimo dellindirizzo di memoria del
int vett[10]; primo elemento del vettore (non una
variabile non si pu assegnarle un valore)
vett: Supponendo che il vettore vett sia di interi da
61 33 85 12 9 51 12 43 71 32 32 bit e inizi in memoria dallindirizzo A00,
indice 0 1 2 3 4 5 6 7 8 9
vett[0] avr indirizzo A00, vett[1]
elemento A04, , vett[9] A24, lultimo byte A27
vett:
vett[0] vett[3] vett[9]
. . . . . . 61 33 85 12 9 51 12 43 71 32
vett[1] 0 1 2 3 4 5 6 7 8 9
A00

A04

A08

A0C

A10

A14

A18

A1C

A20

A24
vett[2]
Indirizzi crescenti
9 10

Vettori Sforare il vettore


La presenza di un indice suggerisce che sia Si sfora il vettore quando si accede a
possibile efficacemente scandire tutti i valori elementi oltre i limiti del vettore
di un vettore mediante un ciclo for Esempio
Ecco la soluzione del problema iniziale: int vett[4]={1,2,3,4}, x=9, y=8;
#define N 10 vett[5]=12;
int vett[N]; Si accede ad una porzione di memoria che
for (i=0; i<N; i++)
possibile sia adibita ad altro, ad esempio ad
scanf("%d", &vett[i]);
for (i=N-1; i>=0; i--) altre variabili, modificandole involontariamente
printf("%d\n", vett[i]); vett: x: y:
memorizzati in questordine 1 2 3 4 9 12
0 1 2 3
6 3 8 1 9 1 2 4 1 3

A18

A1C

A20

A24
A00

A04

A08

A0C

A10

A14
i 0 1 2 3 4 5 6 7 8 9

11 12

Sforare il vettore Matrici


Esempio tipico Sono variabili vettoriali con due dimensioni
int vett[N]; Definizione
for (i=1; i<=N; i++) tipo nome[numero_righe][numero_colonne];
scanf("%d", vett[i]); lindice delle righe va da 0 a numero_righe-1,
Si salta lelemento 0 e si accede allelemento quello delle colonne da 0 a numero_colonne-1
N che non esiste. int Mx[7][5];
Lo standard non richiede che il compilatore definisce una matrice di 7 righe 5 colonne,
faccia controlli su un eventuale sforamento, lindice delle righe va da 0 a 6, quello delle
molti compilatori lo forniscono opzionalmente, colonne da 0 a 4
ma ci riduce le prestazioni in quanto ad ogni Utilizzo
accesso al vettore viene fatto un controllo Mx[3][2] una variabile scalare di tipo int
preliminare per verificare che non si sfori Mx[3][2] = 12;
13 14

Matrici Matrici
La presenza di 2 indici suggerisce che sia Una matrice in realt un vettore di vettori:
possibile scandire sequenzialmente i valori di int Mx[7][5];
una matrice mediante due cicli for annidati definisce un vettore di 7 elementi
Il codice seguente visualizza una matrice ciascuno dei quali un vettore di 5 int
int mat[RIGHE][COLONNE]; (lassociativit delle parentesi quadre da
... sinistra a destra)
for (r=0; r<RIGHE; r++) Mx:
Mx[0]
{ Mx[1] Mx[5][2]
for (c=0; c<COLONNE; c++) Mx[2]
printf("%d ", mat[r][c]); Mx[3]
Mx[4]
printf("\n"); Mx[5]
} Mx[6]
01234

15 16

Matrici Matrici
Gli elementi Mx[i] sono i 7 vettori di 5 int In C gli elementi di una matrice sono
Ciascuno dei termini Mx[i] viene usato dal memorizzati per righe, questo significa che i
compilatore come sinonimo dellindirizzo di 7 vettori di 5 int sono collocati uno di seguito
memoria del primo elemento di ciascun vettore allaltro in locazioni di memoria crescenti,
di 5 int; quindi non si possono assegnare ossia gli elementi del primo vettore di 5 int
valori a Mx[i] sono seguiti dagli elementi del secondo, etc.
(dopo Mx[0][4]si trova Mx[1][0])
Si accede agli elementi indicando i valori di
tutti gli indici, es. Mx[5][2]
Mx:
01234012340123401234012340123401234

Mx[0] Mx[1] Mx[2] Mx[3] Mx[4] Mx[5] Mx[6]


17 18

Matrici multidimensionali Inizializzazione di vettore


Sono vettori di vettori di vettori di vettori... Se il vettore non inizializzato, i valori in esso
Non c limite al numero delle dimensioni contenuti sono indeterminati
Esempio La lista degli inizializzatori pu essere indicata
int xyz[7][5][4]; tra parentesi graffe dopo un segno =:
int vett[4]={12, 5, 3, 6};
xyz[5][2][3] una variabile scalare di
tipo int Gli inizializzatori devono essere noti al compile
xyz[5][2][3] = 12; time, quindi devono essere espressioni
I 7 elementi xyz[i] (ciascuno dei quali una costanti: numeri, #define, valori enum,
matrice 5x4 di int) e gli elementi xyz[i][j] indirizzi di memoria di variabili statiche ;
(ciascuno dei quali un vettore di 4 int) non non possono essere: variabili, valori const,
possono essere assegnati in quanto sono risultati di funzioni, indirizzi di memoria di
indirizzi di memoria e non variabili variabili automatiche (trattate in altra sezione)

19 20

Inizializzazione di vettore Inizializzazione di matrice


La dimensione pu essere omessa, in questo Se non c inizializzazione, i valori contenuti in
caso viene calcolata dal compilatore contando una matrice (multi-dim.) sono indeterminati
i valori: Gli inizializzatori degli elementi di una matrice
int vett[]={12, 5, 3, 6}; si elencano separando con parentesi graffe i
ci sono 4 elementi, hanno i valori indicati valori delle diverse righe (se bidimensionali)
Se la lista contiene meno valori di quelli int Mx[2][2]={{1,2},{3,4}};
indicati dalla dimensione ma almeno uno, Gli inizializzatori possono non avere le graffe
quelli non specificati sono inizializzati a 0: interne: vengono assegnati ordinatamente agli
int vett[4]={6, 2}; elem. della matrice come se fosse un vettore
i 4 valori sono 6, 2, 0, 0 int Mx[2][2]={1,2,3,4};
Per inizializzare a 0 tutto un vettore: Quando ci sono abbastanza inizializzatori, la
int vettore[10]={0}; prima dimensione pu essere omessa (viene
Il primo valore 0 indicato esplicitamente, i calcolata dal compilatore)
successivi sono posti a 0 automaticamente int Mx[][2]={1,2,3,4};
21 22

Inizializzazione di matrice Esercizi


Le graffe sono necessarie per non specificare 1. Scrivere un programma che chieda quanti
tutti valori intermedi (posti a 0) valori verranno introdotti dalla tastiera (max
int Mx[100][4]={{1,2,3},{4,5}}; 100), li chieda tutti e successivamente li
1a riga: 1, 2, 3, 0 visualizzi dallultimo al primo.
2 riga:
a 4, 5, 0, 0
2. Scrivere un programma che chieda quanti
le altre 98 righe: 0, 0, 0, 0
valori verranno introdotti dalla tastiera (max
Senza graffe vengono assegnati in sequenza 100), li chieda tutti e successivamente
int Mx[100][4]={1,2,3,4,5};
visualizzi prima tutti i valori pari nellordine in
1a riga: 1, 2, 3, 4
2 riga:
a 5, 0, 0, 0 cui sono stati inseriti e poi tutti i valori dispari
le altre 98 righe: 0, 0, 0, 0 nellordine inverso.
Esempio: dati i valori: 8 1 3 2 8 6 5, il
Per inizializzare tutta una matrice a 0
int Mx[100][100]={0}; programma visualizza: 8 2 8 6 5 3 1

23 24

Esercizi Esercizi
3. Scrivere un programma che definisca 2 vettori (Continuazione)
A e B di uguali dimensioni (la dimensione sia Il programma crea un terzo vettore C della
chiesta in input, max 100), chieda in input stessa dimensione di A e B contenente nel 1o
tutti i valori del primo e successivamente tutti elemento la somma del 1o elemento di A e del
i valori del secondo (devono comparire sul 1o elemento di B, nel 2o elemento la somma
video richieste come le seguenti: del 2o elemento di A e del 2o elemento di B etc.
Introdurre il 1 valore di A, Alla fine deve visualizzare tutti gli elementi di
Introdurre il 2 valore di A ecc. posizione (non indice) pari di C (il 2o, il 4o,) e
poi tutti quelli di posizione dispari (1o, 3o,).
e successivamente
Esempio: vettori di lunghezza 4, in A sono
Introdurre il 1 valore di B,
stati messi i valori: 3 5 2 6 e in B: 3 2 6 3,
Introdurre il 2 valore di B ecc.
verranno quindi calcolati e messi in C i valori:
6 7 8 9 e quindi stampati i valori: 7 9 6 8.
25 26

Esercizi Esercizi
4. Scrivere un programma che chieda quanti Continuazione
valori verranno introdotti dalla tastiera (max La media mobile una media aritmetica su solo una
100), li chieda tutti e li collochi in un vettore. parte dei valori (in questo caso 3), ad esempio se
viene data la sequenza di valori:
Successivamente, il programma deve
2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9
determinare il massimo, il minimo, la somma il programma deve calcolare la media di 2.1, 4.2 e
e la media di questi valori. 1.3 e stamparla, poi la media di 4.2, 1.3 e 6.7 e
5. Scrivere un programma che chieda quanti stamparla, poi 1.3, 6.7 e 3.1 e stamparla, ecc. fino a
valori (reali) verranno introdotti dalla tastiera 3.0, 5.4 e 3.1:
(max 100), li chieda tutti, calcoli e stampi la 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9
media mobile a 3 valori di questi numeri. Si 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9
controlli che il numero di valori da introdurre
sia almeno pari a 3. 2.1 4.2 1.3 6.7 3.1 5.5 2.1 4.9 3.0 5.4 3.9

27 28

Esercizi Esercizi
6. Scrivere un programma che acquisisca da 7. Scrivere un programma che definisca una
tastiera un vettore di (max 100) valori di tipo matrice di valori interi e di dimensioni
intero e identifichi la pi lunga sequenza di richieste di volta in volta dallutente (massimo
numeri consecutivi uguali. Se vengono 10x10) mediante input quali quante righe? e
identificate pi sequenze della stessa quante colonne?. Successivamente di tutti
lunghezza, si consideri solo la prima questi valori determini il massimo, il minimo,
identificata. Il programma deve indicare il la somma e la media.
valore ripetuto e il numero di ripetizioni di
quel valore.
Esempio:
Input: 19 3 15 15 7 9 9 9 9 12 3 3 3
Output: numero: 9, ripetizioni: 4
29 30

Esercizi Esercizi
8. Scrivere un programma che definisca una 9. Definire la matrice MX come nel precedente
matrice MX di valori interi e di dimensioni esercizio, questo programma deve indicare se
richieste di volta in volta dallutente (massimo se almeno un quarto dei valori della matrice
20x26) mediante input quali quante righe? e pari. Non interessa sapere quanti siano i
quante colonne? e immetta in ciascuna cella valori pari, ma solo sapere se ce n almeno
un valore casuale (usare rand) compreso tra un certo numero noto a priori (num_righe *
0 e 99. Il programma deve poi visualizzare la num_colonne / 4, attenzione: tronca la
matrice con i valori allineati correttamente parte frazionaria); quindi quando si arriva a
(%3d nella printf) e contare quanti valori contarne esattamente quel numero si pu
uscire dai due cicli annidati per non perdere
sono pari e quanti sono dispari. Si tenga
tempo inutilmente ( inutile contare anche gli
separata la parte relativa allo riempimento altri). Per uscire da pi cicli annidati si pu
della matrice dalle operazioni successive. utilizzare il goto.

31 32

Esercizi Esercizi
10. Si acquisisca da tastiera una matrice di int di 11. Scrivere un programma che definisca una
dimensioni uguale a R righe e C colonne (con matrice 20x26 di valori int casuali (0-99),
R e C costanti predefinite), chieda allutente le chieda allutente di introdurre una matrice
dimensioni r e c di una matrice tali che rR e (dimensioni e valori) e determini se questa
cC, visualizzi tutte le sottomatrici di seconda contenuta nella prima, indicando le
dimensioni rc della matrice data la cui coordinate di ogni ricorrenza della stessa.
somma degli elementi uguale a zero.
Esempio con R=4, C=5, r=2, c=2: 2 12 4 9 7 9 22
-2 -2 4 9 7 Output prodotto: 21 25 9 22 8 11 9
-2 2
-9 13 -5 22 8 16 11 11 9 22
-9 13
Trovata alle coordinate (1,2)
16 -9 1 -9 2 3 2 33 11 9 Trovata alle coordinate (2,3)
13 5
3 2 33 2 9 -9 1
33

Homework 1
Si scriva un programma per calcolare il prodotto
di due matrici. Le dimensioni delle matrici
vengano chieste allutente (max 100x100
ciascuna). Si controlli che le dimensioni delle
matrici siano tali da permettere che esse
vengano moltiplicate.
La matrice risultante deve essere visualizzata.

Potrebbero piacerti anche