Hai ragione nel dire che sono versatili. Sono tutti in qualche modo equivalenti da un punto di vista puramente sintattico e se ti vieto di utilizzare il for tu puoi fare la stessa cosa usando il while (e vice versa), però sono due keyword distinte che sottolineano uno use-case tipicamente diverso.
Il ciclo for lo si usa quando si vuole ripetere un blocco di codice per n volte: a runtime, quando inizi ad eseguire un ciclo for, puoi facilmente prevedere quante volte verrà ripetuto. Il ciclo while (e il do-while) lo si usa quando si vuole ripetere un blocco di codice per un numero indefinito di volte, quando non sei sicuro di quante iterazioni sono necessarie a non-soddisfare la condizione. Se non c'è niente da contare, probabilmente vuoi un while.
Se un esercizio ti dice "chiedi all'utente quanti numeri vuole inserire, poi faglieli inserire e calcola la media" allora vuoi usare un ciclo for, perché nel momento in cui esegui il ciclo tu sai esattamente (o meglio, il programma sa esattamente) quante volte verrà ripetuto quel ciclo. Se un esercizio ti dice "chiedi all'utente di inserire una lettera e continua a richiederglielo finché non ne inserisce una maiuscola" allora vuoi usare un ciclo while perché nel momento in cui esegui il ciclo non sai (o meglio, il programma non sa) quante ripetizioni sono necessarie prima di uscire.
Nel tuo caso la soluzione sarebbe
Vedila come come una rule-of-thumb quando non sei sicuro se ti serve un while o un for; poi, ripeto, volendo puoi implementare un tipo di ciclo utilizzandone un altro e col tempo svilupperai una tua preferenza stilistica per questo genere di cose.
Il ciclo for lo si usa quando si vuole ripetere un blocco di codice per n volte: a runtime, quando inizi ad eseguire un ciclo for, puoi facilmente prevedere quante volte verrà ripetuto. Il ciclo while (e il do-while) lo si usa quando si vuole ripetere un blocco di codice per un numero indefinito di volte, quando non sei sicuro di quante iterazioni sono necessarie a non-soddisfare la condizione. Se non c'è niente da contare, probabilmente vuoi un while.
Se un esercizio ti dice "chiedi all'utente quanti numeri vuole inserire, poi faglieli inserire e calcola la media" allora vuoi usare un ciclo for, perché nel momento in cui esegui il ciclo tu sai esattamente (o meglio, il programma sa esattamente) quante volte verrà ripetuto quel ciclo. Se un esercizio ti dice "chiedi all'utente di inserire una lettera e continua a richiederglielo finché non ne inserisce una maiuscola" allora vuoi usare un ciclo while perché nel momento in cui esegui il ciclo non sai (o meglio, il programma non sa) quante ripetizioni sono necessarie prima di uscire.
Nel tuo caso la soluzione sarebbe
C++:
#include <iostream>
using namespace std;
int main(){
char first;
do {
cout << "Inserisci una lettera maiuscola: " << flush;
cin >> first;
} while (first < 'A' || first > 'Z'); // finché (while) first minore di 'A' o (||) maggiore di 'Z'
return 0;
}
Vedila come come una rule-of-thumb quando non sei sicuro se ti serve un while o un for; poi, ripeto, volendo puoi implementare un tipo di ciclo utilizzandone un altro e col tempo svilupperai una tua preferenza stilistica per questo genere di cose.