While/Switch Declare Salida extraña
-
25-10-2019 - |
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?
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
.