Pregunta

#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);
}

Permítanme obtener el proceso:

$ ./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

¿Por qué es después de la primera impresión de imprimir el printf Dos veces pero saltándome de la entrada la primera vez. Entonces, ¿cómo se calcula 5.24+5.57+5.24 a igual 28.14?

¿Fue útil?

Solución

Como otros han mencionado, cuando presiona Entrar, se ingresan dos caracteres, the character you enter + the newline, Debe dar cuenta de ambos.

Las posibles soluciones son:

Enfoque 1: la forma C

 scanf(" %c", &item);
       ^^^

Agregue un espacio aquí, o el mejor enfoque,

Enfoque 2: la forma de C ++

Simplemente use la forma C ++ de obtener la entrada del usuario.

cin >> item;

¿Por qué el resultado está indefinido?
Porque no inicializaste la variable total, Esto resulta en Comportamiento indefinido dándote una salida inesperada.
total es un global, por lo que será Inicializado por defecto a 0.0.
La verdadera razón del resultado indefinido está en la respuesta de @Mystical.

Otros consejos

enter es una tecla de tecla: debe tener en cuenta :)

En cuanto a tus matemáticas, nunca inicializas total a 0 Por lo tanto, el valor inicial es indeterminado.

No estaba prestando atención al alcance: la respuesta real para las matemáticas es que el bucle vuelve a registrar el costo anterior cuando enter se presiona. Esto se observa en la respuesta de Mysticial.

Desde el newline ha sido mencionado, responderé a la otra pregunta de por qué 28.14.

Tenga en cuenta que en su conmutador, el valor predeterminado es solo devolver. cost nunca está configurado. Por lo tanto, cuando se lee en el newline Obra el bloque de interruptor y las hojas son intactos.

Entonces el resultado es este:

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'

Respuesta final: 28.14

los t que se ingresa al último no se agrega a total.

Esto se explica fácilmente. Cuando usted entre a y golpear el ENTER clave, este lugar dos caracteres en el búfer de entrada, el a y el newline personaje.

Por eso, por todos menos para el primero, tienes un mensaje espurio ya que lo imprime y luego obtiene el newline De la entrada estándar.

scanf es realmente una cosa de compatibilidad de C en C ++, deberías usar cin >> something (o ningún de las cosas relacionadas con las transmisiones realmente) para la entrada de estilo C ++.

Este doble golpe de Charcaters también explica el total errante también desde que, cuando obtener que newline en, agrega el valor actual del costo otra vez en tu bucle principal.

Su total está compuesto por dos de cada valor debido al hecho de que está agregando cost independientemente del valor ingresado.

Con tu entrada de a,b,a, eso sería 4.25 + 5.57 + 4.25 = 14.07 - a es 4.25, no 5.24. Y 28.14 es exactamente dos veces 14.07.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top