08 VettMat
08 VettMat
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
A18
A1C
A20
A24
A00
A04
A08
A0C
A10
A14
i 0 1 2 3 4 5 6 7 8 9
11 12
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
19 20
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.