Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: marcoaa en 24 Febrero 2015, 00:45 am



Título: el 3er do-while me esta marcando overflow porfa ayuda
Publicado por: marcoaa en 24 Febrero 2015, 00:45 am
Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. //a es igual a la ganancia//
  4. //vp es igaul a valor de produccion//
  5. //contn es contador de niño y conts lo inverso//
  6. //contvs es contador de variedad salada mientras que contvn inverso//
  7. char tipo, rsp, tipomax;
  8. float cod , pvp, a, vp, acumganan=0, acumvp=0, gananmax=0, codmax;
  9. float costoalm, contn=0, conts=0, contvs=0, contvn=0;
  10.  
  11. void valo_pvp_ganancia(char tipo, float costoalm, float pvp, float a, float vp, float conts, float contvs, float contn, float contvn, float acumvp, float acumganan)
  12. {
  13.     if (tipo=='n' && cod<=10)
  14.     {
  15.            vp=costoalm*2;
  16.            pvp=vp+(vp*0.10);
  17.            a=vp*0.10;
  18.            contn=contn+1;
  19.            contvs=contvs+1;
  20.            acumvp=vp+acumvp;
  21.            acumganan=acumganan+a;
  22.            }
  23.     else if (tipo=='n' && cod>=11)
  24.     {
  25.          vp=costoalm*4;
  26.            pvp=vp+(vp*0.15);
  27.            a=vp*0.15;
  28.            contn=contn+1;
  29.            acumvp=vp+acumvp;
  30.            acumganan=acumganan+a;
  31.            }
  32.     else if (tipo=='a' && cod<=10)
  33.     {
  34.          vp=costoalm*4;
  35.            pvp=vp+(vp*0.20);
  36.            a=vp*0.20;
  37.            conts=conts+1;
  38.            contvs=contvs+1;
  39.            }
  40.     else
  41.     {
  42.          vp=costoalm*6;
  43.            pvp=vp+(vp*0.25);
  44.            a=vp*0.25;
  45.            conts=conts+1;
  46.            contn=contn+1;
  47.            }
  48. }
  49.  
  50.  
  51. float promediovp (float acumvp, float contn)
  52.        {
  53.         return ( acumvp/contn);
  54.                  }
  55. float promedioganan (float acumganan, float contn)
  56. {
  57.       return (acumganan/contn);
  58.       }
  59.  
  60.  
  61.  
  62.  
  63. main()
  64. {
  65. do
  66. {
  67. //info para la parte a//
  68. do  
  69. {
  70. printf("\n ingrese para quien esta dirigido el producto, n=ninos a=adultos ");
  71. scanf(" %c", &tipo);
  72. }
  73. while (tipo!='n' && tipo!='a');
  74.  
  75. do
  76. {  
  77.  
  78. printf("\n ingrese el codigo de variedad, del 1 al 20 ");
  79. scanf(" &f", &cod );
  80. }
  81. while (cod<1 || cod>20);  
  82. printf("\n ingrese el costo de almacenamiento ");
  83. scanf(" %f", &costoalm);
  84.  
  85. printf("\n");
  86. printf("\n");
  87. if (tipo=='n') //le faltan las comillas a la n//
  88. {  
  89. printf("\nel producto es dirigido hacia ninos");
  90.    }
  91. else
  92. {
  93. printf("\nel producto es dirigido hacia adultos");
  94. }
  95. if (cod<=10)
  96. {
  97.           printf("\n el producto es salado");
  98.           }
  99.           else
  100.           {
  101.              printf("\n el producto es dulce");
  102.              }
  103. printf("\n el costo de almacenamiento es %.0f ", costoalm);
  104. void valo_pvp_ganancia(char tipo, float costoalm, float pvp, float a, float vp, float conts, float contvs, float contn, float contvn);
  105. printf("\n el valor de produccione es %.0f ", vp);
  106. printf("\n el precio de venta al publico es de %.0f ", pvp);
  107. printf("\n la ganancia de la empresa es %.0f ", a);
  108. printf("\n");
  109. printf("\n");
  110. printf("\ndesea ingresar los datos de otro producto?");
  111. scanf(" %c", &rsp);
  112.  
  113.  
  114. if (a>gananmax)
  115. {
  116.   a=gananmax;
  117.   tipo=tipomax;
  118.   cod=codmax;
  119.    }
  120.  
  121. }
  122. while (rsp=='n');
  123. //culimna la parte a falta ciclo de rep//
  124.  
  125. printf("\n");
  126. printf("\n");
  127. printf("\n");
  128. printf("\n");
  129.  
  130. if (contn<conts)
  131. {
  132. printf("\nel tipo de pruducto mas fabricado fue hacia adultos %.0f", conts);
  133. printf("\n mientras que el de los ninos se fabricaron %.0f ", contn);
  134. }
  135. else if (conts<contn)
  136. {
  137. printf("\nel tipo de producto mas fabricado fue hacia ninos %.0f", contn);
  138. printf("\n mientras que el de los adultos e fabricaron %.0f ", conts);
  139. }
  140. else
  141. {
  142. printf("\n ambos producos se producieron en mismas cantidades %.0f", contn);
  143. }
  144.  
  145. printf("\n el total de los valores de produccion para ninos es de %.0f ", acumvp);
  146. printf("\n el total de ganancia por los productos de ninos es de %.0f ", acumganan);
  147.  
  148. if (contn=0)
  149. {
  150.          printf("\n no hubo produccion de productos para ninos");
  151.          }
  152. else
  153. {    
  154. printf("\n el promedio de los valores de produccion para ninos es de %.2f, ", promediovp(acumvp,contn));
  155. printf("\n el promedio de la ganancias de los productos de ninos es de %.2f ", promedioganan (acumganan, contn));
  156. }
  157. printf("\n el tipo de producto que genero la maxima ganancia fue %c ", tipomax);
  158. printf("   con codigo de %.0f", codmax);
  159.  
  160.  
  161. system("pause");
  162. }
  163.  


