Mentre la produzione strano istruzione switch /
-
25-10-2019 - |
Domanda
#include <stdio.h>
#include <iostream>
using namespace std;
float cost, total;
bool loop(char item){
switch (toupper(item)) {
case 'A':
cost = 4.25;
return true;
case 'B':
cost = 5.57;
return true;
case 'C':
cost = 5.25;
return true;
case 'D':
cost = 3.75;
return true;
case 'T':
return false;
}
return true;
}
int main(){
char item;
do {
printf("\nEnter Item Ordered [A/B/C/D] or T to calculate total:");
scanf("%c", &item);
total = total + cost;
} while (loop(item));
printf("Total Cost: $%f\n", total);
}
Fammi uscita del processo:
$ ./Case3.o
Enter Item Ordered [A/B/C/D] or T to calculate total:a
Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:b
Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:a
Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:t
Total Cost: $28.139999
Perché è dopo il primo printf la sua stampa del printf
due volte, ma mi saltare da input per la prima volta. allora come si calcola 5,24 + 5,57 + 5,24 per uguagliare 28.14?
Soluzione
Come altri hanno detto, quando si preme Invio, due personaggi vengono immessi, the character you enter + the newline
, devi conto per entrambi questi.
Le soluzioni possibili sono:
Approccio 1: Il modo C
scanf(" %c", &item);
^^^
Aggiungi uno spazio qui, o l'approccio migliore,
Approccio 2: Il modo in cui C ++
è sufficiente utilizzare la via C ++ di ottenere input da utente.
cin >> item;
Perché il risultato è indefinito?
Poiché non è stato inizializzato il total
variabile, questo si traduce in comportamento non definito ti dà uscita inaspettata.
total
è una società globale in modo che sarà Predefinito Initialized per 0,0.
motivo reale per il risultato indefinito è in @ risposta di mistico.
Altri suggerimenti
enter
è una combinazione di tasti - è necessario conto per esso:)
Per quanto riguarda la matematica, si total
mai inizializzazione per 0
quindi il valore iniziale è indeterminato.
Non stava prestando attenzione alla scoping - la vera risposta per la matematica è che il ciclo ri-aggiunge il costo precedente quando si preme enter
. Questo si nota in risposta di Mysticial.
Dato che il newline
è stata menzionata, risponderò l'altra domanda del perché 28.14
.
Si noti che in switch, il default è solo ritorno. cost
non viene mai impostato. Pertanto, quando si legge nel newline
salta il blocco dell'interruttore e foglie costano intatta.
Quindi, il risultato è questo:
total = 0; // It's actually undefined since you didn't initialize, but it probably started as zero.
total += 4.25; // For a
total += 4.25; // For '\n' after the 'a'
total += 5.57; // For b
total += 5.57; // For '\n' after the 'b'
total += 4.25; // For a
total += 4.25; // For '\n' after the 'a'
Risposta finale: 28.14
Il t
immesso scorso non ottiene aggiunto al total
.
Questo è facilmente spiegabile. Quando si entra a
e premere il tasto ENTER
, questi luoghi due caratteri nel buffer di ingresso, il a
e il carattere newline
.
Ecco perché, per tutti, ma la prima, si ha una richiesta falsa in quanto la stampa e poi ottiene il newline
dallo standard input.
scanf
è davvero una cosa compatibilità C in C ++, si dovrebbe utilizzare cin >> something
(o qualsiasi di roba flussi-correlati in realtà) per C ++ -. Stile di input
Questo doppio colpo di charcaters spiega anche il totale errante pure poiché, quando si get che newline
in, si aggiunge il valore attuale del costo nuovo nel ciclo principale .
Il totale è composto da due di ogni valore a causa del fatto che si sta aggiungendo cost
indipendentemente dal valore immesso.
Con la voce di a,b,a
, che sarebbe 4.25 + 5.57 + 4.25 = 14.07
- a
è 4.25
, non 5.24
. Ed è esattamente 28.14
14.07
due volte.