Domanda Risolto SOLUZIONE ES C++

Stato
Discussione chiusa ad ulteriori risposte.

iSxND

Utente Bronze
3 Luglio 2018
30
11
4
30
Salve a tutti sono sempre io :D

Dovrei svolgere un esercizio attraverso l'utilizzo dei cicli, il problema che sorge è quello dell' utilizzo della variabile di tipo char, non per come si dichiara, ma il mio problema nasce nella creazione del ciclo e il metodo da utilizzare per fare in modo che l'utente sia obbligato a scegliere tra le lettere dell'alfabeto in caso contrario, rimanga bloccato nel loop.

// stampare la stringa "Inserisci una lettera maiuscola"
// dichiarare una variabile first di tipo char

/* ripetere ----> CREAZIONE DEL LOOP, ma come faccio a fare in modo che l'utente se dovesse sbagliare rimanga intrappolato nel ciclo?

- leggere first finché first minore di 'A' o maggiore di 'Z'
// Hint: ovvero finché l'utente non inserisce una lettera maiuscola */


C++:
#include <iostream>
using namespace std;

int main(){
    cout << "Inserisci una lettera maiuscola: " << flush;
    char first;

    //RIPETERE = CREAZIONE LOOP//
    for(int i=0;  i < first; i++);
        cin >> first;
        if(first>='A' && first<='Z')
            cout << "TUTTO BENE" << flush;
        else{
            //FARE IN MODO CHE RITORNI NEL LOOP IN MODO AUTOMATICO;
        }
}
 
Ultima modifica:
Visto che avevi aperto un altro thread su un problema simile che, almeno a mio avviso, è molto semplice una volta capita la teoria, io proverei a risolvere il tuo dubbio in maniera diversa. Facciamo che io ti faccio una domanda e tu mi dai la risposta. Almeno vediamo di capire cosa hai capito, cosa non hai capito e perché hai problemi a risolvere questi esercizi. Prova a rispondere alle seguenti domande:
  1. Cos'è il ciclo for? Quando lo si usa? Mostrami un esempio.
  2. Cos'è il ciclo while? Quando lo si usa? Mostrami un esempio.
  3. Cos'è il ciclo do-while? Quando lo si usa? Mostrami un esempio.
  4. Quando preferisci il ciclo for rispetto agli altri? Quando preferisci il ciclo while? Quando il do-while?
Dopo che hai risposto a queste domande (a parole tue, senza darmi un link con la spiegazione o allegare la foto del libro), noi te le correggiamo e vediamo di farti capire come si risolve questo esercizio.

Sono d'accordo che la programmazione si impara con la pratica, ma un briciolo di teoria è indispensabile per capire cosa si sta facendo e secondo me le tue lacune sono proprio qui.
 
Ultima modifica:
Rileggendo attentamente la teoria, dovrei aver capito cosa sbagliavo, ho il problema che lo stavo complicando di molto attraverso gli if etc... invece ho notato che è piu facile di quanto pensassi

C++:
#include <iostream>
using namespace std;
    char first;

int main(){
   do{
    cout << "Inserisci una lettera maiuscola: " << flush;
    cin >> first;
   }
   while (first >'Z');
   }
// ASCII  65 -- > 90 = MAIUSCOLE  || 97 -- > 122 = MINUSCOLE
Messaggio unito automaticamente:

Visto che avevi aperto un altro thread su un problema simile che, almeno a mio avviso, è molto semplice una volta capita la teoria, io proverei a risolvere il tuo dubbio in maniera diversa. Facciamo che io ti faccio una domanda e tu mi dai la risposta. Almeno vediamo di capire cosa hai capito, cosa non hai capito e perché hai problemi a risolvere questi esercizi. Prova a rispondere alle seguenti domande:
  1. Cos'è il ciclo for? Quando lo si usa? Mostrami un esempio.
  2. Cos'è il ciclo while? Quando lo si usa? Mostrami un esempio.
  3. Cos'è il ciclo do-while? Quando lo si usa? Mostrami un esempio.
  4. Quando preferisci il ciclo for rispetto agli altri? Quando preferisci il ciclo while? Quando il do-while?
Dopo che hai risposto a queste domande (a parole tue, senza darmi un link con la spiegazione o allegare la foto del libro), noi te le correggiamo e vediamo di farti capire come si risolve questo esercizio.

Sono d'accordo che la programmazione si impara con la pratica, ma un briciolo di teoria è indispensabile per capire cosa si sta facendo e secondo me le tue lacune sono proprio qui.
1. Il ciclo "For" lo si utilizza per ripetere N volte un blocco di codice
Lo si dichiara in questo modo, for (inizializzazione, test di terminazione, avanzamento progressivo) e lo si utilizza quando si sa un numero di iterazioni da effettuare.

ESEMPIO:

C++:
#include <iostream>

using namespace std;

int main(){
    int i,j,tot;
    cout << "\nTABELLINE: " << endl;

        for (i = 0; i <= 10; i++){
        for (j = 0; j <= 10; j++){
         tot = i*j;
            cout << "\t" << tot;
      }
    cout << "\n";
        }
      return 0;
}


2.. while = il ciclo while, lo si utilizza principalmente per verificare la condizione di arresto all'inizio e solamente dopo prende il codeblock,

