Programa para introducir precios compra y acomular

Iniciado por sora_ori, 12 Septiembre 2013, 12:13 PM

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

sora_ori

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.

    if (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/n)? ");
                     getch("%c", &otroProducto);
                     if (otroProducto == 's'){
    }



¿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

eferion

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:


// Este bucle comprueba, al principio de cada iteracion, si se cumple la condicion.
// Se repite mientras se cumpla la condicion
while ( condicion )
{
  // contenido
}

// Este bucle ejecuta el contenido al menos una vez, dado que la condicion se
// comprueba al final de cada iteracion.
// Nota que esta configuracion termina con ';' despues del while
do
{
  // contenido
} 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.


int otroProducto;

do
{
  // Se recopilan datos sobre el producto
  // Se calcula su beneficio, etc.

  printf ( "¿Quieres seguir introduciendo productos? " );
  // recuperar el dato del teclado y comprobar si hay que continuar o no.
  // si hay que meter otro producto, otroProducto debe valer 1,
} 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:

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:


acomulado = acomulado + beneficio;

// o en version simplificada
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í:


char otroProducto;
do
{
  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;
  printf("\nBeneficio acomulado: %d", acomulado);

  printf("\nQuieres introducir otro producto (s/n)? ");
  getch("%c", &otroProducto);
} while ( otroProducto == 's' );


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

rir3760

Otro error se debe al "Copy & Paste", en la llamada a getch para pedir confirmación sobre continuar o no:
printf("Quieres introducir otro producto (s/n)?\n");
getch("%c", &otroProducto);

Deberia ser una llamada (mas) a scanf:
printf("Quieres introducir otro producto (s/n)?\n");
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
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

sora_ori

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:




Un saludo

eferion

#4
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:

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.

sora_ori

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

eferion

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:

getch("%c", &otroProducto); // Esto esta mal

sora_ori

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.


#include <stdio.h>
#include <stdlib.h>

int main(){
    int compra, venta, unidades, beneficio, acomulado=0;
    char otroProducto;
   
    do{
         printf("Precio de compra: ");
         scanf("%d", &compra);
         fflush(stdin);
         printf("Precio de venta: ");
         scanf("%d", &venta);
         fflush(stdin);
         printf("Unidades vendidas: ");
         scanf("%d", &unidades);
         fflush(stdin);
         beneficio = (venta-compra)*unidades;
         printf("Beneficio: %d", beneficio);
         acomulado += beneficio;
         printf("\nBeneficio acomulado: %d", acomulado);
         
         printf("\nQuieres introducir otro producto (s/n)? ");
         scanf(" %c ", &otroProducto);
         fflush(stdin);
    }while (otroProducto == 's');

  getchar();
  return 0;
}



No he podido arreglarlo  :-\

eferion

Cita de: sora_ori en 12 Septiembre 2013, 16:46 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.

kaozdeoz

 
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)

                   

   }