Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Resultados no son los esperados

Estas en el tema de Resultados no son los esperados en el foro de C/C++ en Foros del Web. Hola buena tarde. Recien estoy empezando en C y estoy haciendo un problema en el cual tengo que imprimir el sueldo por N días laborados ...
  #1 (permalink)  
Antiguo 24/09/2015, 18:13
 
Fecha de Ingreso: septiembre-2015
Mensajes: 2
Antigüedad: 8 años, 7 meses
Puntos: 0
Resultados no son los esperados

Hola buena tarde.
Recien estoy empezando en C y estoy haciendo un problema en el cual tengo que imprimir el sueldo por N días laborados a un empleado:
Los dato que ingreso es el nombre del empleado, los días elaborados, las piezas elaboradas por dia y una condición si trabaja tiempo extra cada piaza se le pagara a veinte centavos. También hay otras condición en el cual si se determina que su producción es arriba de x cantidad se aplicara un bono de producción.

El problema que tengo es que solamente me sale el calculo del sueldo por periodo.

Aquí el código, realmente se que hay otras estructuras para realizarlo pero ahorita necesito dejarlo con esta estructura, if, while, for. Si me pueden dar una idea lo que estoy haciendo mal les agradeceré demasiado.

#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, prod2, prod, suma, text, pztext, spzatext;
float total, bonif, bono, sbon, sxdia, sper;
char nombre[20];
printf ("Ingrese el nombre del empleado: ");
scanf ("%s", nombre);
printf ("Ingrese el sueldo diario: ");
scanf ("%d", &sxdia);
printf ("Ingrese cantidad de dia laborados: ");
scanf ("%d", &n);
for (i=1;i<=n;i++)
{
printf ("ingrese la produccion del dia %d: ",i);
scanf ("%d",&prod);
suma=suma+prod;
if (prod >= 1000 && prod <= 1199)
bono=sxdia*0.10;
if (prod >= 1200 && prod <= 1299)
bono=sxdia*0.15;
if (prod >= 1300 && prod <= 1399)
bono=sxdia*0.20;
if (prod >= 1400 && prod <= 1499)
bono=sxdia*0.25;
if (prod > 1500)
bono=sxdia*0.30;
sbon=sbon+bono;
printf ("Laboro tiempo extra? 1 = SI, 2 = NO: ");
scanf ("%d", &text);
while (text != 1 && text != 2)
{
printf ("Error! ingrese: 1 = SI, 2 = NO: ");
scanf ("%d", &text);
}
if (text == 1)
{
printf ("Ingrese las piezas elaboradas: ");
scanf ("%d", &pztext);
}
pztext = pztext*0.20;
if (text == 2)
{
spzatext=spzatext+pztext;
}
}
bonif = sbon;
sper = sxdia*n;
total = sper+spzatext+bonif;
printf ("Empleado: %s\n ",nombre);
printf ("Tu produccion por Periodo es: %d\n ",suma);
printf ("Sueldo Periodo: %d\n ",sper);
printf ("Tiempo Extra: %d\n ",spzatext);
printf ("Bono Extra:%d\n ",bonif);
printf ("Total:%d\n ",total);
system ("pause");
return 0;

}



De antemano, saludos.
  #2 (permalink)  
Antiguo 25/09/2015, 01:46
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Resultados no son los esperados

tu programa tiene varios errores y algúnos detalles a mejorar.

errores

¿Qué bono se aplica si la producción es menor de 1000? Si tu respuesta rápida es 0... repasa el programa.

Si no se trabaja ningún día, ¿Cuánto vale sbon,spzatext? Si tu respuesta rápida vuelve a ser 0... vuelve a repasar el programa.

En resumen... suma,sbon,spzatext,bono y otras tantas variables no están inicializadas, luego arrojarán resultados totalmente aleatorios.

Otra más... ¿qué bono se aplica si prod vale exactamente 1500?

mejoras

