Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: rackdon en 29 de Abril 2014, 20:22

Título: ejercicio switch en c y resultados inesperados ¿por qué no funciona?
Publicado por: rackdon en 29 de Abril 2014, 20:22
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.
Título: Re:ejercicio switch en c y resultados inesperados
Publicado por: César Krall 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;
}
Título: Re:ejercicio switch en c y resultados inesperados
Publicado por: rackdon 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?
Título: Re:ejercicio switch en c y resultados inesperados
Publicado por: César Krall 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.