Autor Tema: ejercicio switch en c y resultados inesperados ¿por qué no funciona?  (Leído 4154 veces)

rackdon

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 50
    • Ver Perfil
Buenas tardes.
He escrito el siguiente código, pero al ejecutarlo el resultado siempre me da 0 en el caso 1 y 2, 250 en el caso 3 y un número larguísimo en el caso 4, independientemente de los valores que introduzca.
¿Alguien me podría decir cual es el fallo que he cometido?, porque no consigo verlo.


Código: [Seleccionar]
// Ejercicio 4.28: Pago semanal de empleados usando switch //

#include <stdio.h>
main()
{
      int opcion , horas_trabajadas, num_piezas;
      double salario_semanal, salario_hora, ventas_brutas, salario_pieza;
     
      printf("1- Administrador\n2- Pago por hora\n3- Pago por comisi%cn\n4- Pago por destajo\n\nPor favor introduzca el c%cdigo de pago del empleado (EOF para finalizar): ", 162, 162);
     
      while ( (opcion = getchar() ) != EOF ) {
            salario_semanal=0;
            switch (opcion) {
                   
                   case '1':
                             printf("Por favor introduzca el salario semanal de este empleado: ");
                             scanf("%f", &salario_semanal);
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             break;
                   
                   case '2': printf("Por favor introduzca el n%cmero de horas trabajadas: ", 163);
                             scanf("%d", &horas_trabajadas);
                             printf("Por favor introduzca el salario por hora: ");
                             scanf("%f", &salario_hora);
                             if (horas_trabajadas > 40)
                                salario_semanal = (salario_hora * 40) + ( salario_hora * 1.5 ) * ( horas_trabajadas % 40 );
                             else
                                salario_semanal = salario_hora * 40;
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             
                             break;
                   
                   case '3': printf("Por favor introduzca las ventas brutas realizadas: ");
                             scanf("%f",&ventas_brutas);
                             salario_semanal = 250 + (ventas_brutas * 0.057);
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             break;
                   
                   case '4': printf("Por favor introduzca el n%cmero de piezas producidas: ",163);
                             scanf("%d", &num_piezas);
                             printf("Por favor introduzca el salario por pieza: ");
                             scanf("%f", &salario_pieza);
                             salario_semanal = salario_pieza * num_piezas;
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             break;
                   
                   case '\n':
                   case '\t':
                   case ' ':
                             break;
                   
                   default:
                            printf("\nC%cdigo incorrecto\n\n", 162);
                            break;
                            } // fin switch
            printf("Por favor introduzca el c%cdigo de otro empleado o EOF para finalizar: ", 162);
                            } // fin while //

system("pause");
return 0;
}   
                           

He probado también a inicializar las variables en 0, pero tampoco funciona.

Muchas gracias.
« Última modificación: 14 de Septiembre 2014, 18:09 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ejercicio switch en c y resultados inesperados
« Respuesta #1 en: 29 de Abril 2014, 22:56 »
Realizando estos cambios el programa me devuelve resultados, de hecho sin estos cambios me da error de compilación relacionado con el tipo con el que está declarado la variable frente al tipo que se pasa a la función scanf. Posiblemente estemos usando distintos compiladores o distintas configuraciones, de ahí que a tí te permita ejecutarlo.

Antes:

scanf("%f", &salario_semanal);
scanf("%f", &salario_hora);
scanf("%f",&ventas_brutas);
scanf("%f", &salario_pieza);

Ahora:

scanf("%lf", &salario_semanal);
scanf("%lf", &salario_hora);
scanf("%lf",&ventas_brutas);
scanf("%lf", &salario_pieza);

Código:

Código: [Seleccionar]
// Ejercicio 4.28: Pago semanal de empleados usando switch //

#include <stdio.h>
int main()
{
      int opcion , horas_trabajadas, num_piezas;
      double salario_semanal, salario_hora, ventas_brutas, salario_pieza;

      printf("1- Administrador\n2- Pago por hora\n3- Pago por comisi%cn\n4- Pago por destajo\n\nPor favor introduzca el c%cdigo de pago del empleado (EOF para finalizar): ", 162, 162);

      while ( (opcion = getchar() ) != EOF ) {
            salario_semanal=0;
            switch (opcion) {

                   case '1':
                             printf("Por favor introduzca el salario semanal de este empleado: ");
                             scanf("%lf", &salario_semanal);
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             break;

                   case '2': printf("Por favor introduzca el n%cmero de horas trabajadas: ", 163);
                             scanf("%d", &horas_trabajadas);
                             printf("Por favor introduzca el salario por hora: ");
                             scanf("%lf", &salario_hora);
                             if (horas_trabajadas > 40)
                                salario_semanal = (salario_hora * 40) + ( salario_hora * 1.5 ) * ( horas_trabajadas % 40 );
                             else
                                salario_semanal = salario_hora * 40;
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);

                             break;

                   case '3': printf("Por favor introduzca las ventas brutas realizadas: ");
                             scanf("%lf",&ventas_brutas);
                             salario_semanal = 250 + (ventas_brutas * 0.057);
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             break;

                   case '4': printf("Por favor introduzca el n%cmero de piezas producidas: ",163);
                             scanf("%d", &num_piezas);
                             printf("Por favor introduzca el salario por pieza: ");
                             scanf("%lf", &salario_pieza);
                             salario_semanal = salario_pieza * num_piezas;
                             printf("\nEl salario semanal de este empleado es de: %.2f euros\n\n", salario_semanal);
                             break;

                   case '\n':
                   case '\t':
                   case ' ':
                             break;

                   default:
                            printf("\nC%cdigo incorrecto\n\n", 162);
                            break;
                            } // fin switch
            printf("Por favor introduzca el c%cdigo de otro empleado o EOF para finalizar: ", 162);
                            } // fin while //

//system("pause");
return 0;
}
Responsable de departamento de producción aprenderaprogramar.com

rackdon

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 50
    • Ver Perfil
Re:ejercicio switch en c y resultados inesperados
« Respuesta #2 en: 30 de Abril 2014, 12:14 »
Muchas gracias, así si que funciona. Pensaba que las variables de tipo double se asignaban también con "%f" y no con "%lf".
¿Hay alguna diferencia si en printf pongo %f en vez de %lf?

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ejercicio switch en c y resultados inesperados
« Respuesta #3 en: 30 de Abril 2014, 12:45 »
Para variables tipo double debes usar siempre %lf cuando tengas que referenciar el tipo, sea en un scanf, un printf o cualquier otra función.

Responsable de departamento de producción aprenderaprogramar.com

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".