if ... if ... if ... if ... hay diseños mejores a la hora de concatenar varios if. La primera opción pasa por usar la sentencia else, de tal forma que evitas la posibilidad de solapar condiciones (imagínate que te equivocas y en vez de prod>=1400 pones prod>=140...

Código C:
Ver original
  1. if (prod>=1000&&prod<1200) ...
  2. else if (prod<1300) ...
  3. else if (prod<1400) ...
  4. else if (prod<1500) ...
  5. else /* prod >= 1500 */ ...

otra opción, aplicable a tu caso, sería omitir los else pero ir acumulando el bono:

Código C:
Ver original
  1. if(prod>=1000) bono=0.10;
  2. if(prod>=1200) bono+=0.05;
  3. if(prod>=1300) bono+=0.05;
  4. // ...

Por otro lado, los nombres de algunas variables no tienen ningún sentido. ¿Por qué una variable que se llama text es de tipo int? Puedes alegar que el nombre viene de TiempoEXTra, pero a la hora de usar acrónimos tienes que evitar que el nombre parezca algo que no es. Hay muchas formas de nombrar variables, yo te aconsejaría usar algúna en la que los fragmentos de cada palabra estuviesen bien diferenciados, ya sea con cambios de mayúsuclas-minúsculas (TExt ó tExt) o con el uso de separadores (t_ext). Y lo mismo aplicable a otras tantas variables.

También tienes que procurar que el nombre utilizado sea totalmente representativo, es decir, que el nombre sea capaz de indicar la utilidad de esa variable. En esta línea, sxdia podría tener un nombre un poco más largo, como sueldoxdia. La idea es que el programa sea fácil de leer. Cuando lo estás haciendo es fácil recordar todos los detalles del programa, pero si lo coge alguien nuevo o tú dentro de un tiempo puede no ser tan sencillo entender el código.

Otra cosa más, queda raro que declares una variable de un tipo e intentes almacenar datos de un tipo diferente. Tal es el caso de sxdia, declarada como float pero al usuario únicamente le dejas meter un int. Este tipo de prácticas pueden dar problemas en programas más complejos... perfectamente puedes no darte cuenta de que scanf te está almacenando un int y tu, al esperar un float veas que desaparecen los decimales y que el resultado final es incorrecto.

Y para terminar, procura no tener variables sin uso. No aportan absolutamente nada al programa salvo basura.

En la línea del párrafo anterior, conviene que aprendas a fijarte en los warnings del compilador de cara a intentar eliminarlos todos. Vale que un warning no deja de ser una advertencia, pero algunas de esas advertencias son bastante serias... por ejemplo el compilador te devolverá un warning si en una función que, por ejemplo, tiene que retorar un int no se encuentra el return correspondiente... ¿qué devuelve entonces la función? pues esta indeterminación tan sería es tratada como un simple warning. No olvides que los warnings son básicamente errores que no impiden que se genere código compilable, así que acostúmbrate a tratarlos como errores.

Un saludo
  #3 (permalink)  
Antiguo 25/09/2015, 15:11
 
Fecha de Ingreso: septiembre-2015
Mensajes: 2
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Resultados no son los esperados

Muchas gracias por tus recomendaciones (y aparte la regañada :) ) ten por seguro que de hoy en adelante tomare en cuenta tus comentarios.

Agradezco mucho tu apoyo.

Saludos.
  #4 (permalink)  
Antiguo 25/09/2015, 17:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Resultados no son los esperados

Cita:
Iniciado por adalidpc Ver Mensaje
Muchas gracias por tus recomendaciones (y aparte la regañada :) ) ten por seguro que de hoy en adelante tomare en cuenta tus comentarios.

Agradezco mucho tu apoyo.

Saludos.
No intentaba regañarte, únicamente darte algunos consejos para facilitar que tus andaduras por la programación sean más llevaderas. :)

La idea de no ponerte la solución directamente es porque me parece más constructivo que veas tus errores y seas capaz de corregirlos... o al menos de primeras intentarlo. Para tí será mucho más productivo así.

Un saludo.
  #5 (permalink)  
Antiguo 26/09/2015, 07:21
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Resultados no son los esperados

Dale un pez a un hombre y comerá un día. Dale una caña y te pedirá una tapa jajaja.

Etiquetas: char, int, resultados, son
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:48.