# 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: ```cpp cout << 1 << endl; cout << 2 << endl; cout << 3 << endl; cout << 4 << endl; cout << 5 << endl; ``` Con un ciclo: ```cpp 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 ```cpp 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 ```cpp 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 ```cpp 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 ```cpp 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 ```cpp 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) ```cpp 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: ```cpp 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`: ```cpp 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: ```cpp 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.