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

Problemas con condicional "if" y unas formulas

Estas en el tema de Problemas con condicional "if" y unas formulas en el foro de C/C++ en Foros del Web. Saludos, mi problema es, en pocas palabras, que mi programa no hace lo que debería de hacer... Para explicarlo mejor, tengo este código en C: ...
  #1 (permalink)  
Antiguo 24/05/2011, 01:34
Dtc
 
Fecha de Ingreso: marzo-2011
Ubicación: México
Mensajes: 39
Antigüedad: 13 años, 1 mes
Puntos: 1
Exclamación Problemas con condicional "if" y unas formulas

Saludos, mi problema es, en pocas palabras, que mi programa no hace lo que debería de hacer...

Para explicarlo mejor, tengo este código en C:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <math.h>
  5.  
  6. float calcagua(float lact, float lprox);
  7.  
  8. float lactual, lproxima, aguatotal;
  9. int opcion;
  10.  
  11.  
  12. int main()
  13. {
  14.   system("title Calculadora de Costos - (Agua y alcantarillado - Electricidad)");/*Titulo*/
  15. textcolor(7);
  16. clrscr();
  17. printf("*****||| Calculadora de costos - (Agua y alcantarillado - Electricidad) |||*****");
  18. textcolor(2);
  19. printf("\t\t\t  *DtcSrni Technologies*\n\n\t\t(Mayo del 2011 - Tarifas de Pachuca, Hidalgo)\n\n\n");
  20. textcolor(7);
  21. printf("\tElige el calculo a realizar:\n\n\n");
  22. printf("\t1.- Calcular costo de consumo de agua segun cifras de medidor\n\n");
  23. printf("\t2.- Calcular costo de consumo electrico segun cifras de medidor\n\n");
  24. scanf("%i", &opcion);
  25. switch(opcion)
  26. {
  27.        case 1:
  28.            
  29.                     printf("\n\t**Calculo de consumo de agua**\n\n");
  30.                     printf("\n\t-Escribe la lectura actual que tuviste según tu recibo anterior (El numero abajo de donde dice \"LECT.ACTUAL\":\n");
  31.                     scanf("%i", &lactual);
  32.                     printf("\t-Ahora escribe el numero de la lectura que muestra tu medidor (omite los ceros a la izquierda):\n");
  33.                     scanf("%i", &lproxima);
  34.                     aguatotal = lproxima - lactual;
  35.                     printf("\t--El costo aproximado es de %f pesos\n", calcagua(lactual, lproxima));
  36.                      
  37.        break;
  38.  
  39.  
  40.  
  41.  
  42. }  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.   system("PAUSE"); 
  49.   return 0;
  50. }
  51.  
  52. float calcagua(float lact, float lprox)
  53. {
  54.  float aguatotal;
  55.  float costo, iva, alcantarillado, saneamiento, tarifa, tarifa0, tarifa1, tarifa2, tarifa3, tarifa4, tarifa5, tarifa6, tarifa01, tarifa02, tarifa03, tarifa04, tarifa05;
  56.  
  57.  aguatotal = lprox - lact;
  58.  tarifa01 = 10.18;
  59.  tarifa02 = 22.24;
  60.  tarifa03 = 29.37;
  61.  tarifa04 = 39.74;
  62.  tarifa05 = 44.71;
  63.  
  64.  tarifa0 = 39.98;
  65.  tarifa1 = tarifa01*(aguatotal-8);
  66.  tarifa2 = tarifa02*(aguatotal-12);
  67.  tarifa3 = tarifa03*(aguatotal-25);
  68.  tarifa4 = tarifa04*(aguatotal-50);
  69.  tarifa5 = tarifa05*(aguatotal-250);
  70.  
  71.  
  72. if (aguatotal <=8)
  73. {
  74. tarifa = tarifa0;      
  75.        
  76.  alcantarillado = tarifa/100*25;
  77.  saneamiento = tarifa/100*10;
  78.  iva = (alcantarillado + saneamiento)/100*16;
  79.  
  80.  costo = tarifa + alcantarillado + saneamiento + iva;
  81.  
  82. }
  83. if (aguatotal > 8 <= 12)
  84. {
  85. tarifa = tarifa1;
  86.              
  87.  alcantarillado = tarifa/100*25;
  88.  saneamiento = tarifa/100*10;
  89.  iva = (alcantarillado + saneamiento)/100*16;
  90.  
  91.  costo = tarifa + alcantarillado + saneamiento + iva;
  92. }
  93. if (aguatotal > 12 <=25)
  94. {
  95. tarifa = tarifa2;
  96.              
  97.  alcantarillado = tarifa/100*25;
  98.  saneamiento = tarifa/100*10;
  99.  iva = (alcantarillado + saneamiento)/100*16;
  100.  
  101.  costo = tarifa + alcantarillado + saneamiento + iva;
  102. }
  103. if (aguatotal > 25 <=50)
  104. {
  105. tarifa = tarifa3;
  106.              
  107.  alcantarillado = tarifa/100*25;
  108.  saneamiento = tarifa/100*10;
  109.  iva = (alcantarillado + saneamiento)/100*16;
  110.  
  111.  costo = tarifa + alcantarillado + saneamiento + iva;
  112.  
  113. }
  114. if (aguatotal > 50 <= 250)
  115. {
  116. tarifa = tarifa4;
  117.              
  118.  alcantarillado = tarifa/100*25;
  119.  saneamiento = tarifa/100*10;
  120.  iva = (alcantarillado + saneamiento)/100*16;
  121.  
  122.  costo = tarifa + alcantarillado + saneamiento + iva;
  123. }
  124. if (aguatotal > 250)
  125. {
  126. tarifa = tarifa5;
  127.              
  128.  alcantarillado = tarifa/100*25;
  129.  saneamiento = tarifa/100*10;
  130.  iva = (alcantarillado + saneamiento)/100*16;
  131.  
  132.  costo = tarifa + alcantarillado + saneamiento + iva;
  133.  
  134. }
  135.  
  136. return costo;
  137. }

