Problema con estructuras

Iniciado por clodan, 8 Septiembre 2010, 16:58 PM

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

clodan

Bueno, para el segundo trabajo de la facultad, nos dieron como consigna tratar de simular un sistema de un cajero de supermercado, donde la compra maxima es de 12 articulos.

Ahora, el problema qe tengo es cuando sumo los totales, y cuando los muestro.

Yo sospecho que el problema viene por los scanf, lo que supongo es qe hay numeros largos qe sobrepasan el espacio reservado y se meten en el lugar de otro, generando cualquier resultado.

Dejo el code:

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

struct Compra {
      int codprod;
      int cantidad;
      float precio;
      };

struct Factura {
      int fecha[2];
      int cuil[6];
      struct Compra lista[12];
      float total;
      };

struct Factura leerdatos();
float calctot ( struct Compra lista [], int n);
     
int main() {
 int i;
 struct Factura fachoy;
 fachoy=leerdatos();
 fachoy.total=calctot( fachoy.lista, 12);  
 printf("Los productos que Ud. lleva son: \n");
 for (i=0; i<12; i++){
     printf("%d - %d - $%d\n\n",fachoy.lista[i].cantidad ,fachoy.lista[i].codprod ,fachoy.lista[i].precio);
 }
 printf("TOTAL ---------------- $%d\n", fachoy.total);
 
 system("PAUSE");
 return 0;
}

struct Factura leerdatos(){
     struct Factura temp;
     int x;
     int i;
     printf("Ingrese el dia, luego el mes y finalmente el año.\nEspaciandolos con ENTER. EN NUMEROS\n");
     for (i=0; i<3; i++){
         scanf("%d",&temp.fecha[i]);
     }      
     printf("Fecha ingresada: %d/%d/%d\n\n",temp.fecha[0],temp.fecha[1],temp.fecha[2]);
     printf("Ingrese el numero de CUIL\n");
     scanf("%s",&temp.cuil);
     printf("CUIL Ingresado: %s\n\n",temp.cuil);
     for (i=0; i<12; i++){
         printf("Producto Numero %d\n",(i+1));
         printf("Ingrese el Codigo del Producto.\n");
         scanf("%d",&temp.lista[i].codprod);
         printf("Ingrese la cantidad.\n");
         scanf("%d",&temp.lista[i].cantidad);
         printf("Ingrese el precio.\n");
         scanf("%d",&temp.lista[i].precio);
     }
}
float calctot (struct Compra lista [], int n){
     float suma;
     for (n=0; n<12; n++){
         suma+=(lista[n].cantidad)*(lista[n].precio);
     }
     return suma;
}


Lh: No hagas doble post, utiliza el botón modificar.

ya lo solcione, me faltaba el retorno de leer_datos  ;-) ;-) ;-) ;-) ;-)

do-while

¡Buenas!

Solo un detalle.

Es posible que los precios introducidos por ti sean enteros. Pero se espera que sean numeros flotantes y en tu codigo has escrito:
          printf("Ingrese el precio.\n");
          scanf("%d",&temp.lista[i].precio);

Cuando deberia haber sido:
          printf("Ingrese el precio.\n");
          scanf("%f",&temp.lista[i].precio);

ya que %d espera que el dato introducido sea entero, y %f flotante.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

clodan

sip jajaja son detalles qe ya corregi ;) jejej esta medio desactualizado el post jajaja tambien me faltan otros detalles minimos pero ya ta terminade =) Gracias!

Garfield07

#3
Bueno yo remodele su code, a ver que tal. En vez de lo de su code el mio escribe todo en un fichero, pero no pregunta fecha ni nada. El mio directamente obtiene la hora del sistema xD!
Creo que usas muchas estructuras, variables, etc... a mi asi me parece mas sencillo.
Lo que le falta es escribir fecha y hora, que no me ha dado tiempo. Supongo que la version 1.2 sera mas completa xD....


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

struct Compra
{
   float codprod;
   float cantidad;
   float precio;
   float total;
};

struct Compra compra;
FILE *fd;
int i;

