Un array (o vettore in C++) è un contenitore di elementi omogenei (tutti dello stesso tipo), memorizzati in posizioni contigue di memoria e indicizzati a partire da 0.
Il nome dell’array rappresenta l’indirizzo del primo elemento; negli argomenti di funzione si comporta come un puntatore.
Proprietà essenziali
- Gli elementi sono dello stesso tipo (es.
int,char,float,double). - Gli indici partono da
0e vanno fino adimensione–1. - La memoria è contigua: accesso molto veloce ma senza controlli automatici di out-of-bounds (C/C++).
- Passando un array a funzione, si passa il suo indirizzo (passaggio per referenza/indirizzo).
Dichiarazione di un array
Sintassi generale:
tipo nomeArray[dimensione];Esempi:
int array_prova[100];char array_pippo[20];
Con costanti simboliche:
#define ARRAY_UNO_MAX 100
#define ARRAY_DUE_MAX 20
int array_uno[ARRAY_UNO_MAX];
char array_due[ARRAY_DUE_MAX];
T[n] o T[-1] è undefined behavior e può causare crash o valori casuali.Inizializzazione di un array
In fase di dichiarazione:
int numeri[3] = {12, 0, 4};
char lettere[5] = {'a','k','z','o','t'};
float decimali[2]= {3.123f, 4.54f};
int Fib[8] = {0,1,1,2,3,5,8,13};
char oper[] = {'+','-','*','/'}; /* dimensione dedotta */
In modo dinamico (durante l’esecuzione):
int numeri_dispari[10];
for(int i=0; i<10; ++i) numeri_dispari[i] = i*3; /* 0,3,6,... */
Vettori: utilità e gestione
I vettori sono utili quando occorre memorizzare e riutilizzare sequenze di valori (ordinamenti, ricerche, statistiche).
Si dimensiona il vettore con una costante (es. #define MaxValori 500) e si distingue tra dimensione massima e numero di elementi utili n (≤ dimensione).
#define MaxValori 500
float Vett[MaxValori]; /* 500 celle float */
int i = 0; /* l'indice parte da 0 */
while(i < MaxValori){
Vett[i] = 0.0f; /* inizializzazione */
i = i + 1;
}
/* L'ultimo indice valido è MaxValori-1 */
Scansione di un vettore
Ascendente (la più comune):
for(int i=0; i<n; ++i) T[i] = 0; /* visita da 0 a n-1 */
Discendente:
for(int i=n-1; i>=0; --i) printf("%d ", T[i]);
Casi di errore tipici
- Sconfinamento: usare indici fuori range (es.
i == dimensioneoi < 0). - Indice oltre gli elementi utili: anche se interno all’array, punta a valori non inizializzati.
- Dichiarazioni non valide:
int Vett[]; /* manca dimensione o inizializzatore */ int Vett[0]; /* vettore “vuoto” */ long int Vett[5000000000]; /* troppo grande */ int Max = 100; long int Vett2[Max]; /* in C: NO (serve costante); in C++ usa constexpr */
Matrici (array multidimensionali)
Una matrice è un array a due dimensioni [righe][colonne] (tabelle). Generalizzabile a 3 o più dimensioni.
int Mat[10][8]; /* 10 righe, 8 colonne */
int M2[2][3] = { {1,2,15}, {22,41,17} };
int Cubo[4][4][4]; /* 3 dimensioni */
Operazioni comuni su matrici
/* Somma di riga e di colonna */
for(int i=0;i<r;i++){
int sommaR=0;
for(int j=0;j<c;j++) sommaR += A[i][j];
printf("Somma riga %d = %d\n", i, sommaR);
}
for(int j=0;j<c;j++){
int sommaC=0;
for(int i=0;i<r;i++) sommaC += A[i][j];
printf("Somma colonna %d = %d\n", j, sommaC);
}
Esempi d’uso (C e C++)
Esempio (C) — Somma di due vettori
#include <stdio.h>
#define MAX 100
int chiedi_dimensione(void){
int n;
do{ printf("n (1..%d): ", MAX); scanf("%d",&n); }while(n<1 || n>MAX);
return n;
}
void carica(int v[], int n){
for(int i=0;i<n;i++){ printf("v[%d] = ",i); scanf("%d",&v[i]); }
}
int somma(const int v[], int n){
int s=0; for(int i=0;i<n;i++) s+=v[i]; return s;
}
int main(void){
int n = chiedi_dimensione();
int v1[MAX], v2[MAX];
printf("Carica v1:\n"); carica(v1,n);
printf("Carica v2:\n"); carica(v2,n);
printf("Somma v1 = %d\n", somma(v1,n));
printf("Somma v2 = %d\n", somma(v2,n));
return 0;
}
Esempio (C) — Tavola pitagorica 0–9
#include <stdio.h>
int main(void){
int T[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
T[i][j]=i*j;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++) printf("%3d ", T[i][j]);
printf("\n");
}
return 0;
}
Esempio (C++) — Caricamento e stampa di un vettore
#include <iostream>
using namespace std;
int main(){
const int n=5;
int T[n];
for(int i=0;i<n;i++){
cout << "T[" << i << "] = ";
cin >> T[i];
}
cout << "Hai inserito: ";
for(int i=0;i<n;i++) cout << T[i] << ' ';
cout << '\n';
return 0;
}
Esempio (C++) — Riempimento casuale 0–9
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
const int n=5;
int T[n];
srand((unsigned)time(nullptr));
for(int i=0;i<n;i++) T[i] = rand()%10;
for(int x: T) cout << x << ' ';
cout << '\n';
return 0;
}
Ricerca e Ordinamento (rapido ripasso)
Ricerca lineare
int cerca(const int v[], int n, int x){
for(int i=0;i<n;i++) if(v[i]==x) return i;
return -1;
}
Ricerca binaria (array ordinato)
int binaria(const int v[], int n, int x){
int l=0, r=n-1;
while(l<=r){
int m=(l+r)/2;
if(v[m]==x) return m;
(v[m]<x)? l=m+1 : r=m-1;
}
return -1;
}
Bubble sort (didattico)
void bubble(int v[], int n){
for(int pass=0; pass<n-1; pass++){
int scambi=0;
for(int i=0;i<n-1-pass;i++){
if(v[i]>v[i+1]){ int t=v[i]; v[i]=v[i+1]; v[i+1]=t; scambi=1; }
}
if(!scambi) break;
}
}
Buone pratiche
- Controllare sempre gli indici: usare intervalli
[0, n). - Passare esplicitamente la lunghezza
nalle funzioni che ricevono array. - In C++ preferire
std::vectorestd::arrayanew[]/delete[]. - Usare
const/constexprper dimensioni note a compile-time.
Esercizi
Esercizi svolti — Array
1) Caricare un array di 10 interi e calcolare la somma.
Soluzione
#include <stdio.h>
int main(void){
int T[10], s=0;
for(int i=0;i<10;i++){ scanf("%d",&T[i]); s+=T[i]; }
printf("Somma = %d\n", s);
return 0;
}
2) Caricare 10 interi e contare quante componenti > 5.
Soluzione
#include <stdio.h>
int main(void){
int T[10], cnt=0;
for(int i=0;i<10;i++){ scanf("%d",&T[i]); if(T[i]>5) cnt++; }
printf("Maggiori di 5: %d\n", cnt);
return 0;
}
3) Raddoppiare i primi 3 elementi di un array di 10 interi.
Soluzione
#include <stdio.h>
int main(void){
int T[10];
for(int i=0;i<10;i++) scanf("%d",&T[i]);
for(int i=0;i<3;i++) T[i]*=2;
for(int i=0;i<10;i++) printf("%d ", T[i]);
printf("\n");
return 0;
}
4) Dato un array di n interi, trovare massimo e posizione.
Soluzione
#include <stdio.h>
int main(void){
int n; scanf("%d",&n);
int v[n], pos=0;
for(int i=0;i<n;i++) scanf("%d",&v[i]);
for(int i=1;i<n;i++) if(v[i]>v[pos]) pos=i;
printf("Max=%d alla posizione %d\n", v[pos], pos);
return 0;
}
5) Verificare se un array è palindromo.
Soluzione
#include <stdio.h>
int main(void){
int n, ok=1; scanf("%d",&n);
int v[n];
for(int i=0;i<n;i++) scanf("%d",&v[i]);
for(int i=0;i<n/2;i++) if(v[i]!=v[n-1-i]){ ok=0; break; }
printf(ok? "Palindromo\n":"Non palindromo\n");
return 0;
}
6) Unire due array ordinati in uno ordinato (merge).
Soluzione
#include <stdio.h>
int main(void){
int n1,n2; scanf("%d %d",&n1,&n2);
int a[n1], b[n2], w[n1+n2];
for(int i=0;i<n1;i++) scanf("%d",&a[i]);
for(int j=0;j<n2;j++) scanf("%d",&b[j]);
int i=0,j=0,k=0;
while(i<n1 && j<n2) w[k++] = (a[i]<=b[j])? a[i++] : b[j++];
while(i<n1) w[k++]=a[i++];
while(j<n2) w[k++]=b[j++];
for(int t=0;t<n1+n2;t++) printf("%d ", w[t]);
return 0;
}
Esercizi svolti — Matrici
7) Tavola pitagorica (0–9).
Soluzione
#include <stdio.h>
int main(void){
int T[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
T[i][j]=i*j;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++) printf("%3d ", T[i][j]);
printf("\n");
}
return 0;
}
8) Somma della diagonale principale di una matrice quadrata (n ≤ 10).
Soluzione
#include <stdio.h>
int main(void){
int n; scanf("%d",&n);
int A[10][10], s=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&A[i][j]);
for(int i=0;i<n;i++) s+=A[i][i];
printf("Somma diagonale = %d\n", s);
return 0;
}
9) Stipendi (5×3): sommare il 2° dipendente.
Soluzione
#include <stdio.h>
int main(void){
int S[5][3], somma=0;
for(int i=0;i<5;i++)
for(int j=0;j<3;j++)
scanf("%d",&S[i][j]);
for(int j=0;j<3;j++) somma+=S[1][j]; /* dipendente 2 */
printf("Somma dipendente 2 = %d\n", somma);
return 0;
}
10) Incassi (3×6): incasso totale di aprile.
Soluzione
#include <stdio.h>
int main(void){
int I[3][6], aprile=0;
for(int r=0;r<3;r++)
for(int m=0;m<6;m++)
scanf("%d",&I[r][m]);
for(int r=0;r<3;r++) aprile += I[r][3]; /* colonna aprile */
printf("Incasso aprile = %d\n", aprile);
return 0;
}
11) Voti (10×4): media del 5° studente.
Soluzione
#include <stdio.h>
int main(void){
int V[10][4]; double s=0;
for(int i=0;i<10;i++)
for(int j=0;j<4;j++)
scanf("%d",&V[i][j]);
for(int j=0;j<4;j++) s+=V[4][j]; /* studente 5 */
printf("Media = %.2f\n", s/4.0);
return 0;
}
12) Verificare se una matrice quadrata è simmetrica.
Soluzione
#include <stdio.h>
int main(void){
int n; scanf("%d",&n);
int A[n][n], ok=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&A[i][j]);
for(int i=0;i<n && ok;i++)
for(int j=i+1;j<n;j++)
if(A[i][j]!=A[j][i]) ok=0;
printf(ok? "Simmetrica\n":"Non simmetrica\n");
return 0;
}