Cicli in C++

Perché utilizzare i cicli?

I cicli permettono di ripetere operazioni automaticamente, rendendo il codice più semplice, leggibile e gestibile. Con i cicli possiamo:

  • Evitare ripetizioni manuali di codice.
  • Gestire grandi volumi di dati in modo efficiente.
  • Risolvere problemi iterativi come elaborazioni di input, calcoli o operazioni ripetitive.

Esempio: Senza un ciclo, per stampare i numeri da 1 a 5:

cout << 1 << endl;
cout << 2 << endl;
cout << 3 << endl;
cout << 4 << endl;
cout << 5 << endl;

Con un ciclo:

for (int i = 1; i <= 5; i++) {
    cout << i << endl;
}

Tipi di cicli in C++

In C++ esistono due tipi principali di cicli: for e while. Sebbene possano essere utilizzati per svolgere gli stessi compiti, ciascuno è ottimizzato per un determinato scenario.

Il ciclo for

Il ciclo for si usa quando si conosce in anticipo quante volte eseguire l’operazione o quando il programma può calcolare il numero di iterazioni prima di iniziare il ciclo.

Esempio: Stampare i numeri da 1 a 10

for (int i = 1; i <= 10; i++) {
    cout << i << " ";
}
// Output: 1 2 3 4 5 6 7 8 9 10

Il ciclo for è particolarmente utile per contare o iterare su sequenze predefinite. La sintassi include:

  • Inizializzazione (int i = 1)
  • Condizione (i <= 10, il ciclo continua fino a quando questa condizione è vera)
  • Incremento (i++, incremento della variabile di controllo)

Il ciclo while

Il ciclo while si utilizza quando il numero di iterazioni non è noto in anticipo. Funziona eseguendo il corpo del ciclo fino a quando una condizione specifica è vera. Questo lo rende utile per problemi dove le iterazioni dipendono da eventi dinamici, come input utente o calcoli progressivi.

Esempio: Continuare a leggere numeri finché la loro somma non supera 100

int somma = 0, numero;
cout << "Inserisci numeri (fermati quando la somma supera 100):" << endl;

while (somma <= 100) {
    cin >> numero;
    somma += numero;
}

cout << "Somma totale: " << somma << endl;

Qui non possiamo sapere a priori quanti numeri l’utente inserirà per superare 100.

Esempio: Cercare un numero in un array senza sapere se è presente

int arr[] = {3, 5, 7, 9, 11, 13};
int lunghezza = 6;
int target = 9, i = 0;

while (i < lunghezza && arr[i] != target) {
    i++;
}

if (i < lunghezza) {
    cout << "Numero trovato all'indice: " << i << endl;
} else {
    cout << "Numero non trovato" << endl;
}

Il ciclo while qui cerca il numero finché non lo trova o finché non ha verificato tutti gli elementi.

Il ciclo do-while

Il ciclo do-while è una variante del ciclo while dove il corpo del ciclo viene eseguito almeno una volta prima di verificare la condizione.

Esempio: Chiedere un numero finché non è positivo, ma garantendo almeno una richiesta

int numero;
do {
    cout << "Inserisci un numero positivo: ";
    cin >> numero;
} while (numero <= 0);
cout << "Grazie! Hai inserito: " << numero << endl;

In questo caso, anche se l’utente inserisse un numero positivo al primo tentativo, il messaggio verrebbe comunque mostrato almeno una volta.

Esempio: Mostrare un menu all’utente almeno una volta

int scelta;
do {
    cout << "Digita 1 per Giocare, 2 per Uscire";
    cin >> scelta;
} while (scelta != 1 && scelta != 2);

if (scelta == 1) {
    cout << "Inizia il gioco!" << endl;
} else {
    cout << "Esci dal gioco." << endl;
}

Scegliere il ciclo giusto

Per scegliere il ciclo più adatto, possiamo seguire una serie di domande:

  1. So di preciso quante volte devo svolgere l’operazione? o Il programma, prima di iniziare il ciclo, saprà quante volte dovrà iterare?

    • Se sì, utilizza un ciclo for.
    • Se no, procedi con la domanda successiva.
  2. Almeno quante volte voglio che venga eseguita l’operazione?

    • Se 0, utilizza un ciclo while.
    • Se 1, utilizza un ciclo do-while.
    • Se maggiore di 1, scegli il ciclo che risulta più comodo per il tuo caso specifico.

Esempi pratici

1. Stampare i numeri pari da 2 a 20 (numero di iterazioni noto)

for (int i = 2; i <= 20; i = i+2) {
    cout << i << " ";
}
// Output: 2 4 6 8 10 12 14 16 18 20

2. Fermarsi quando si verifica una condizione dinamica

Continuare a sommare numeri finché la somma non supera 100:

int somma = 0, numero;
cout << "Inserisci numeri:" << endl;

while (somma <= 100) {
    cin >> numero;
    somma += numero;
}

cout << "Somma totale: " << somma << endl;

3. Validare un input

Utilizzo di un ciclo do-while:

int anni;
do {
    cout << "Quanti anni hai?"<<endl;
    cin >> anni;
} while (anni <= 0);

cout << "Hai " << anni << " anni" << endl;

4. Ricerca di un elemento in un array

Cerchiamo un numero finché non lo troviamo o finché non esauriamo l’array:

int arr[] = {3, 5, 7, 9, 11, 13};
int lunghezza = 6;
int target = 7;
// Al termine del ciclo la variabile 'i' esisterà ancora 
// e "conterrà" la posizione in cui è presente il valore target
int i = 0;

while (i < lunghezza && arr[i] != target) {
    i++;
}

if (i < lunghezza) {
    cout << "Numero trovato all'indice: " << i << endl;
} else {
    cout << "Numero non trovato" << endl;
}

Questo esempio ci mostra come la condizione del nostro ciclo while o do-while possa essere composta da più condizioni effettive unite tra loro da un operatore logico.