int main()
{
   printf ("#*************************************#\n");
   printf ("#   -[ Comprar 1.1 - by Sagrini ]-    #\n");
   printf ("#   ------------------------------    #\n");
   printf ("#       Original code by Clodan       #\n");
   printf ("#*************************************#\n");

   fd=fopen ("./register.dat", "a+");
   compra.codprod=1;
   while (compra.codprod!=0.0)
   {
       printf("\nIngrese el Codigo del Producto: ");
       scanf("%f",&compra.codprod);
       if (compra.codprod==0.0)
           break;

       printf("Ingrese la cantidad: ");
       scanf("%f",&compra.cantidad);

       printf("Ingrese el precio: ");
       scanf("%f",&compra.precio);

       compra.total+=compra.precio;
       fprintf (fd, "PRODUCT  %f  x%f\n", compra.cantidad, compra.codprod);
   }
   fprintf (fd, "TOTAL %f\n\n", compra.total);
   printf("\nTOTAL $%f\n\n", compra.total);
   fclose (fd);
   return 0;
}






Aqui les traigo la version 1.2 de mi pequeño programa.

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

struct Compra
{
float codprod;
float cantidad;
float precio;
float total;
};

struct Compra compra;
struct tm *hora;
time_t hour;
FILE *fd;
int i;

int main()
{
printf ("#*************************************#\n");
printf ("#   -[ Comprar 1.2 - by Sagrini ]-    #\n");
printf ("#   ------------------------------    #\n");
printf ("#       Original code by Clodan       #\n");
printf ("#*************************************#\n");

for (;;)
{
fd=fopen ("./register.dat", "a+");
time (&hour);
fprintf (fd, "%s",ctime (&hour));
compra.codprod=1;
while (compra.codprod!=0.0)
{
printf("\nIngrese el Codigo del Producto: ");
scanf("%f",&compra.codprod);
if (compra.codprod==0.0)
break;

printf("Ingrese la cantidad: ");
scanf("%f",&compra.cantidad);

printf("Ingrese el precio: ");
scanf("%f",&compra.precio);

compra.total+=compra.precio;
fprintf (fd, " PRODUCT  %f  x%f\n", compra.cantidad, compra.codprod);
}
fprintf (fd, " --------\n");
fprintf (fd, " TOTAL %f\n\n\n", compra.total);
printf("\nTOTAL $%f\n\n\n", compra.total);
fclose (fd);
getchar ();
}
return 0;
}


Bueno, si nadie se ha dado cuenta, comento que hay un error de omision. Lo descubri al probarlo en BETA con mi prima xD k le dio a un boton que no era una tecla y se volvia loco... Pruebenlo ustedes mismos, pero les aconsejo cortar rapido pork escribe en disco... Simplemente autorrellena los formularios con un 0, y lo escribe en un archivo... infinitas veces.

Si alguien tiene posibles soluciones, que las postee. Pense en comprobar que la cadena es solo numbers, pero no puedo ahora. A ver k tal...





Quinta modif. a mi post:
Me acabo de dar cuenta de que el modo de impresion es incorrecto...
Remodelando.... Escribo aqui el code nuevo:


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

struct Compra
{
int codprod;
int cantidad;
float precio;
float total;
};

struct Compra compra;
struct tm *hora;
time_t hour;
FILE *fd;
int i;

int main()
{
printf ("#**************************************#\n");
printf ("#   -[ Comprar 1.3.2 - by Sagrini ]-   #\n");
printf ("#   -------------------------------    #\n");
printf ("#        Original code by Clodan       #\n");
printf ("#**************************************#\n");

for (;;)
{
fd=fopen ("./register.dat", "a+");
time (&hour);
fprintf (fd, "%s",ctime (&hour));
compra.codprod=1;
while (compra.codprod!=0.0)
{
printf("\nIngrese el Codigo del Producto: ");
scanf("%d",&compra.codprod);
if (compra.codprod==0.0)
break;

printf("Ingrese la cantidad: ");
scanf("%d",&compra.cantidad);

printf("Ingrese el precio: ");
scanf("%f",&compra.precio);

compra.precio*=compra.cantidad;
compra.total+=compra.precio;
fprintf (fd, " PRODUCT  %d  x%d==%f\n", compra.codprod, compra.cantidad, compra.precio);
}
fprintf (fd, " --------\n");
fprintf (fd, " TOTAL %f\n\n\n", compra.total);
printf("\nTOTAL $%f\n\n\n", compra.total);
fclose (fd);
getchar ();
}
return 0;
}


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo