Enrique sanchez

Generation

fix invalid codeSun, 13 Oct 2024

#include <iostream> #include <iomanip> #include <cmath> #include <limits> // Para numeric_limits #include <cstdlib> // Para system() using namespace std; float roundToTwoDecimals(float value) { return std::round(value * 100) / 100; // Redondear a dos decimales } int main() { // Cambiar el color de fondo a negro y el texto a verde system("color 0A"); // 0 = fondo negro, A = texto verde float pre, iva, tot, subt = 0, camb, pag; int a; cout << "\tTicket de compra" << endl; cout << "\tOXXO" << endl; cout << "\tDirección: Av 16 de septiembre #320 Cuautitlán, México" << endl; cout << "¿Cuántos productos son? "; cin >> a; // Validación de la cantidad de productos while (cin.fail() || a <= 0) { cin.clear(); // Limpiar el error de entrada cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignorar la entrada incorrecta system("color 0C"); // Cambiar a rojo para error cout << "Número de productos inválido. Intente de nuevo: "; cin >> a; system("color 0A"); // Volver a verde después del mensaje } for (int i = 1; i <= a; i++) { cout << "Precio del producto " << i << ": $"; cin >> pre; // Validación del precio del producto while (cin.fail() || pre < 0) { cin.clear(); // Limpiar el error de entrada cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignorar la entrada incorrecta system("color 0C"); // Cambiar a rojo para error cout << "El precio no puede ser negativo. Intente de nuevo: $"; cin >> pre; system("color 0A"); // Volver a verde después del mensaje } subt += pre; } // Redondear el subtotal subt = roundToTwoDecimals(subt); cout << fixed << setprecision(2); // Para mostrar dos decimales system("color 0A"); // Cambiar a verde para mostrar resultados cout << "Subtotal: $" << subt << endl; iva = roundToTwoDecimals(subt * 0.16); cout << "IVA: $" << iva << endl; tot = roundToTwoDecimals(subt + iva); system("color 0B"); // Cambiar a azul claro para mostrar total cout << "Total a pagar: $" << tot << endl; system("color 0A"); // Volver a verde antes de solicitar pago cout << "¿Con cuánto paga el cliente? $"; cin >> pag; // Validación del pago while (cin.fail() || pag < tot) { cin.clear(); // Limpiar el error de entrada cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignorar la entrada incorrecta system("color 0C"); // Cambiar a rojo para error cout << "El pago es insuficiente o inválido. Intente de nuevo: $"; cin >> pag; system("color 0A"); // Volver a verde después del mensaje } camb = roundToTwoDecimals(pag - tot); system("color 0B"); // Cambiar a azul claro para mostrar cambio cout << "Cambio a entregar: $" << camb << endl; system("color 0A"); // Volver a verde antes de mostrar total de productos cout << "Total de productos: " << a << endl; return 0; }

El problema es que estás usando cin.fail() para validar la entrada, pero no estás usando cin.clear() para limpiar el buffer de entrada. Por lo tanto, cuando vuelves a pedir la entrada, el buffer todavía contiene el valor anterior, y por eso te da el error. Para solucionarlo, simplemente añade cin.clear() después de cada cin.fail():

Questions about programming?Chat with your personal AI assistant