Ayuda con estructura

Iniciado por Mudkipz, 19 Noviembre 2010, 04:48 AM

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

Mudkipz

Hola a todos,

bueno, tengo que leer los siguientes datos:


    año
    modelo
    marca
    costo de automovil tipo sedan
    costo de automovil tipo pick-up
    costo de automovil tipo deportivo

pero tengo que usar una estructura y leer esos datos 3 veces, osea para 3 automoviles diferentes.

tengo este codigo pero se me hace demasiado largo, y queria ver si hay alguna forma de hacerlo mas corto:

#include<stdio.h>
struct Auto{
int año;
        float sedan, pickup, deportivo;
char modelo[100];
char marca[100];
}c1, c2, c3;
int main(){
char buffer[100];
//datos del primer auto
printf("Introduzca los datos del primer auto:\nanio: ");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer, "%d", &c1.año);
printf("Introduzca el modelo: ");
fgets(c1.modelo,sizeof(c1.modelo),stdin);
printf("Introduzca la marca: ");
fgets(c1.marca,sizeof(c1.marca),stdin);
printf("Introduzca los precios para sedan, pickup, deportivo:\n");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c1.sedan);
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c1.pickup);
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c1.deportivo);
//datos del segundo auto
printf("Introduzca los datos del segundo auto:\nanio: ");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer, "%d", &c2.año);
printf("Introduzca el modelo: ");
fgets(c1.modelo,sizeof(c2.modelo),stdin);
printf("Introduzca la marca: ");
fgets(c1.marca,sizeof(c2.marca),stdin);
printf("Introduzca los precios para sedan, pickup, deportivo:\n");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c2.sedan);
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c2.pickup);
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c2.deportivo);
//datos del tercer auto
printf("Introduzca los datos del tercer auto:\nanio: ");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer, "%d", &c3.año);
printf("Introduzca el modelo: ");
fgets(c1.modelo,sizeof(c3.modelo),stdin);
printf("Introduzca la marca: ");
fgets(c1.marca,sizeof(c3.marca),stdin);
printf("Introduzca los precios para sedan, pickup, deportivo:\n");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c3.sedan);
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c3.pickup);
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer,"%f",&c3.deportivo);
return 0;
}


Gracias.  :D
So i herd u liek mudkipz?

Beakman

depende lo que quieras hacer con esos datos, si los queres mostrar por pantalla o guardar en un archivo, seria mas fácil declarar una sola estructura y hacer un ciclo, un for de 3, y cargarlos en la misma estructura. y vas devolviendo los datos.

Mr.Blue

#2
crear una matriz? de [3]x[X]

algo asi

struct Auto{
   int año[3];
       float sedan[3], pickup[3], deportivo[3];
   char modelo[3][100];
   char marca[3][100];
} c1;

Comentario.

        float sedan[3], pickup[3], deportivo[3];

esto lo podes tmb modificar
sabiendo vos que

sedan   pickup   deportivo
     1        2            3

hacer una matriz

floar algo [3] [3];


Gallu

Consejos ...
Agrupa el código en funciones a ser posible , de esa manera evitarás tener que repetirlo y el código será más corto y fácil de leer.
Usa memoria dinámica siempre que sea posible, no crees que es un desperdicio reservar 100 posiciones para la marca y el modelo ?

Espero que este ejemplo te sirva de ayuda

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ELEMENTOS 2
#define LIMPIA_BUFFER  while(getchar()!='\n');

typedef struct{
int año;
        float sedan, pickup, deportivo;
char *modelo;
char *marca;
}type_auto;

int main(int elem , char ** args ){
int num_elementos = 0;
char buffer[100];
int i = 0;

if (args[1] != NULL){
sscanf(args[1],"%d",&num_elementos);
}

if(num_elementos > 50 || num_elementos < 1 ){
num_elementos = ELEMENTOS;
}

type_auto autos[num_elementos];

init_auto(autos, num_elementos);

for (i = 0 ; i < num_elementos ; i++){
printf("Introduzca el modelo del auto %d: " , (i + 1));
fgets(buffer,100,stdin);
autos[i].modelo = (char*) malloc(strlen(buffer) * sizeof(char*));
strcpy(autos[i].modelo , buffer);
memset(buffer,' ',100);

printf("Introduzca la marca del auto %d: ", (i + 1));
fgets(buffer,100,stdin);
autos[i].marca = (char*) malloc(strlen(buffer) * sizeof(char*));
strcpy(autos[i].marca , buffer);
memset(buffer,' ',100);

printf("Escriba el año del auto \n");
fscanf(stdin,"%d",&autos[i].año);
LIMPIA_BUFFER;

printf("Introduzca los precios para sedan, pickup, deportivo:\n");

fscanf(stdin,"%f",&autos[i].sedan);
LIMPIA_BUFFER;

fscanf(stdin,"%f",&autos[i].pickup);
LIMPIA_BUFFER;

fscanf(stdin,"%f",&autos[i].deportivo);
LIMPIA_BUFFER;


}
mostrar_auto(autos, num_elementos);
free_auto(autos ,  num_elementos);
printf("\nPresione una tecla para terminar...");
getchar();

}


int init_auto(type_auto *autos , int elementos){
int i = 0;

for (i ; i < elementos ; i++){
autos[i].año = 0;
autos[i].sedan = 0;
autos[i].pickup = 0;
autos[i].deportivo = 0;
autos[i].modelo = NULL;
autos[i].marca = NULL;
}
return 0;
}

int mostrar_auto(type_auto *autos , int elementos){
int i = 0;

for (i ; i < elementos ; i++){
printf("\nMarca =%sModelo =%sAnio =%d\nPrecios: Sedan =%f Pickup =%f Deportivo =%f ",autos[i].marca,autos[i].modelo,autos[i].año,
autos[i].sedan, autos[i].pickup, autos[i].deportivo);
}
return 0;
}

int free_auto(type_auto *autos , int elementos){
int i = 0;

for (i ; i < elementos ; i++){
free(autos[i].modelo);
free(autos[i].marca);
}
return 0;
}






Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.