Importante bucle mientras

Iniciado por ElfoArdiente, 16 Mayo 2019, 02:49 AM

0 Miembros y 1 Visitante están viendo este tema.

ElfoArdiente

AYUDA POR FAVOR!!!
estoy haciendo un programa en C para una materia en algoritmo y necesito ayuda para regularizar la materia, por favor

mi problema es el bucle while mi condición no me cumple ayudaaa..

MI CODIGO:


// Trabajo Evaluativo

#include<stdio.h>

int main(){

// Declaracion de variables.

int n_cliente, opcion, recauda_combo, pre_combo1, pre_combo2, pre_combo3, pago, total, precioFinal, cant_cliente;

// Declaracion de variables auxiliares.

pre_combo1 = 250;  //precio del combo 1
pre_combo2 = 255; // precio del combo 2
pre_combo3 = 350; // precio del combo 3

/*

Opcion 1 = combo1
Opcion 2 = combo2
Opcion 3 = combo3

*/

// Ingreso de datos.

printf("Ingrese el numero del cliente: \n");
scanf("%d",&n_cliente);

printf("Ingrese el precio del combo elegido: (1-combo 1: $250, 2-combo 2: $255, 3-combo 3: $350):\n");
scanf("%d",&opcion);

printf("Ingrese la forma de pago: (1- efectivo, 2- tarjeta de debito, 3- tarjeta de credito): \n");
scanf("%d",&pago);

// Inicio de la estructura iterativa mientras.

while(n_cliente != 9999){  // al escribir 9999 no me sale del bulce
   
   // Inicio de la estructura selectiva segun sea.
   
   switch (opcion){
      
      case 1:
            printf("Selecciono la opcion combo 1: \n\n");
           
            // Inicio de la estructura anidada para el combo1.
           
            if((opcion == 1)&&(pago == 1)){
               
               cant_cliente = n_cliente * pre_combo1;   /* Cant_cliente es el total de clientes por el combo elegido.*/
               total = cant_cliente * 0.10;           //  calculando el porcentaje y guardando en la variable total.
               precioFinal = cant_cliente - total;    //  calculando el descuento para obtener el precio total.
                   // recaudacion
               
               printf("El precio que debe pagar por el combo elegido es: %d \n\n",precioFinal);
               
           }else{
              
              if((opcion == 1)&&(pago == 2)){
                 cant_cliente = n_cliente * pre_combo1;
                 total = cant_cliente;
              
                 
                 printf("El precio que debe pagar por el combo elegido es: %d \n\n",total);
                 
              }else{
                 
                 if((opcion == 1)&&(pago == 3)){
                    
                    cant_cliente = n_cliente * pre_combo1;
                    total = cant_cliente * 0.25;
                    precioFinal = cant_cliente - total;
                    
         
                    printf("El precio que debe pagar por el combo elegido es: %d \n\n",precioFinal);
                 }
              }
           }
           break;
           
           case 2:
              
              printf("Seleciono la opcion combo 2: \n\n");
              
              // Inicio de la estructura anidada para el combo2.
              
              if((opcion == 2)&&(pago == 1)){
               
               cant_cliente = n_cliente * pre_combo2;
               total = cant_cliente * 0.10;
               precioFinal = cant_cliente - total;
               recauda_combo = precioFinal;
               
               printf("El precio que debe pagar por el combo elegido es: %d \n\n",precioFinal);
               
           }else{
              
              if((opcion == 2)&&(pago == 2)){
                 
                 cant_cliente = n_cliente * pre_combo2;
                 total = cant_cliente;
                 recauda_combo = total;
                 
                 printf("El precio que debe pagar por el combo elegido es: %d \n\n",total);
                 
              }else{
                 
                 if((opcion == 2)&&(pago == 3)){
                    
                    cant_cliente = n_cliente * pre_combo2;
                    total = cant_cliente * 0.25;
                    precioFinal = cant_cliente - total;
                    recauda_combo = precioFinal;
                    
                    printf("El precio que debe pagar por el combo elegido es: %d \n\n",precioFinal);
                    
                 }
              }
           }
           break;
          
           case 3:
          
           printf("Selecciono la opcion combo 3: \n\n");
          
           // Inicio de la estrutura anidada para el combo3.
          
           if((opcion == 3)&&(pago == 1)){
               
               cant_cliente = n_cliente * pre_combo3;
               total = cant_cliente* 0.10;
               precioFinal = cant_cliente - total;
               
               
               printf("El precio que debe pagar por el combo elegido es: %d \n\n",precioFinal);
               
           }else{
              
              if((opcion == 3)&&(pago == 2)){
                 
                 cant_cliente = n_cliente * pre_combo3;
                 total = cant_cliente;
                 
                 printf("El precio que debe pagar por el combo elegido es: %d \n\n",total);
                 
              }else{
                 
                 if((opcion == 3)&&(pago == 3)){
                    
                    cant_cliente = n_cliente * pre_combo3;
                    total = cant_cliente * 0.25;
                    precioFinal = cant_cliente - total;
                    
                    printf("El precio que debe pagar por el combo elegido es: %d \n\n",precioFinal);
                 }
              }
           }
           break;
          
           default: printf("Opcion invalida vuelva a intentarlo: \n\n");    
          
   }               
                    // Mostrar el importe total del combo.
               
               printf("El improte total del combo es: %d\n\n",cant_cliente);
   
   
                  // Mostrar la cantidad de clientes que eligieron el combo 2.
                     
                    if(opcion == 2){
                       
                       printf("La cantidad de clientes que eligieron el combo 2 es: %d\n\n",n_cliente);
                       
               }
               
               // Mostrar el porcentaje respecto del combo a pagar.
               
                 if((opcion == 1)&&(pago != 2)){
         
                      printf("El importe de descuento del combo es: %d\n\n",total);
               
                   }else{
              
                   if((opcion == 2)&&(pago != 2)){
                 
                     printf("El importe de descuento del combo es: %d\n\n",total);
                 
                 }else{
                 
                  if((opcion == 3)&&(pago != 2)){
                    
                    printf("El importe de descuento del combo es: %d\n\n",total);
            
                  }
                }
               }
               
               // Mostrar  el importe de  recaudacion de un combo.
               
               printf("El importe recaudado del combo es $%d:\n\n",recauda_combo);
               
               // Ingreso de datos.
   
                   printf("Ingrese el numero del cliente: \n\n");
                    scanf("%d",&n_cliente);

                    printf("Ingrese el precio del combo elegido: (1-combo 1: $250, 2-combo 2: $255, 3-combo 3: $350): \n");
                    scanf("%d",&opcion);

                    printf("Ingrese la forma de pago: (1- efectivo, 2- tarjeta de debito, 3- tarjeta de credito): \n");
                    scanf("%d",&pago);
               
   
}

return 0;

}

