Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sora_ori en 12 Septiembre 2013, 12:13 pm



Título: Programa para introducir precios compra y acomular
Publicado por: sora_ori en 12 Septiembre 2013, 12:13 pm
Buenas, necesitaría un poco de ayuda para un programa en C es por eso que les vengo a pedir una manita :P

El programa hace lo siguiente:

- Pide precio de compra
- Precio al que vende el producto
- Unidades vendidas
- Beneficio obtenido
- Beneficio acomulado
- Quieres seguir introduciendo productos (s/n)


¿Cómo he planteado el algoritmo? Pues primero de todo he hecho un IF conforme quiero introducir productos y dentro de aquí he pedido por pantalla todo lo que me pedían.

Código
  1.    if (otroProducto == 1){
  2.                     printf("Precio de compra: ");
  3.                     scanf("%d", &compra);
  4.                     printf("Precio de venta: ");
  5.                     scanf("%d", &venta);
  6.                     printf("Unidades vendidas: ");
  7.                     scanf("%d", &unidades);
  8.                     beneficio = (venta-compra)*unidades;
  9.                     printf("Beneficio: %d", beneficio);
  10.                     acomulado = beneficio + otroProducto;
  11.                     printf("\nBeneficio acomulado: %d", acomulado);
  12.  
  13.                     printf("\nQuieres introducir otro producto (s/n)? ");
  14.                     getch("%c", &otroProducto);
  15.                     if (otroProducto == 's'){
  16.    }


¿Está bien planteado? Seguro que no jeje el caso es que como puedo retornar al principio si digo que quiere volver a introducir productos...?  :-\

Gracias


Título: Re: Programa para introducir precios compra y acomular
Publicado por: eferion en 12 Septiembre 2013, 12:40 pm
Tienes que encerrar todo el proceso en un bucle.

En c tienes dos tipos de bucles: for y while.

En mi opinión for se debe emplear cuando se sabe el número de iteraciones del bucle... recorrer un vector por ejemplo, mientras que los while se deben emplear el resto de casos, es decir, cuando el número de repeticiones es indeterminado.

En este caso, dado que a priori no puedes saber cuántos elementos va a querer introducir el usuario, deberías usar un while.

El bucle while tiene dos variantes:

Código
  1. // Este bucle comprueba, al principio de cada iteracion, si se cumple la condicion.
  2. // Se repite mientras se cumpla la condicion
  3. while ( condicion )
  4. {
  5.  // contenido
  6. }
  7.  
  8. // Este bucle ejecuta el contenido al menos una vez, dado que la condicion se
  9. // comprueba al final de cada iteracion.
  10. // Nota que esta configuracion termina con ';' despues del while
  11. do
  12. {
  13.  // contenido
  14. } while ( condicion );

En tu caso, como la pregunta la haces al final, podrías poner un bucle do-while. Puedes usar también el otro... pero tendrías que asegurarte de la condición da true en la primera pasada.

Código
  1. int otroProducto;
  2.  
  3. do
  4. {
  5.  // Se recopilan datos sobre el producto
  6.  // Se calcula su beneficio, etc.
  7.  
  8.  printf ( "¿Quieres seguir introduciendo productos? " );
  9.  // recuperar el dato del teclado y comprobar si hay que continuar o no.
  10.  // si hay que meter otro producto, otroProducto debe valer 1,
  11. } while ( otroProducto == 1 );

Con la configuración que te he puesto arriba el programa va a estar pidiendo datos hasta que 'otroProducto' sea diferente de 1.

Nota: Tu código tiene un error:

Código
  1. acomulado = beneficio + otroProducto;

Si 'acomulado' ( se escribe acumulado ) debe almacenar el beneficio total no tiene sentido que en esa ecuación aparezca 'otroProducto', ya que esa es una variable que usas para otras cosas.

si quieres llevar un total de beneficios es tan sencillo como esto:

Código
  1. acomulado = acomulado + beneficio;
  2.  
  3. // o en version simplificada
  4. acomulado += beneficio;

Nota2: otroProducto lo estás usando para almacenar números o valores ??

al principio compruebas si es igual a 1... y al final almacenas un caracter... y compruebas si es 's'... no tiene sentido.

Si usas otroProducto para almacenar caracteres... ciñete a caracteres.

Con todos estos cambios el código resultante queda más o menos así:

Código
  1. char otroProducto;
  2. do
  3. {
  4.  printf("Precio de compra: ");
  5.  scanf("%d", &compra);
  6.  printf("Precio de venta: ");
  7.  scanf("%d", &venta);
  8.  printf("Unidades vendidas: ");
  9.  scanf("%d", &unidades);
  10.  beneficio = (venta-compra)*unidades;
  11.  printf("Beneficio: %d", beneficio);
  12.  acomulado += beneficio;
  13.  printf("\nBeneficio acomulado: %d", acomulado);
  14.  
  15.  printf("\nQuieres introducir otro producto (s/n)? ");
  16.  getch("%c", &otroProducto);
  17. } while ( otroProducto == 's' );

Esta solución no funciona con mayúsculas, pero es una mejora que puedes plantearte.   


Título: Re: Programa para introducir precios compra y acomular
Publicado por: rir3760 en 12 Septiembre 2013, 15:01 pm
Otro error se debe al "Copy & Paste", en la llamada a getch para pedir confirmación sobre continuar o no:
Código
  1. printf("Quieres introducir otro producto (s/n)?\n");
  2. getch("%c", &otroProducto);
Deberia ser una llamada (mas) a scanf:
Código
  1. printf("Quieres introducir otro producto (s/n)?\n");
  2. scanf(" %c", &otroProducto);
Se debe utilizar " %c" (un espacio antes del carácter '%') para evitar problemas con el espacio blanco al final de la linea anterior.

Un saludo


Título: Re: Programa para introducir precios compra y acomular
Publicado por: sora_ori en 12 Septiembre 2013, 15:35 pm
Gracias por la ayuda ;)

