Problemas con programa usando struct

Iniciado por Fyllio, 28 Noviembre 2013, 03:17 AM

0 Miembros y 2 Visitantes están viendo este tema.

Fyllio

Buenas tengo algunos problemas con este programa y quisiera ver si me pueden ayudar.

En si las fallas que no consigo corregir son de que si por ejemplo en principio lleno 2 datos struct, y después quiero volver al menú para agregar el tercero, me conserve los anteriores sin borrarlos, y que cuando seleccione la opción de imprimir en pantalla, me aparezcan los 2 primeros + el tercero que se agrego después.

El otro problema es que si quiero realizar una búsqueda ya sea por Marca o N. de Registro me haga la búsqueda en todos los struct que solo la busca en el primero.

Espero que me puedan ayudar, gracias de antemano y buenas noches.

Código
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 3
#define p printf
#define s scanf

struct x
{
int serie, exi;
char mod[20], marca[20], color[50];
float precio;
}coche[MAX];

void imprimir(int);
void imprimir_cod(int, int);
void imprimir_marc(int, char);
void agregar(int);

/*coche[0].precio=200000;*/
/*busqueda por n. de serie o marca*/
void agregar(int exi)
{
    int i=0,j, z;
    while(i<exi)
    {
        p("Inserta los siguientes datos que se te pidan\n");
        for(i=0;i<exi;i++)
        {
          p("Datos de Producto %d\n", i+1);
          p("Modelo\n");
          s("%s", & coche[i].mod);
          p("\n");
          p("Marca\n");
          s("%s", & coche[i].marca);
          p("\n");
          p("N. de Serie\n");
          s("%d", & coche[i].serie);
          p("\n");
          p("Precio\n");
          s("%f", & coche[i].precio);
          p("\n");
          p("Color\n");
          s("%s", & coche[i].color);
          p("\n");
          p("Inventario\n");
          s("%d", & coche[i].exi);
          system("cls");
        }
        i++;
        system("cls");
    }

}


void imprimir(int exi)
{
    int i;
    for(i=0;i<exi;i++)
    {
        p("Modelo %s\n",coche[i].mod);
        p("Marca %s\n", coche[i].marca);
        p("N. de Serie %d\n", coche[i].serie);
        p("Precio %.2f\n", coche[i].precio);
        p("Color %s\n", coche[i].color);
        p("Inventario %d\n", coche[i].exi);
        p("\n");
    }
    i++;
}

void imprimir_cod(int exi, int serie)
{
    int i;
    for(i=0;i<exi;i++)
    {
        p("Modelo %s\n",coche[i].mod);
        p("Marca %s\n", coche[i].marca);
        p("N. de Serie %d\n", coche[i].serie);
        p("Precio %.2f\n", coche[i].precio);
        p("Color %s\n", coche[i].color);
        p("Inventario %d\n", coche[i].exi);
        p("\n");
    }
    i++;
}

 void imprimir_marc(int exi, char marca)
{
    int i;
    for(i=0;i<exi;i++)
    {
        p("Modelo %s\n",coche[i].mod);
        p("Marca %s\n", coche[i].marca);
        p("N. de Serie %d\n", coche[i].serie);
        p("Precio %.2f\n", coche[i].precio);
        p("Color %s\n", coche[i].color);
        p("Inventario %d\n", coche[i].exi);
        p("\n");
    }
    i++;
}