@XSStringManolo

No veo por ningun lado que le asignes a n_cliente el valor 9999 para salor del bucle o que le des la opcion al usuario de que lo haga.
O estoy ciego o no lo has incluido. Utiliza las etiquetas GeSHI y selecciona el lenguaje en el foro.
Intenta formatear mejor el codigo de tus programas para que sean legibles a simple vista e intenta utilizar alternativas mas cortas.

K-YreX

Bueno varias cosas. El programa como ya te han dicho se puede hacer más legible y debes ponerlo entre etiquetas de código GeSHi.
El programa no tiene ningún error y finaliza cuando introduces el número 9999 como cliente. Pero antes debes introducir las otras dos variables que pides. Si no quieres que pase esto debes pedir el número del cliente antes de empezar el <while> y justo antes de terminarlo y las otras dos variables pedirlas únicamente dentro del <while>.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

ElfoArdiente

#3


#include<stdio.h>

int main()
{
int n_clien, opc, pago;
int tot, porc, recaud;

/*
n_clien = numero de clientes.
opc = opcion.
tot = total.
porc = porcentaje.
recaud = recaudacion.
*/

  printf("Ingrese el numero de cliente: ");
  scanf("%d",&n_clien);
  printf("Ingrese el precio: (1-250, 2-255, 3-250):");
  scanf("%d",&opc);
  printf("Ingrese el pago: (1-efectivo, 2-T. credito, 3-T. debito):");
  scanf("%d",&pago);
 
  if((opc == 2)&&(pago == 1))
  {
  tot = n_clien * 255;
  porc = tot * 0.05;
  recaud = tot - porc;
  }
  else{
 
   if((opc == 2)&&(pago == 2))
   {
   
  tot= n_clien * 255;
     
}
else{

if((opc == 2)&&(pago == 3))
{

tot = n_clien * 255;
porc = tot * 0.05;
recaud = tot - porc;

}
  }  
 }

 printf ("\nEl total del precio es: %d\n",tot);
 
 printf ("\nEl precio con el descuento es: %d\n",recaud);
 
 printf ("\nEl descuento sobre el total es: %d%%\n",porc);
 
 printf ("\nEl numero de clientes que eligieron el combo 2 es: %d\n",n_clien);
 

}



Mira hay corregi el código

Como hago para hacer un bucle que se itere varias veces y al final en la salida me de los resultados de los printf
PD: intente hacer con el bucle while pero al intentar finalizar el programa el bucle, no me sale y en la salida me sigue preguntando si quiere ingresar tanto.. Y queda como un bucle infinito, nose si me entienden soy muy novato y mis profes no me enseñan nada, me pueden ayudar porfa

@XSStringManolo

No entiendo muy bien que quieres hacer.
Puedes echarle la culpa a los profesores o buscarte la vida leyendo libros, tutoriales etc.
Se puede aprender en 1 semana lo que te van a pedir todo el curso de programación.

K-YreX

Repites muchas veces el mismo código lo cual no es para nada eficiente. Tienes que pensar bien lo que quieres hacer antes de programar. Haz un esquema en un papel o algo por el estilo que te ayude a organizar la información.
Te dejo un ejemplo para que veas que se puede organizar mejor el código basándome en el primer código que publicaste. No está completo ya que lo que tienes bien te he puesto un comentario para que lo incluyas tú. Tampoco era plan de hacerlo todo. Espero que te sirva de ayuda porque no es algo que haga a menudo así que aprovéchalo.

