You are on page 1of 19

I vettori

P. Bernardi

Vettore
Rappresentazione

logica di una serie di


locazioni contigue di memoria.
RAM

v
0
1
2
3
4
5

V identifica un
vettore
di 6 elementi

In C

Pu essere visto come un insieme di variabili


dello stesso tipo aggregate in ununica entit

Identificate globalmente da un nome


Accessibili individualmente tramite un indice che
parte da 0.

Esempio:

V[2]
V[4]

RAM
0
1
2
3
4
5

Dichiarazione di un vettore
Scelto

un tipo, si pu dichiarare un vettore di


lunghezza a scelta del programmatore.
Dichiarazione statica

Esempio:

intV[6]={50,100,23,12,15,180};
RAM
0
1
2
3
4
5

50
100
-23
12
-15
180

/*dichiarazionediun
vettoredi6

numeriinteri*/
V identifica il vettore e ne contiene
lindirizzo di partenza

Ancora un po di hardware..

A seconda del tipo, ciascun elemento del vettore


allocato costituito da una o pi linee (word) di
memoria

La dimensione delle word pu variare a seconda del


microprocessore,
In generale si pu assumere che il byte sia lunit di misura

Per Intel/AMD e molti altri


char: 8bit
- 1byte per elemento
int:
32bit - 4byte per elemento
float: 32bit - 4byte per elemento
double: 64bit - 8byte per elemento

Indici

Programmando in linguaggio C non ci si deve


preoccupare della dimensione di ciascun elemento
Linsieme di locazioni viene letto/scritto in blocco

RAM

Esempio

intV[6];
V[3]=100;
V[5]=1000;

0
1
2
3
4
5

50
100
-23
12
100
-15
180
1000

v
0h
0h
0h
064h

0h
0h
03h
0E8h

Indici (II)
charstringa[5]={p,i,p,p,0};
stringa[3]=0;
stringa[4]=a;

RAM

v
030h

0
1
2
3
4

p
i
p
p
0
o
a

061h

ASCII TABLE

Un semplice programma
#include <stdio.h>
int main(void){
int V[6] = {50,100,-23,12,-15,180};
int V2[6];
V2[1] = V[4];

/* semplice assegnazione */

printf(Contenuto dellelemento di indice 2 %d\n, V[2]);


printf(Acquisci contenuto dellelemento di indice 3: );
scanf(%d, &V2[3]);
return 0;
}

Lettura e scrittura indicizzata


Tramite

una variabile indice possibile


accedere iterativamente agli elementi di un
vettore

Scandendoli tutti
Accedendo solo a parte di esso.

for(i=0;i<6;i++){ /* completo */
printf(elementi %d del vettore = %d, i, V[i]);
}
for(i=2;i<4;i++){ /* parziale */
printf(elementi %d del vettore = %d, i, V[i]);
}

Esercizio
Scrivere

un programma che

Legga da tastiera N elementi interi


memorizzandoli in un vettore
Lacquisizione termina anche quando viene
inserito il valore 0
Si calcoli la media degli elementi inseriti.

Soluzione
#include <stdio.h>
#define N 10
int main(void){
unsigned int i, j;
float media=0;
int valori[N], flag=0;
for(i=0 ; i < N && flag==0 ; i++){
printf(inserisci il valore %d: , i);
scanf(%d, &valori[i]);
media += valori[i];
if (valori[i] == 0) flag=1;
}
media /= (i-flag);
return 0;
}

Dimensione del vettore e


accesso fuori dai limiti

Se dichiaro un vettore V di 10 posizioni, allora posso


accedere ai suoi elementi da 0 a 9.
Se eccedo la dimensione del vettore, ad esempio
richiedendo laccesso alla posizione v[10], posso
incorrere in 2 situazioni:

Il valore che leggo non ha un valore sensato ma viene


comunque acquisito
Il sistema operativo protegge la zona di memoria acceduta
interrompendo lesecuzione del programma e segnalando un
segmentation fault

ATTENZIONE: il compilatore non rileva tali tipi di


errore (non sono errori sintattici, ma semantici).

Esercizio base

Scrivere un programma che definisca, legga e stampi il


contenuto di un vettore di numeri interi.

#include <stdio.h>
#define N 10
int main(void){
unsigned int i;
int valori[N];
for(i=0 ; i < N ; i++){
printf(inserisci il valore alla posizione indice %d: );
scanf(%d, &valori[i]);
}
for(i=0 ; i < N ; i++){
printf(valori[%d]: , valori[i]);
}
return 0;
}

Vettori e cicli con sentinella

Scrivere un programma in grado di acquisire il


contenuto di due vettori in parallelo

Legge V1[i] poi V2[i], dopodich incrementa i


La lettura procede finch

non ho riempito il vettore


Oppure se sono stati inseriti valori uguali un posizioni corrispondenti
di V1 e V2.

Stampi i valori acquisiti.

Esempio:

V1[0] 10 ; V2[0] 5;
V1[1] 1 ; V2[0] 6;

// 15 non primo, continua..


//

Soluzione
#include <stdio.h>
#define N 10
int main(void){
int V1[N], V2[N];
unsigned int i, j, flag=0;
int somma;
for(i = 0 ; i < N && flag == 0 ; i++){
scanf("%d %d", &V1[i], &V2[i]);
/* controllo se somma == numero primo */
somma = V1[i] + V2[i];
flag=1;
for(j=2 ; j < (somma/2) && flag==1 ; j++){
if(somma%j == 0) flag = 0;
}
}
printf("\n\n sono uscito con indice i = %d", i);
for(j = 0 ; j < i ; j++)
printf("\nV1[%d] = %d ; V2[%d] = %d", i, V1[i], i, V2[i]);
return 0;
}

Vettori e cicli annidati

Scrivere un programma che elimini da un vettore


tutti gli elementi multipli di 2.
Le posizioni rimaste vuote vanno scritte a 0 e
portate a fondo vettore
Esempio:

Iniziale
V[5] = {4,3,6,7,9};
Finale
V[5] = {3,7,9,0,0};

Soluzione
#include <stdio.h>
#define N 10
int main(void){
int V[N];
unsigned int i, j, flag=0;
for(i=0 ; i < N ; i++){
printf("inserisci il valore alla posizione indice %d: ", i);
scanf("%d", &V[i]);
}
for(i=0 ; i < N ; i++){
printf("\nV[%d]: %d ",i, V[i]);
}
for(i=0 ; i < N ; i++){
if (V[i]%2 == 0){
for(j = i+1 ; j < N ; j++){
V[j-1] = V[j];
}
V[j-1] = 0;
}
}
printf("\nDOPO L?ELABORAZIONE");
for(i=0 ; i < N ; i++){
printf("\nV[%d]: %d ",i, V[i]);
}
return 0;
}

Vettori e cicli annidati (I)


Scrivere

un programma che stabilisca se un


vettore ne contiene un altro.

Esempio:
V[5] = {1,2,3,4,5}
V1[2]= {3,4}
V2[3] = {2,3,6}

SI
NO

You might also like