int main()
{
    int exi, opc, r, q=0,i=0, serie, cont;
    char marca[20];
    do{
    p("Que funcion deseas realizar\n");
    p("1.Agregar Datos\n");
    p("2.Imprimir Datos\n");
    p("3.Buscar Datos por N. de Serie\n");
    p("4.Buscar Datos por Marca\n");
    s("%d", & opc);

    system("cls");
    switch(opc)
    {
        case 1:
        q++;
        p("Cuanto elementos agregaras\n");
        p("No mas de 3 lementos\n");
        p("Puedes agregar elementos en el orden que desees\n");
        s("%d", & exi);
        /*cont=exi*/

        system("cls");
        while(exi>MAX)
        {
            p("NO puedes tener mas de 3 elementos\n");
            p("Cuanto elementos agregaras\n");
            s("%d", & exi);
            system("cls");
        }

        agregar(exi);

        do{
        p("Para regresar al menu principal y agregar mas datos presione 1\n");
        s("%d", & r);
        system("cls");
        }while(r!=1);

        break;

        case 2:
        while(q==0)
        {
            p("No hay datos que imprimir\nRegresando a menu principal\n");
            main();
            q++;
        }

        imprimir(exi);

        do{
        p("Para regresar al menu principal y agregar mas datos presione 1\n");
        s("%d", & r);
        system("cls");
        }while(r!=1);

        break;

        case 3:
        while(q==0)
        {
            p("No hay datos que buscar\nRegresando a menu principal\n");
            main();
            q++;
        }
        p("Que numero de Serie buscas\n");
        s("%d", & serie);

        if(serie==coche[i].serie)
        {

            p("Se encontro el modelo de vehiculo\n");
            imprimir_cod(1,serie);
        }
        else p("No se encontro el modelo de vehiculo\n");

         do{
        p("Para regresar al menu principal y hacer otros movimientos 1\n");
        s("%d", & r);
        system("cls");
        }while(r!=1);

        break;

        case 4:
         while(q==0)
        {
            p("No hay datos que buscar\nRegresando a menu principal\n");
            main();
            q++;
        }
        p("Que marca de Vehiculo buscas\n");
        s("%s", & marca);

        if (strcmp(marca, coche[i].marca) == 0)
        {
            p("Se encontro la Marca del vehiculo\n");
            imprimir_marc(1,*marca);
        }
        else p("No se encontro la Marca del vehiculo\n");

         do{
        p("Para regresar al menu principal y hacer otros movimientos 1\n");
        s("%d", & r);
        system("cls");
        }while(r!=1);

    }
    }while(r==1);
   }

dato000

El problema es que cada vez que reinicias la opcion 1, eso quiere decir, cuando tratas de agregar un carro nuevo, después de ya tener un carro, estas creando un espacio de memoria que esta sobreescribiendo al anterior carro que tenias, por lo que no te aparecen la información de los carros anteriores que tenias.

Lo que puedes hacer son tres cosas:

1) Trabajar con listas o vectores, es similar, pero a concepto, es mejor trabajar con lista, aunque se complicaria el código, me parece que tal como esta esta bien.

2) Trabajar con archivos, que es lo que yo haría, generando un registro nuevo por cada nuevo, así que en vez de pedirle al usuario que puede poner en cada ronda de agregación de datos un máximo de tres carritos, lo hace 1 a 1, y se genera un archivo por cada registro del struct, conteniendo toda la información, nuevamente, se complica el código, aunque creeme, a la larga, es algo mucho mejor.

3) Lo otro es manejar los indices de las estructuras, te explico:

Tienes la función agregar,


void agregar(int exi)
{
     int i=0,j, z;
     while(i<exi)
     {
             ...


sabes que la exi puede ser un máximo de 3, y tienes el indice i siempre se reiniciara cada vez que llamas a la función, te recomendaría que no lo reinicies, y que lo dejes aumentar a medida que necesites nuevos registros, y para que no tengas problemas con el máximo de inscripciones en la estructura de los coches, simplemente cambia la cantidad de coches permitidos


#define MAX 3
#define p printf
#define s scanf


por cierto usar define para printf y scanf se me hace excesivamente perezoso XD

no se si me entiendas, mira la mejor forma de ejemplificar es viendo la forma que trabaja la variable q en la función de imprimir o cualquiera de sus clones, va contabilizando como un contador total de elementos que se tienen en total en la estructura, sin el inconveniente de reiniciar/borrar los datos porque siempre aumentara y referenciara nuevos espacios en el arreglo.

Los problemas de busqueda estan ligados al primer problema, lo que necesitas es una sentencia if comparando el dato del nombre, el modelo o la serie que necesitas identificar y en un ciclo repetitivo recorres toda la estructura comparando, si encuentras el dato, lo imprimes totalmente según el indice que tienes acumulado.



Fyllio

Ohh.. creo que ya  capte como hacerlo...al menos usando la opción 3, y con respecto al uso del define en printf y scanf, sep mal habito mio, se me pego de un libro de programación que me encontré que traía algunos ejemplos hechos de esa manera xD.

Gracias, voy a hacer los cambios (esperar hacerlos bien) y rogar que funcione, si sigo con problemas volveré a postear aquí owo. Gracias dato000!!! *.*