Finalmente he usado el "do while" y el programa funciona bien, salvo dos pequeños bugs. Uno en el "Beneficio acomulado" y otro que veréis en la imagen siguiente:

(http://i41.tinypic.com/35kqs5c.png)


Un saludo


Título: Re: Programa para introducir precios compra y acomular
Publicado por: eferion en 12 Septiembre 2013, 16:11 pm
Las variables no se inicializan solas en c.

Tienes que darles tu un valor inicial.

tu tienes seguramente un 'int acumulado;', pero cuando el programa reservan memoria para ese int no la 'limpia' y en consecuencia puede tener cualquier valor.

si quieres que sume bien prueba a hacer:

Código
  1. int acumulado = 0;

Es una buena práctica inicalizar TODAS las variables que uses en tu programa... puede que en un principio algunas no sea necesario inicializarlas... pero luego el programa cambia y eso te puede dar problemas.


Título: Re: Programa para introducir precios compra y acomular
Publicado por: sora_ori en 12 Septiembre 2013, 16:18 pm
Gracias, me faltaba eso :P

¿Sabrías decirme el pequeño bug de la imagen? Hace que cuando le de a "s" o "n" para responder a la pregunta me obligue a escribir algo para poder seguir.


Saludos


Título: Re: Programa para introducir precios compra y acomular
Publicado por: eferion en 12 Septiembre 2013, 16:22 pm
el scanf espera a que se pulse el enter.

Si quieres que no espere, usa getch ... pero mírate la interfaz que no es la que estabas usando al principio:

Código
  1. getch("%c", &otroProducto); // Esto esta mal


Título: Re: Programa para introducir precios compra y acomular
Publicado por: sora_ori en 12 Septiembre 2013, 16:46 pm
Dejo mi código para que vean como lo tengo, esta todo completo menos el pequeño bug, el cual tengo que escribir un caracter y pulsar enter para volver a escribir un producto.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5.    int compra, venta, unidades, beneficio, acomulado=0;
  6.    char otroProducto;
  7.  
  8.    do{
  9.         printf("Precio de compra: ");
  10.         scanf("%d", &compra);
  11.         fflush(stdin);
  12.         printf("Precio de venta: ");
  13.         scanf("%d", &venta);
  14.         fflush(stdin);
  15.         printf("Unidades vendidas: ");
  16.         scanf("%d", &unidades);
  17.         fflush(stdin);
  18.         beneficio = (venta-compra)*unidades;
  19.         printf("Beneficio: %d", beneficio);
  20.         acomulado += beneficio;
  21.         printf("\nBeneficio acomulado: %d", acomulado);
  22.  
  23.         printf("\nQuieres introducir otro producto (s/n)? ");
  24.         scanf(" %c ", &otroProducto);
  25.         fflush(stdin);
  26.    }while (otroProducto == 's');
  27.  
  28.  getchar();
  29.  return 0;
  30. }


No he podido arreglarlo  :-\


Título: Re: Programa para introducir precios compra y acomular
Publicado por: eferion en 12 Septiembre 2013, 16:51 pm
No he podido arreglarlo  :-\

Lo más normal en cualquier tipo de aplicación es que le des la oportunidad al usuario de rectificar un dato que ha metido ( por si le da por equivocarse ).

Si tu en vez del scanf pones un getch o similar el usuario no puede rectificar su entrada y eso suele causar muy mala impresión en un programa.


Título: Re: Programa para introducir precios compra y acomular
Publicado por: kaozdeoz en 14 Septiembre 2013, 04:58 am
 
otroProducto = 1;

while (otroProducto == 1){

                    printf("Precio de compra: ");
                    scanf("%d", &compra);
                    printf("Precio de venta: ");
                    scanf("%d", &venta);
                    printf("Unidades vendidas: ");
                    scanf("%d", &unidades);
                    beneficio = (venta-compra)*unidades;
                    printf("Beneficio: %d", beneficio);
                    acomulado = beneficio + otroProducto;
                    printf("\nBeneficio acomulado: %d", acomulado);
 
                    printf("\nQuieres introducir otro producto (s = 1/ n = 2)? ");

                    scanf(%d,&otroProducto)

                   

   }


Título: Re: Programa para introducir precios compra y acomular
Publicado por: rir3760 en 14 Septiembre 2013, 17:20 pm
¿Sabrías decirme el pequeño bug de la imagen? Hace que cuando le de a "s" o "n" para responder a la pregunta me obligue a escribir algo para poder seguir.
El problema es la cadena de formato al pedir confirmación:
Código
  1. printf("\nQuieres introducir otro producto (s/n)? ");
  2. scanf(" %c ", &otroProducto);
Utilizas " %c " cuando debería ser " %c".

Un saludo


Título: Re: Programa para introducir precios compra y acomular
Publicado por: sora_ori en 15 Septiembre 2013, 09:51 am
El problema es la cadena de formato al pedir confirmación:
Código
  1. printf("\nQuieres introducir otro producto (s/n)? ");
  2. scanf(" %c ", &otroProducto);
Utilizas " %c " cuando debería ser " %c".

Un saludo

Esto es lo que me fallaba! Gracias :)


Muchas gracias a todos los la ayuda, TEMA SOLUCIONADO