C++:
#include <iostream>
using namespace std;
int main(){
int i=0;
while(i < 100)
{
cout << "Sono ripetuto per la ""  << i++ << "volta << endl;
i++
}

3. Con il ciclo "do-while"(esegui mentre), diversamente dal while , posso inserire il codice blocco e successivamente verrà verificato attraverso l'espressione-booleana, in caso di false, riprendera il codice blocco, scritto precedentemente.

do
code-block
while (espressione-bool);

Esempio: Lo stesso esercizio.

C++:
#include <iostream>
using namespace std;
    char first;

int main(){
   do{
    cout << "Inserisci una lettera maiuscola: " << flush;
    cin >> first;
   }
   while (first >'Z');
   }



4. Questo non mi è molto chiaro, visto che sono molto versatili
 
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
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.
 
  • Mi piace
Reazioni: iSxND
Ultima modifica:
Penso di star iniziare a capire l'utilizzo dei cilci, sto facendo diversi esercizi, piano piano.
I commenti corrisponderebbero ai passi dell'esercizio e del come ho deciso di svolgerli, come mi avevi consigliato tu :D

C++:
#include <iostream>
using namespace std;

int main(){
    cout << "Inserire un numero positivo: "; // stampare la stringa "Inserire un numero positivo: "
    int n;// dichiarare una variabile intera n
    cin >> n;// leggere n
    if (n < 0){// se n è minore di zero
        cout << "\nAvevo detto positivo! " << endl;// - stampare "Avevo detto positivo!"
        cout << "Errore 7" << endl;;// - uscire dal programma ritornando codice di errore 7
        return 0;
    }

    int F;  // dichiarare una variabile intera F
    F = n;  //inizializzata a n
    for(int i= n-1; i > 1; i--){//iterare su una variabile intera i inizializzata a n-1 e decrescente di 1,finché i è maggiore di 1
        F = F*i; //assegnare a F il prodotto di F e i
    }
    if (F == 0) // se F è zero
        cout << "Il fattoriale di 0 e' 1" << flush;  //stampare "Il fattoriale di 0 è 1"
    else{ // altrimenti
          cout << "Il fattoriale di: " << n << " e' "<< F << flush;  //Fattoriale di 0 è 1" // altrimenti
    }
    return 0;
}
 
cout << "Errore 7" << endl;;// - uscire dal programma ritornando codice di errore 7
La funzione main restituisce un intero, l'exit code: 0 (o EXIT_SUCCESS) indica che il programma ha terminato correttamente e ogni altro valore indica che il programma non è terminato correttamente. Nel tuo caso penso che la richiesta sia di scrivere
C++:
if (n < 0){ // se n è minore di zero
    cout << "\nAvevo detto positivo! " << endl;  // - stampare "Avevo detto positivo!"
    return 7;                                    // - uscire dal programma ritornando codice di errore 7
}
7 è un codice di errore perché non è 0. Dopo aver eseguito il programma usando il terminale di linux puoi leggere l'exit code con il comando echo $? oppure, usando cmd.exe o powershell in windows, con echo %ERRORLEVEL%.

L'idea dietro a questi exit codes è che se usi il tuo programma all'interno di un altro programma (tipicamente uno script), l'altro programma ha un modo semplice e ben definito per capire se il tuo programma ha fatto il suo lavoro o se qualcosa è andato storto.
 
  • Mi piace
Reazioni: iSxND
Ti ringrazio per lle dritte che mi stai dando giornalmente, le sto applicando ogni giorno, già ora mentre sto facendo un paio di esercizi di allenamento e comprensione


C++:
#include <iostream>
using namespace std;
//Scrivere un programma che legge un numero intero n strettamente positivo ed un carattere, e stampa il carattere n volte:

int main(){
cout << "Inserisci un numero maggiore di 0: " << flush; // stampare la stringa "Inserisci un numero maggiore di 0: "
int len; // dichiarare una variabile len di tipo int
cin >> len; // leggere len
if (len <= 0){ // se len non e` maggiore di zero
   cout << "Avevo detto positivo! " << endl; // - stampare "Avevo detto positivo!"
    return 7; // - uscire dal programma ritornando codice di errore 1
    }
cout << "Inserisci il carattere da replicare: " << flush; // stampare la stringa "Inserisci il carattere da replicare: "
char c;// dichiarare una variabile c di tipo char
cin >> c;// leggere c
for(int i=1; i<=len ; i++) { // iterare su i a partire da 1 e fino a len
    cout << "\n" << c << endl; //- stampare c
    }
}

Direi che ora potrei passare gli Array o cosa mi consiglieresti come argomento successivo?
 
return 7; // - uscire dal programma ritornando codice di errore 1
Codice di errore 1, quindi return 1, non return 7.
Direi che ora potrei passare gli Array o cosa mi consiglieresti come argomento successivo?
Segui un percorso prestabilito, tipo quello di un libro. Almeno sai cosa hai fatto prima e cosa dovrai fare dopo per non rimanere con troppe lacune.
 
  • Mi piace
Reazioni: iSxND
Si ero distratto e l'ho risolto utilizzando le informazioni dell'esercizio precedente, che sbadato!
Ti ringrazio ancora
Si puo chiudere :D
 
Stato
Discussione chiusa ad ulteriori risposte.