el 3er do-while me esta marcando overflow porfa ayuda

Iniciado por marcoaa, 24 Febrero 2015, 00:45 AM

0 Miembros y 1 Visitante están viendo este tema.

marcoaa

Código (cpp) [Seleccionar]
#include<stdlib.h>
#include<stdio.h>
//a es igual a la ganancia//
//vp es igaul a valor de produccion//
//contn es contador de niño y conts lo inverso//
//contvs es contador de variedad salada mientras que contvn inverso//
char tipo, rsp, tipomax;
float cod , pvp, a, vp, acumganan=0, acumvp=0, gananmax=0, codmax;
float costoalm, contn=0, conts=0, contvs=0, contvn=0;

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)
{
    if (tipo=='n' && cod<=10)
    {
           vp=costoalm*2;
           pvp=vp+(vp*0.10);
           a=vp*0.10;
           contn=contn+1;
           contvs=contvs+1;
           acumvp=vp+acumvp;
           acumganan=acumganan+a;
           }
    else if (tipo=='n' && cod>=11)
    {
         vp=costoalm*4;
           pvp=vp+(vp*0.15);
           a=vp*0.15;
           contn=contn+1;
           acumvp=vp+acumvp;
           acumganan=acumganan+a;
           }
    else if (tipo=='a' && cod<=10)
    {
         vp=costoalm*4;
           pvp=vp+(vp*0.20);
           a=vp*0.20;
           conts=conts+1;
           contvs=contvs+1;
           }
    else
    {
         vp=costoalm*6;
           pvp=vp+(vp*0.25);
           a=vp*0.25;
           conts=conts+1;
           contn=contn+1;
           }
}
         

float promediovp (float acumvp, float contn)
       {
        return ( acumvp/contn);
                 }
float promedioganan (float acumganan, float contn)
{
      return (acumganan/contn);
      }
       
       
         

main()
{
do
{
//info para la parte a//
do  
{
printf("\n ingrese para quien esta dirigido el producto, n=ninos a=adultos ");
scanf(" %c", &tipo);
}
while (tipo!='n' && tipo!='a');

do
{  
       
printf("\n ingrese el codigo de variedad, del 1 al 20 ");
scanf(" &f", &cod );
}
while (cod<1 || cod>20);  
printf("\n ingrese el costo de almacenamiento ");
scanf(" %f", &costoalm);

printf("\n");
printf("\n");
if (tipo=='n') //le faltan las comillas a la n//
{  
printf("\nel producto es dirigido hacia ninos");
   }
else
{
printf("\nel producto es dirigido hacia adultos");
}
if (cod<=10)
{
          printf("\n el producto es salado");
          }
          else
          {
             printf("\n el producto es dulce");
             }
printf("\n el costo de almacenamiento es %.0f ", costoalm);
void valo_pvp_ganancia(char tipo, float costoalm, float pvp, float a, float vp, float conts, float contvs, float contn, float contvn);
printf("\n el valor de produccione es %.0f ", vp);
printf("\n el precio de venta al publico es de %.0f ", pvp);
printf("\n la ganancia de la empresa es %.0f ", a);
printf("\n");
printf("\n");
printf("\ndesea ingresar los datos de otro producto?");
scanf(" %c", &rsp);


if (a>gananmax)
{
  a=gananmax;
  tipo=tipomax;
  cod=codmax;
   }

}
while (rsp=='n');
//culimna la parte a falta ciclo de rep//

printf("\n");
printf("\n");
printf("\n");
printf("\n");

if (contn<conts)
{
printf("\nel tipo de pruducto mas fabricado fue hacia adultos %.0f", conts);
printf("\n mientras que el de los ninos se fabricaron %.0f ", contn);
}
else if (conts<contn)
{
printf("\nel tipo de producto mas fabricado fue hacia ninos %.0f", contn);
printf("\n mientras que el de los adultos e fabricaron %.0f ", conts);
}
else
{
printf("\n ambos producos se producieron en mismas cantidades %.0f", contn);
}

printf("\n el total de los valores de produccion para ninos es de %.0f ", acumvp);
printf("\n el total de ganancia por los productos de ninos es de %.0f ", acumganan);

if (contn=0)
{
         printf("\n no hubo produccion de productos para ninos");
         }
else
{    
printf("\n el promedio de los valores de produccion para ninos es de %.2f, ", promediovp(acumvp,contn));
printf("\n el promedio de la ganancias de los productos de ninos es de %.2f ", promedioganan (acumganan, contn));
}
printf("\n el tipo de producto que genero la maxima ganancia fue %c ", tipomax);
printf("   con codigo de %.0f", codmax);


system("pause");
}

engel lex

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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

rir3760

Cita de: engel lex en 24 Febrero 2015, 08:11 AMsegundo error.... todos (o casi todos) tus scanf están mal declarados...
Código (cpp) [Seleccionar]
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:
      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:
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language