El cual, debería de compilar un programa que al insertarle un numero determinado y otro también determinado, calcule el precio a pagar. El problema es que no se que esté haciendo mal, aunque sospecho que mi error está en algo sobre los condicionales, no estoy seguro.

Se supone que, por ejemplo, al insertarle como primer valor (lactual) el numero 1594 y como segundo valor (lproxima) 1603, debería de dar como valor resultante (resultado de calcagua(lactual, lproxima), o la variable local "costo") 70.50 o alguna cifra no muy lejana (por eso de redondeos, etc). El problema, es que al colocarle esos valores, me da como resultado el numero -2793.722168, el cual está demasiado alejado de lo que debería salir.

No se realmente en donde está el error, he tratado de asignarle el valor del resultado de esa función a una variable y luego ya mostrar esa variable en pantalla pero sale el mismo numero. He incluso agregado la biblioteca "math.h" por si es que ayudaba en algo, pero nada.

No soy muy experto en esto del C, y debido a que soy auto-didácta aprendiendo de internet, algunas cosas como esta me fallan todavía, aunque espero mejorar cada vez (los programas que hago tienen cada vez más calidad y complejidad).

Saludos y muchas gracias de antemano a todos los miembros de este gran foro!!
__________________
La Web del Dtc
http://www.dtcsrni.tk
DtcSrni Technologies
http://technologies.dtcsrni.tk
  #2 (permalink)  
Antiguo 24/05/2011, 04:45
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 1
Respuesta: Problemas con condicional "if" y unas formulas

Creo que el problema que tienes es debido a que utilizas el scanf para recoger float y lo haces como si fueran enteros; me explico :

scanf("%i",&variable) ----> i es para enteros

Deberías poner f para que recoja un float.

También he visto en tu código que declaras variables globales que luego vuelves a declarar en la función ( es el caso de la variable aguatotal )

Prueba a declarar los float como double por si acaso te excedes del límite, aunque no creo que sea eso lo que falla.
  #3 (permalink)  
Antiguo 24/05/2011, 09:31
_Lx
 
Fecha de Ingreso: mayo-2011
Mensajes: 17
Antigüedad: 12 años, 11 meses
Puntos: 11
Información Respuesta: Problemas con condicional "if" y unas formulas


A ver, según veo tu error es este:
Código C:
Ver original
  1. if (aguatotal > 8 <= 12)
  2. if (aguatotal > 12 <=25)
  3. if (aguatotal > 25 <=50)
  4. if (aguatotal > 50 <= 250)
