Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Langosta Sexual en 6 Junio 2013, 01:59 am



Título: Ayudita con programacion en c
Publicado por: Langosta Sexual en 6 Junio 2013, 01:59 am
 Es una duda que cualquiera con 1 semana de experiencia podria resolver (imagino), soy bastante nuevo programando en c, mi profesor de programacion nos mando a realizar este programa:

 En una farmacia se venden medicamentos genericos y no genericos, los medicamentos genericos tienen un descuento de 15%, los medicamentos no genericos tienen un impuesto de 12%, realizar un programa que permita calcular el monto a pagar de ambos medicamentos y tambien si hay vuelto (cambio) o no.

Yo lo estoy haciendo asi

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. main ()
  5. {
  6.    double mg, ng, d=0.15, iva=1.12, p, p1, mpg, mpng;
  7.  
  8.    printf("Ingrese el precio de el medicamento generico:");
  9.    scanf("%lf", &mg);
  10.    if (mg<=0)
  11.    { printf("No puede introducir un precio negativo o igual a cero");
  12.    return mg;      
  13. }
  14. return 0;
  15. }
  16.  

Cuando introdusco un valor mayor a 0 el programa me va bien, pero cuando introdusco uno menor o igual a cero el programa se cierra sin montrar el segundo print ni retornando a la variable mg, ¿Que tengo malo?.


Título: Re: Ayudita con programacion en c
Publicado por: amchacon en 6 Junio 2013, 02:16 am
Usas las conio y seguramente usarás también el desfasado y descatalogado devcpp... Es de verguenza que los profesores enseñen esas prácticas.

Despues de mis quejas de viejo, te cuento donde está el error:

Código
  1. if (mg<=0)
  2.   { printf("No puede introducir un precio negativo o igual a cero");
  3.   return mg;      
  4. }

Devcpp no incluye pausa al final del programa (por eso te he calao  ;-)). Tienes que ponersela tú mismo:

Código
  1. if (mg<=0)
  2. {
  3.   printf("No puede introducir un precio negativo o igual a cero");
  4.   getchar(); // Pausa
  5.   return mg;      
  6. }

Ahora sí deberías ver el printf. El return se aplica al main, y significaría que el main devuelve ese valor. Si lo que querías es mostrar su valor:

Código
  1. if (mg<=0)
  2. {
  3.   printf("No puede introducir un precio negativo o igual a cero");
  4.   printf("\n El valor introducido es: %d",mg);
  5.   getchar();  
  6.   return 1; // Por convenio, devolvemos 1 en el main para indicar un error.
  7. }

Puedes cambiar el getch(); que tienes ahí abajo por un getchar();. Así podrás quitar las conio, además debería ser int main para que sea más acorde al estándar. Total el código quedaría:
Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.  double mg, ng, d=0.15, iva=1.12, p, p1, mpg, mpng;
  6.  
  7.  printf("Ingrese el precio de el medicamento generico:");
  8.  scanf("%lf", &mg);
  9.  
  10.  if (mg<=0)
  11.  {
  12.     printf("No puede introducir un precio negativo o igual a cero");
  13.     printf("\n El valor introducido es: %d",mg);
  14.     getchar();  
  15.     return 1;      
  16.  }
  17.  
  18.  getchar();
  19.  return 0;
  20. }

Y bueno, si tienes elección te recomendaría que cambiases el Devcpp por Codeblocks, es un IDE mucho más moderno y el lenguaje sigue siendo el mismo.


Título: Re: Ayudita con programacion en c
Publicado por: Langosta Sexual en 6 Junio 2013, 02:25 am
Muchas gracias por tu atencion amchacon, actualmente uso el dev c++ (porque es el programa que se usa en la universidad) y necesito aprender en ese ya que si no aceptan el otro que me hablas, en tanto al error del que me hablas, cuando introduzco todo el codigo fuente, me da el mismo error ¿No sabras por que?.


Título: Re: Ayudita con programacion en c
Publicado por: amchacon en 6 Junio 2013, 02:36 am
Muchas gracias por tu atencion amchacon, actualmente uso el dev c++ (porque es el programa que se usa en la universidad) y necesito aprender en ese ya que si no aceptan el otro que me hablas, en tanto al error del que me hablas, cuando introduzco todo el codigo fuente, me da el mismo error ¿No sabras por que?.
El lenguaje C es el mismo independientemente que uses Devc++, CodeBlocks, Geany o Visual Studio... Pero bueno, ya les haré un mal de ojo a los profesores de Universidad.

Corrijo el error:

Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    double mg, ng, d=0.15, iva=1.12, p, p1, mpg, mpng;
  6.  
  7.    printf("Ingrese el precio de el medicamento generico: ");
  8.    scanf("%lf", &mg);
  9.    getchar();
  10.  
  11.    if (mg<=0)
  12.    {
  13.        printf("No puede introducir un precio negativo o igual a cero");
  14.        printf("\nEl valor que se introdujo es: %d",mg);
  15.        getchar();
  16.        return 1;
  17.    }
  18.  
  19.    getchar();
  20.    return 0;
  21. }
  22.  

Lo que he hecho es poner un getchar() después del scanf para que se "coma" el primer enter.


