[C++] Trovare errori in un programma
Per il seguente esercizio:
Non sono sicuro di aver trovato tutti gli errori, secondo voi ci sono altri errori? Soprattutto non sono sicuro si possano inizializzare variabili constexpr in quel modo. O se c'è qualche errore più sottile che mi è sfuggito.
Questo programma concede 5 tentativi per cercare di indovinare il tasso di cambio tra gli euro e i franchi svizzeri. Purtroppo ci sono degli errori. Trovateli e correggeteli.
Errore 1:
La funzione dovrebbe ritornare un booleano mentre lì ritorna un espressione.
Correzione
Errore 2:
Variabile trouve booleana non inizializzata (riga 19) e poi utilizzata nella condizione di arresto di un ciclo for
Errore 3:
Concezione sbagliata di condizione d'arresto del ciclo for, infatti il ciclo deve terminare se ha trovato il giusto tasso di cambio oppure se il numero di tentativi è superiore (strettamente) a 5
Errore 4: Un punto e virgola che non ci vuole dopo la parentesi tonda del ciclo for
Correzione
Errore 5:
Condizione dentro "if" per determinare l'esito del gioco sbagliata, i non è una variabile dichiarata.
Infatti non può fare più di 5 tentativi per come è costituito il ciclo for, dunque la condizione se ha vinto o meno è sulla variabile trouve
Correzione 5
Non sono sicuro di aver trovato tutti gli errori, secondo voi ci sono altri errori? Soprattutto non sono sicuro si possano inizializzare variabili constexpr in quel modo. O se c'è qualche errore più sottile che mi è sfuggito.
Questo programma concede 5 tentativi per cercare di indovinare il tasso di cambio tra gli euro e i franchi svizzeri. Purtroppo ci sono degli errori. Trovateli e correggeteli.
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 constexpr double taux_change; 6 constexpr int nb_essais; 7 taux_change = 1.18; 8 nb_essais = 5; 9 10 bool egaux(double x, double y, double precision = 1e-2) 11 { 12 return abs(x - y) < precision; 13 } 14 15 int main() 16 { 17 int x; 18 cout << "Qual'è il valore di 1 euro in franchi svizzeri ?" << endl; 19 bool trouve; 20 for (int i(1); trouve or (i < nb_essais); ++i) ; 21 { 22 cout << "Tentativo no" << i << " : "; 23 cin >> x; 24 trouve = egaux(x, taux_change); 25 } 26 if (i > 10) 27 cout << "Perso. :-(" << endl; 28 else 29 cout << "Bravo ! :-)" << endl; 30 31 return 0; 32 }
Errore 1:
La funzione dovrebbe ritornare un booleano mentre lì ritorna un espressione.
10 bool egaux(double x, double y, double precision = 1e-2) 11 { 12 return abs(x - y) < precision; 13 }
Correzione
10 bool egaux(double x, double y, double precision = 1e-2) 11 { 12 if(abs(x - y) < precision){ 13 return true; 14 }else{ 15 return false; 16 } }
Errore 2:
Variabile trouve booleana non inizializzata (riga 19) e poi utilizzata nella condizione di arresto di un ciclo for
Errore 3:
Concezione sbagliata di condizione d'arresto del ciclo for, infatti il ciclo deve terminare se ha trovato il giusto tasso di cambio oppure se il numero di tentativi è superiore (strettamente) a 5
Errore 4: Un punto e virgola che non ci vuole dopo la parentesi tonda del ciclo for
Correzione
19 bool trouve(false); 20 for (int i(1); not(trouve or (i <= nb_essais)); ++i) 21 {
Errore 5:
Condizione dentro "if" per determinare l'esito del gioco sbagliata, i non è una variabile dichiarata.
Infatti non può fare più di 5 tentativi per come è costituito il ciclo for, dunque la condizione se ha vinto o meno è sulla variabile trouve
Correzione 5
26 if (trouve == false) 27 cout << "Perso. :-(" << endl; 28 else 29 cout << "Bravo ! :-)" << endl; 30 31 return 0; 32 }
Risposte
Ma non puoi provarlo il programma? 
Comunque:
Infatti. Vanno inizializzate al momento della dichiarazione.
No, perché? L'espressione viene valutata e il risultato è un booleano. La tua correzione va bene, ma non è necessaria.
Per il teorema di De Morgan la condizione che hai scritto è equivalente a:
che sarà falsa da subito, quindi è da rivedere.
Un altro errore è il tipo di x, che dovrebbe essere double.
Ciao!

Comunque:
non sono sicuro si possano inizializzare variabili constexpr in quel modo
Infatti. Vanno inizializzate al momento della dichiarazione.
Errore 1:
La funzione dovrebbe ritornare un booleano mentre lì ritorna un espressione.
No, perché? L'espressione viene valutata e il risultato è un booleano. La tua correzione va bene, ma non è necessaria.
Concezione sbagliata di condizione d'arresto del ciclo for, infatti il ciclo deve terminare se ha trovato il giusto tasso di cambio oppure se il numero di tentativi è superiore (strettamente) a 5
...
for (int i(1); not(trouve or (i <= nb_essais)); ++i)
Per il teorema di De Morgan la condizione che hai scritto è equivalente a:
not(trouve) and not(i <= nb_essais)
che sarà falsa da subito, quindi è da rivedere.
Un altro errore è il tipo di x, che dovrebbe essere double.
Ciao!
Non dimenticare gli errori alla riga 18: Qual è, senza apostrofo.
"Raptorista":
Non dimenticare gli errori alla riga 18: Qual è, senza apostrofo.
eheh