Debes ver qué cosas quieres guardar y cuales no hace falta; por ejemplo no es necesario guardar el precio antes del descuento y después (si fuera necesario pues entonces sí, creas una variable <precio_inicial> y otra <precio_final>). Si quieres mostrar cuántos clientes han elegido la opción 2 no tiene mucho sentido mostrarlo al terminar cada iteración porque en este caso si la opción es 2, los clientes que habrán elegido la opción 2 son todos <numero_clientes> y si la opción no es 2, entonces ninguno. Lo lógico desde mi punto de vista sería mostrar eso al terminar el programa (entonces en cada vuelta si la opción es 2, acumulamos los clientes que han elegido esa opción).

// creamos constantes globales para los precios ya que usar numeros sueltos que no se sabe lo que significa no es una buena practica
const int PRECIO_1 = 250;
const int PRECIO_2 = 255;
const int PRECIO_3 = 350; // supongo esto ya que en el ultimo mensaje es 250 igual que precio1

// constantes para los descuentos
const float DESCUENTO_1 = 0.15;
const float DESCUENTO_3 = 0.25;

// constante para determinar el valor que se usa para finalizar el programa
const int CLIENTES_EXIT = 9999;

int main(){
    // creamos las variables que vamos a usar pensando bien en lo que necesitamos
    int numero_clientes; // numero de clientes que van a "comprar" una de las opciones
    int clientes_opcion2 = 0; // numero de clientes que eligen la opcion 2
    int opcion_precio, opcion_pago; // opciones tanto de precio como de forma de pago
    float precio, descuento; // precio de la compra (con decimales) y descuento aplicado

    // pides el numero de clientes
    while(numero_clientes != CLIENTES_EXIT){
        // pides las opciones

       // calculamos los precios segun el precio por cliente
        if(opcion_precio == 1)
            precio = numero_clientes * PRECIO_1;
        else if(opcion_precio == 2)
            precio = numero_clientes * PRECIO_2;
        else
            precio = numero_clientes * PRECIO_3;

        // calculamos lo necesario segun el metodo de pago
        if(opcion_pago == 1)
            descuento = precio * DESCUENTO_1;
        else if(opcion_pago == 3)
            descuento = precio * DESCUENTO_3;
        else // si no es la opcion 1 ni 3, entonces es la 2 (suponiendo que solo se admiten esos 3 valores)
            clientes_opcion2 += numero_clientes; // equivalente a clientes_opcion2 = clientes_opcion2 + numero_clientes

        // aplicamos el descuento
        precio -= descuento; // equivalente a decir precio = precio - descuento

        // mostramos los resultados
        printf("El importe final es: %.2f\n", precio); // mostramos el precio con 2 decimales
        // muestras el descuento de la misma manera (CUIDADO: si la opcion de pago es 2 se mostrara el descuento de la repeticion anterior ya que no se actualiza)

        // pides numero de clientes nuevamente para repetir el programa
    }
    // llegamos aqui una vez que introducimos <numero_clientes = 9999>
    printf("El numero de clientes que han elegido la opcion de pago 2 son: %d\n", clientes_opcion2);
}


A la hora de pedir las opciones hay un problema. Que pasa si el usuario introduce opciones no válidas?? O qué pasa si el usuario introduce <numero_clientes = 10000>??
Bueno lo segundo es fácil. Cambiamos la condición del <while> por un (numero_clientes < CLIENTES_EXIT) y listo.
Lo primero se suele solucionar con lo que se conoce como filtro. Un filtro es un bucle que pide un valor al usuario y se repite mientras el valor no sea válido, o sea básicamente un filtro que solo deja pasar valores válidos. Esto se implementa con un <do while>. Te dejo un ejemplo de un filtro para que solo deje pasar números positivos y pares. Como tarea te queda adaptarlo a ti a tu problema...

int numero;
do{ // hacer lo que hay dentro del bucle (pedir un valor)...
    printf("Introduce un numero par y positivo: ");
    scanf("%d", &numero);
}   while(numero < 0 || numero % 2 != 0); // ... mientras el numero sea menor que 0 o sea impar
// cuando un valor pase el filtro llegamos aqui y podemos asegurar que ese valor es positivo y par
printf("El numero introducido es: %d\n", numero);
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

ElfoArdiente

woooooowww!!! realmente eres muy bueno ;D ;D, muchisimas gracias por ayudarme a comprender, ahora voy a terminar mi codigo, ojala algun dia puede agradecerte

ElfoArdiente

Cita de: ElfoArdiente en 17 Mayo 2019, 05:48 AM
woooooowww!!! realmente eres muy bueno ;D ;D, muchisimas gracias por ayudarme a comprender, ahora voy a terminar mi codigo, ojala algun dia pueda agradecerte en persona