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 0 e vanno fino a dimensione–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];
Attenzione: in C/C++ non ci sono controlli automatici sugli indici. Accedere a 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 == dimensione o i < 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 n alle funzioni che ricevono array.
  • In C++ preferire std::vector e std::array a new[]/delete[].
  • Usare const/constexpr per 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;
}