Título: Re: Ayudita con programacion en c
Publicado por: Langosta Sexual en 6 Junio 2013, 02:45 am
Bien, segun lo que me dijiste segui haciendo el programa y me quedo asi:

Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.   double mg, ng, d=0.15, iva=1.12, p, p1, mpg, mpng;
  6.  
  7.   printf("Ingrese el precio de el medicamento generico: ");
  8.   scanf("%lf", &mg);
  9.   getchar();
  10.  
  11.   if (mg<=0)
  12.   {
  13.       printf("No puede introducir un precio negativo o igual a cero");
  14.       printf("\nEl valor que se introdujo es: %f", mg);
  15.       getchar();
  16.       return 1;
  17.   }
  18.  
  19.     printf("Ingrese monto a pagar:");
  20.     scanf("%lf", &p);
  21.     if (p<=0)
  22.     {
  23.        printf("No puede introducir un precio negativo o igual a cero");
  24.        printf("\n El valor introducido es: %lf", p);
  25.        getchar();  
  26.        return 1;      
  27.     }
  28.  
  29.     mpg=-1*(mg*d)+p;
  30.  
  31.     printf("Su cambio es:%.2lf", mpg);
  32.  
  33.     getchar();
  34.     return 0;
  35. }

El problema ahora es que no me quiere dar el resultado del calculo de la variable mpg, disculpa las molestias.


Título: Re: Ayudita con programacion en c
Publicado por: amchacon en 6 Junio 2013, 02:49 am
Lo mismo, después del segundo scanf pon un getchar(); para que se coma el enter.


Título: Re: Ayudita con programacion en c
Publicado por: Langosta Sexual en 6 Junio 2013, 02:52 am
Muchas gracias amchacon, ya no te molesto mas jeje, es bueno ver que los mas expertos ayudan a los ''noobs'' por aqui, un saludo.


Título: Re: Ayudita con programacion en c
Publicado por: leosansan en 6 Junio 2013, 12:20 pm
Bien, segun lo que me dijiste segui haciendo el programa y me quedo asi:


Pues a mí me quedo así:

Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    int opcion;
  6.    float precio_g=0.1,precio_ng=0.1, precio_ng_sin=0.1,precio_g_con=0.1, pagar=-1,no_sufiente=0;
  7.    do
  8.    {
  9.        printf ("\nSeleccione la opcion:\n1.- Generico\n2.- No generico\n3.- Salir:\n");
  10.        scanf ("%d",&opcion);
  11.    }while (opcion<0 || opcion>3);
  12.    if (opcion ==3)
  13.    {
  14.        puts("Hasta la proxima visita.");
  15.        puts ("Presione una tecla para salir");
  16.        getchar();
  17.        getchar();return 1;
  18.    }
  19.    do
  20.    {
  21.        printf ("Introduzca el precio:");
  22.        if (opcion==1)
  23.            scanf ("%f",&precio_g);
  24.        else if (opcion==2)
  25.            scanf ("%f",&precio_ng);
  26.        if (precio_g<0  || precio_ng<=0)
  27.            puts ("Opcion no valida");
  28.    }while (precio_g<0 || precio_ng<=0);
  29.    precio_ng_sin=precio_ng*.85;
  30.    precio_g_con=precio_g*1.12;
  31.    if (opcion==2)
  32.        printf("\nPrecio del no generico: %g\n",precio_ng_sin);
  33.    else
  34.        printf("\nPrecio del generico: %g\n",precio_g_con);
  35.    do
  36.    {
  37.        no_sufiente=0;
  38.        printf ("Introduzca cantidad con que va a pagar: ");
  39.        scanf ("%f",&pagar);
  40.        if ((opcion ==1 && pagar<precio_g_con) || (opcion ==2 && pagar<precio_ng_sin))
  41.            {
  42.                puts("\nCantidad insuficiente");
  43.                no_sufiente=1;
  44.            }
  45.    }while (no_sufiente==1);
  46.    printf("Cantidad a devolver: ");
  47.    if (opcion==2)
  48.        printf("%g\n",pagar-precio_ng_sin);
  49.    else
  50.        printf("%g\n",pagar-precio_g_con);
  51.    puts ("Presione una tecla para salir");
  52.    getchar();
  53.    getchar();
  54.    return 0;
  55. }
  56.  

Como ves, hay que introducir varios do-while para cuando la elección no sea correcta se vuelva atrás y se permita la elección correcta. Y por otro lado declaro las variables, menos la variable opcion, como float, ya que double es una pasada , sólo para números exageradamente grandes.

Saluditos! .... ..(http://i1280.photobucket.com/albums/a497/leosansan/CANARIAS/bandera_canaria_zpseaf59d8e.gif)

(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Ayudita con programacion en c
Publicado por: amchacon en 6 Junio 2013, 12:22 pm
Es la mejor opción, pero como no sabía si había dado los while he preferido lanzar un error fatal y punto.


Título: Re: Ayudita con programacion en c
Publicado por: leosansan en 6 Junio 2013, 12:40 pm
Es la mejor opción, pero como no sabía si había dado los while he preferido lanzar un error fatal y punto.

Lo entiendo, pero esas tareas que se mandan sin haber explicado mínima-mente los bucles me parecen, cuanto menos, una insensatez, por aplicar un calificativo "suave".

Claro que tampoco hay que esperar mucho de un profesor que les obliga a usar Dev-C++, a estas alturas del siglo XXI. Mira que les cuesta actualizarse, no hay nada como una plaza fija para apoltronarse y pasar de todo. Así se entiende que vaya la enseñanza como va, y luego se quejan de recortes y demás sandeces. Lo malo es que eso no hay ley que lo arregle, es consustancial al género humano el "apoltronamiento" cuando se es fijo y no se tienen más metas que cobrar al final de mes. Asco de gentuza que in-dignifican la bella labor de la enseñanza y lo dice alguien que se ha tirado más de treinta años dedicado, en cuerpo y alma, a la enseñanza universitaria.

Y gracias otra vez por el enlace
;)

Saluditos! .... ..(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

(http://i1280.photobucket.com/albums/a497/leosansan/CANARIAS/bandera_canaria_zpseaf59d8e.gif)

P.D: Lo de la banderita es que estoy celebrando el día de Canarias .....un mes después. Es que ando despacito, despacito. :laugh: :laugh: :laugh: