Il costrutto for

L’istruzione for implementa la ripetizione enumerativa (o con contatore): si usa quando sappiamo già
quante volte iterare un insieme di istruzioni.

Sintassi generale

Diagramma del ciclo for illustrato a colori
Figura 1 — Schema visivo del ciclo for
for (inizializzazione; condizione; aggiornamento) {
    // blocco di istruzioni
}
  • inizializzazione: imposta il valore iniziale del contatore;
  • condizione: stabilisce fino a quando il ciclo prosegue;
  • aggiornamento: modifica il contatore ad ogni iterazione.
Nota — Se il corpo del ciclo è una sola istruzione, le parentesi graffe non sono necessarie.
In C++ è comune dichiarare il contatore direttamente nella parte di inizializzazione.

Esempio base

// Stampa i numeri da 1 a 10 (C++)
for (int i = 1; i <= 10; i++) {
    cout << i << " ";
}

Funzionamento passo per passo

  1. Inizializzazione (es. i = 0).
  2. Valutazione della condizione (es. i < 10).
  3. Se vera: esegui il corpo, poi l’aggiornamento (es. i++) e torna al punto 2.
  4. Se falsa: esci dal ciclo.

OSSERVA COME SI FA

1) Somma di 5 numeri interi

#include <iostream>
using namespace std;

int main() {
    int somma = 0, numero;
    for (int i = 1; i <= 5; i++) {
        cout << "Inserire il " << i << "° numero: ";
        cin >> numero;
        somma += numero;
    }
    cout << "La somma è " << somma << endl;
    return 0;
}
Fase i numero somma
inizio 0
1ª iterazione 1 5 5
2ª iterazione 2 6 11
3ª iterazione 3 3 14
4ª iterazione 4 1 15
5ª iterazione 5 2 17
fine ciclo 17

2) Stampare i primi n multipli di k

#include <iostream>
using namespace std;

int main() {
    int n, k;
    do { cout << "Inserisci n > 0: "; cin >> n; } while (n <= 0);
    do { cout << "Inserisci k > 0: "; cin >> k; } while (k <= 0);

    for (int i = 1; i <= n; i++) {
        cout << k*i << endl;
    }
    return 0;
}

3) Somma k + k² + k³ + … + kⁿ

#include <iostream>
using namespace std;

int main() {
    int n, k;
    do { cout << "Inserisci n > 0: "; cin >> n; } while (n <= 0);
    do { cout << "Inserisci k > 0: "; cin >> k; } while (k <= 0);

    long long s = 0, p = 1;
    for (int i = 1; i <= n; i++) {
        p *= k;
        s += p;
    }
    cout << "La somma è " << s << endl;
    return 0;
}

4) Cinque numeri: massimo, media, radice della somma

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int a, max, somma = 0;
    for (int i = 0; i < 5; i++) {
        cout << "Inserisci il numero " << (i+1) << ": ";
        cin >> a;
        if (i == 0 || a > max) max = a;
        somma += a;
    }
    double media = somma / 5.0;
    cout << "Max: " << max << endl;
    cout << "Radice della somma: " << sqrt(somma) << endl;
    cout << "Media: " << media << endl;
    return 0;
}

5) Numero di Fibonacci

#include <iostream>
using namespace std;

int main() {
    int n;
    char cont;
    do {
        do { cout << "Inserisci N (>=0): "; cin >> n; } while (n < 0);

        int fibA = 0, fibB = 1;
        for (int i = 0; i < n; i++) {
            fibB = fibA + fibB;
            fibA = fibB - fibA;
        }
        cout << "Fibonacci(" << n << ") = " << fibB << endl;

        cout << "Continui [s/n]? ";
        cin >> cont;
    } while (cont == 's' || cont == 'S');
    return 0;
}

Break e uscita anticipata

// Termina se l'utente inserisce 'Z'
for (int i = 0; i < 10; i++) {
    char ch;
    cout << "Inserisci una lettera: ";
    cin >> ch;
    if (ch == 'Z') break;
}

ORA TOCCA A TE — Esercizi con soluzioni

E1. Descrivi a parole il problema risolto dal programma che stampa i primi n termini della successione di Fibonacci.


Mostra soluzione


Soluzione. Il programma riceve in ingresso un intero positivo n e stampa in ordine i primi
n termini della successione di Fibonacci. La successione è definita da F(0)=1, F(1)=1,
e per k>1 F(k)=F(k-1)+F(k-2). Ad ogni iterazione si aggiornano due variabili che rappresentano
i due termini più recenti e si produce il successivo, finché non si sono emessi n valori.

E2. Scrivi un programma che legga N (N>0) e stampi i numeri pari da 2 a 2N.


Mostra soluzione


#include <iostream>
using namespace std;

int main() {
    int N;
    do { cout << "Inserisci N > 0: "; cin >> N; } while (N <= 0);
    for (int i = 1; i <= N; i++) {
        cout << 2*i << (i < N ? " " : "\n");
    }
    return 0;
}

E3. Somma dei multipli di 3 compresi tra 1 e N usando un for con passo opportuno.


Mostra soluzione


#include <iostream>
using namespace std;

int main() {
    int N;
    do { cout << "Inserisci N >= 1: "; cin >> N; } while (N < 1);
    long long somma = 0;
    for (int i = 3; i <= N; i += 3) { // passo 3
        somma += i;
    }
    cout << "Somma dei multipli di 3 tra 1 e " << N << " = " << somma << endl;
    return 0;
}

Tabelle di traccia — Ciclo for


Mostra


Come si legge la tabella di traccia

  • Iterazione: Inizio / 1ª / 2ª / … / Uscita.
  • i: valore del contatore.
  • Output parziale: quanto stampato fin lì.
  • Condizione falsa: quando il ciclo termina.

Esempio: numeri pari da 2 a 2N (N = 5)

Iterazione i Valore stampato Output parziale
1 2 2
2 4 2 4
3 6 2 4 6
4 8 2 4 6 8
5 10 2 4 6 8 10

Mini-quiz — Ciclo for (V/F)

Q1. Nel ciclo for, l’aggiornamento del contatore avviene prima del corpo del ciclo. (V/F)


Mostra soluzione


Falso. Sequenza: inizializzazione → test → corpo → aggiornamento. Quindi l’aggiornamento è dopo il corpo.

Q2. Con for (int i = 0; i < 5; i++) il corpo si esegue 5 volte con i = 0,1,2,3,4. (V/F)


Mostra soluzione


Vero. La condizione è i < 5. Quando i diventa 5, la condizione è falsa e il ciclo termina (iterazioni 0→4).

Q3. L’istruzione continue interrompe definitivamente un ciclo for. (V/F)


Mostra soluzione


Falso. continue salta il resto del corpo e passa a aggiornamento + nuovo test. Per terminare il ciclo si usa break.