Título: Re: el 3er do-while me esta marcando overflow porfa ayuda
Publicado por: engel lex en 24 Febrero 2015, 08:11 am
te modifiqué el código, cuando publiques usa etiquetas GeSHi... segundo aviso....

primer error... main siempre es tipo int... y retorna normalmente 0...

segundo error.... todos (o casi todos) tus scanf están mal declarados...
Código
  1. scanf(" %c", &tipo);

espera literalmente lo que está ahí... que escribas un espacio y luego una letra... sin embargo lo agarra bien, aunque debes quitarle los espacios

tercer error y tu bug... linea 79
Código
  1. scanf(" &f", &cod );

es %f no &f


cuarto error... uno logico en la linea 122....


recomiendo que aprendas a usar el debugger de tu ide para conseguir estos errores con cierta facilidad


Título: Re: el 3er do-while me esta marcando overflow porfa ayuda
Publicado por: rir3760 en 24 Febrero 2015, 17:28 pm
segundo error.... todos (o casi todos) tus scanf están mal declarados...
Código
  1. scanf(" %c", &tipo);
espera literalmente lo que está ahí... que escribas un espacio y luego una letra... sin embargo lo agarra bien, aunque debes quitarle los espacios
No es un error sino un forma común de utilizar esa función. Explico:

scanf con todos los especificadores de formato (excepto dos) lo primero que hace es descartar el espacio blanco (espacio, tabulador, etc.), solo entonces consume los caracteres validos para la conversión indicada. Por ejemplo si tratamos de leer un entero y una palabra con "%d%s" una entrada como esta funcionara correctamente:
Código:
      123


fulano

Las dos excepciones son "%c" y "%[]", con estas el descarte no sucede (la función se "traga" los caracteres que pueda), por ejemplo si tratamos de leer un entero y un carácter con "%d%c" la siguiente entrada no dará el resultado esperado:
Código:
123{ENTER}
x{ENTER}
Ello porque la función consumirá los caracteres '1', '2' y '3' para generar el entero 123 y el avance de linea que sigue sera almacenado en la dirección indicada.

Para evitarlo se suele utilizar un espacio antes del especificador "%c" ya que este (el espacio) se interpreta como "descartar todo carácter para el cual la función isspace resulte en verdadero".

Por ultimo con la bendita función los caracteres de espacio blanco no se toman literalmente, en su lugar cualquier secuencia de estos se interpreta de la forma indicada (lectura y descarte de espacio blanco).

Un saludo