¿Quién te dijo que se puede hacer así?

Esa condición en sí es: if ((aguatotal > m) <= n)

Pero recuerda que el resultado de una condicional (aguatotal > m) es 1 ó 0, así que la condición de arriba será siempre verdadera si n es mayor o igual a 1, y como los valores son 12, 25, 50, 250; siempre va a entrar a esas condicionales y el resultado que te bota sale de la última condicional ya que es el último lugar donde igualas costo a una expresión.

La condición debe ser así: if (aguatotal > m && aguatotal <=n) ....

No hay simplificaciones.

Otra cosa, lo que mencionó "Isra_84", si pones:
Código C:
Ver original
  1. scanf("%i", &lactual); // lee un integer y lo asigna en lactual
  2. scanf("%i", &lproxima);
Cuando ingreses un valor real (ejem: 1594.32) sólo guardará la parte entera en la variable.
Código C:
Ver original
  1. float lactual, lproxima, aguatotal;
  2. int opcion;
  3.  
  4.  
  5. int main()
  6. {
Esto no afecta en nada, pero si sólo vas a usar esas variables en la principal es mejor declararlas ahí.


Nos vemos ...

  #4 (permalink)  
Antiguo 24/05/2011, 18:17
Dtc
 
Fecha de Ingreso: marzo-2011
Ubicación: México
Mensajes: 39
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Problemas con condicional "if" y unas formulas

Gracias por el consejo _Lx, a pesar de que había escuchado (mas bien leído) por ahí algo sobre los operadores en las condiciones, no sabía que se utilizaban de esta forma y en estas circunstancias (erratas de novato, disculpen).
Basado en tu comentario, busqué en internet algo más sobre los operadores y encontré esto:

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Instrucciones_de_control

con lo cual me basé para cambiar mi código y limpiarlo un poco, por lo que quedó así:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <math.h>
  5.  
  6. float calcagua(int lact, int lprox);
  7.  
  8. int lactual, lproxima, opcion, atotal;
  9.  
  10.  
  11.  
  12. int main()
  13. {
  14.   system("title Calculadora de Costos - (Agua y alcantarillado - Electricidad)");/*Titulo*/
  15. textcolor(7);
  16. clrscr();
  17. printf("*****||| Calculadora de costos - (Agua y alcantarillado - Electricidad) |||*****");
  18. textcolor(2);
  19. printf("\t\t\t  *DtcSrni Technologies*\n\n\t\t(Mayo del 2011 - Tarifas de Pachuca, Hidalgo)\n\n\n");
  20. textcolor(7);
  21. printf("\tElige el calculo a realizar:\n\n\n");
  22. printf("\t1.- Calcular costo de consumo de agua segun cifras de medidor\n\n");
  23. printf("\t2.- Calcular costo de consumo electrico segun cifras de medidor\n\n");
  24. scanf("%i", &opcion);
  25. switch(opcion)
  26. {
  27.        case 1:
  28.            
  29.                     printf("\n\t**Calculo de consumo de agua**\n\n");
  30.                     printf("\n\t-Escribe la lectura actual que tuviste según tu recibo anterior (El numero abajo de donde dice \"LECT.ACTUAL\":\n");
  31.                     scanf("%i", &lactual);
  32.                     printf("\t-Ahora escribe el numero de la lectura que muestra tu medidor (omite los ceros a la izquierda):\n");
  33.                     scanf("%i", &lproxima);
  34.                     atotal = lproxima - lactual;
  35.                     printf("\t--El costo aproximado es de %g pesos\n", calcagua(lactual, lproxima));
  36.                      
  37.        break;
  38.  
  39.  
  40.  
  41.  
  42. }  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.   system("PAUSE"); 
  49.   return 0;
  50. }
  51.  
  52. float calcagua(int lact, int lprox)
  53. {
  54.  int aguatotal;
  55.  float costo, iva, alcantarillado, saneamiento, tarifa, tarifa0, tarifa1, tarifa2, tarifa3, tarifa4, tarifa5, tarifa6, tarifa01, tarifa02, tarifa03, tarifa04, tarifa05;
  56.  
  57.  aguatotal = lprox - lact;
  58.  tarifa01 = 10.18;
  59.  tarifa02 = 22.24;
  60.  tarifa03 = 29.37;
  61.  tarifa04 = 39.74;
  62.  tarifa05 = 44.71;
  63.  
  64.  tarifa0 = 39.98;
  65.  tarifa1 = tarifa01*(aguatotal-8);
  66.  tarifa2 = tarifa02*(aguatotal-12);
  67.  tarifa3 = tarifa03*(aguatotal-25);
  68.  tarifa4 = tarifa04*(aguatotal-50);
  69.  tarifa5 = tarifa05*(aguatotal-250);
  70.  
  71.  
  72. if (aguatotal <=8)
  73. {
  74. tarifa = tarifa0;      
  75.        
  76.  alcantarillado = (tarifa/100)*25;
  77.  saneamiento = (tarifa/100)*10;
  78.  iva = ((alcantarillado + saneamiento)/100)*16;
  79.  
  80.  costo = tarifa + alcantarillado + saneamiento + iva;
  81.  
  82. }
  83.  
  84. if ((aguatotal > 8) && (aguatotal<= 12))
  85. {
  86. tarifa = tarifa1;
  87.              
  88.  alcantarillado = (tarifa/100)*25;
  89.  saneamiento = (tarifa/100)*10;
  90.  iva = ((alcantarillado+saneamiento)/100)*16;
  91.  
  92.  costo=tarifa+alcantarillado+saneamiento+iva;
  93. }
  94.  
  95. if ((aguatotal > 12)&&(aguatotal<=25))
  96. {
  97. tarifa = tarifa2;
  98.              
  99.  alcantarillado = (tarifa/100)*25;
  100.  saneamiento = (tarifa/100)*10;
  101.  iva = ((alcantarillado + saneamiento)/100)*16;
  102.  
  103.  costo = tarifa + alcantarillado + saneamiento + iva;
  104. }
  105.  
  106. if ((aguatotal > 25) && (aguatotal<=50))
  107. {
  108. tarifa = tarifa3;
  109.              
  110.  alcantarillado = (tarifa/100)*25;
  111.  saneamiento = (tarifa/100)*10;
  112.  iva = ((alcantarillado + saneamiento)/100)*16;
  113.  
  114.  costo = tarifa + alcantarillado + saneamiento + iva;
  115.  
  116. }
  117. if ((aguatotal > 50) && (aguatotal<= 250))
  118. {
  119. tarifa = tarifa4;
  120.              
  121.  alcantarillado = (tarifa/100)*25;
  122.  saneamiento = (tarifa/100)*10;
  123.  iva = ((alcantarillado + saneamiento)/100)*16;
  124.  
  125.  costo = tarifa + alcantarillado + saneamiento + iva;
  126. }
  127. if (aguatotal > 250)
  128. {
  129. tarifa = tarifa5;
  130.              
  131.  alcantarillado = (tarifa/100)*25;
  132.  saneamiento = (tarifa/100)*10;
  133.  iva = ((alcantarillado + saneamiento)/100)*16;
  134.  
  135.  costo = tarifa + alcantarillado + saneamiento + iva;
  136.  
  137. }
  138.  
  139. return costo;
  140. }

Ahora ya me da el resultado que me debe dar según las formulas que le implementé, aunque no es el resultado que esperaba con los valores que insertaba, pero haciendo una prueba de escritorio, me he dado cuenta que ese problema ya es de las formulas que le programé, por lo que ya será ahora cuestión de arreglarlas y replantearlas. Los () en las variables de las formulas se los agregué "por si es que", aunque estoy consciente de que por la ley de prioridad de operaciones, primero se efectuará la división, pero de todas formas, nunca está de más asegurar que no causará problemas...

**Por cierto, lo de los float y los int, fue un error que quedó en el código, ya que como no encontraba ni tenía idea de lo que causaba el problema, cambié varias cosas, incluyendo el valor de las variables por float y las variables formales por float para ver si de puro chispazo funcionaba (ya saben, revuelves todo para ver si queda), y se me olvidó entonces cambiar también los float en los scanf.


Muchas gracias por su ayuda!!!!
__________________
La Web del Dtc
http://www.dtcsrni.tk
DtcSrni Technologies
http://technologies.dtcsrni.tk

Etiquetas: condicional, formulas
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 06:04.