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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top