[ unknow13 @ 31.05.2012. 15:55 ] @
Radimo program za skolu, i napisali smo skoro do kraja, i imamo problem da prilikom unosa novog automobila program ulazi u beskonacnu petlju i nikako ne mozemo da smislimo kako da napisemo for petlju i da radi dobro.
Stanje predstavlja broj automobila na placu.
Evo koda :

Code:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<math.h>
int main()
{
    char izbor,search,fuel[10];
    int u,stanje,euro,kms,year,i;
    printf("\n Dobrodosli na Auto plac");
    struct parking{
        char marka[20];
        char model[20];
        char gorivo[10];
        int km;
        int god;
        int cena;
    };
    FILE *plac;
    parking auto1[50];
    printf("\n Za unos novog automobila unesite U , za pretragu unesite P, a za listanje dostupnih auta L \n" );
    scanf("%c",&izbor);
    if(izbor=='U')
    {
        plac=fopen("plac.txt","r");
        fscanf(plac,"%d",&stanje);
        fclose(plac);
        plac=fopen("plac.txt","w+");
        for(i=stanje;i<stanje+1;i++)
        {
            printf("\n Unesite marku auta");
            scanf("%s",&auto1[i].marka);
            fprintf(plac,"%s",&auto1[i].marka);
            printf("\n Unesite model auta");
            scanf("%s",&auto1[i].model);
            fprintf(plac,"%s",&auto1[i].model);
            printf("\n Unesite gorivo koje auto koristi");
            scanf("%s",&auto1[i].gorivo);
            fprintf(plac,"%s",&auto1[i].gorivo);
            printf("\n Unesite kilometrazu");
            scanf("%d",&auto1[i].km);
            fprintf(plac,"%d",&auto1[i].km);
            printf("\n Unesite godiste u formatu xxxx");
            scanf("%d",&auto1[i].god);
            fprintf(plac,"%d",&auto1[i].god);
            printf("\n Unesite cenu auta");
            scanf("%d",&auto1[i].cena);
            fprintf(plac,"%d",&auto1[i].cena);
            stanje ++;
        }
        fclose(plac);
    }
    else if(izbor=='P')
    {
        plac=fopen("plac.txt","r");
        printf("\n Za pretragu po gorivu unesite G \n za pretragu po godistu Y \n za pretragu po kilometrazi unesti K \n za pretragu po ceni, unesite C \n");
        scanf("%c",&search);
        if(search=='G')
        {
            printf("\n Unesite gorivo koje zelite ( DIZEL/BENZIN/GAS )");
            scanf("%s",&fuel[10]);
            for(i=0;i<stanje;i++)
            {
                if(auto1[i].gorivo==fuel)
                {
                    printf("%s",&auto1[i].marka);
                    printf("%s",&auto1[i].model);
                    printf("%d",&auto1[i].km);
                    printf("%d",&auto1[i].god);
                    printf("%d",&auto1[i].cena);
                    printf("%s",&auto1[i].gorivo);
                }
            }
        }
    }
    else if(search=='Y')
    {
        printf("\n Unesite od kojeg godista trazite auto (xxxx)");
        scanf("%d",&year);
        for(i=0;i<stanje;i++)
        {
            if(auto1[i].god>=year)
            {
                printf("%s",&auto1[i].marka);
                printf("%s",&auto1[i].model);
                printf("%d",&auto1[i].km);
                printf("%s",&auto1[i].gorivo);
                printf("%d",&auto1[i].cena);
                printf("%d",&auto1[i].god);
            }
        }
    }
    else if(search=='K')
    {
        printf("\n Unesite do koje kilometraze trazite auto");
        scanf("%d",&kms);
        for(i=0;i<stanje;i++)
        {
            if(auto1[i].km<=kms)
            {
                printf("%s",&auto1[i].marka);
                printf("%s",&auto1[i].model);
                printf("%s",&auto1[i].gorivo);
                printf("%d",&auto1[i].god);
                printf("%d",&auto1[i].cena);
                printf("%d",&auto1[i].km);
            }
        }
    }
    else if(search=='C')
    {
        printf("\n Unesite do koje cene trazite auto");
        scanf("%d",&euro);
        for(i=0;i<stanje;i++)
        {
            if(auto1[i].cena<=euro)
            {
                printf("%s",&auto1[i].marka);
                printf("%s",&auto1[i].model);
                printf("%d",&auto1[i].km);
                printf("%d",&auto1[i].god);
                printf("%s",&auto1[i].gorivo);
                printf("%d",&auto1[i].cena);
            }
        }
    }
    else
    {
        for(i=0;i<stanje;i++)
        {
            printf("%s",&auto1[i].marka);
            printf("%s",&auto1[i].model);
            printf("%d",&auto1[i].km);
            printf("%d",&auto1[i].god);
            printf("%s",&auto1[i].gorivo);
            printf("%d",&auto1[i].cena);
        }
    }
    fclose(plac);
    getch();
    return 0;
}


[Ovu poruku je menjao Mihajlo Cvetanović dana 31.05.2012. u 17:25 GMT+1]
[ Mihajlo Cvetanović @ 31.05.2012. 16:46 ] @
Kako treba program da radi? Trenutno kad se program pokrene korisnik može da odabere jedno od U/P/L, i kad se ta jedna operacija završi završiće se i program. Da li tako treba?

Šta tačno treba da stoji u fajlu plac.txt? Malo je čudno što se iz fajla prvo čita jedan broj, a onda se u fajl dodaju podaci. Čemu služi taj broj? Da li je normalno da se podaci samo dodaju, a da se postojeći nikad ne brišu?

Primećujem i da imate grešku u kodu koja se lepo vidi kad je kod ovako nazubljen (mojom intervencijom), a ne ravan kao što je originalno bio. Promenljiva search treba da se postavi i ispituje samo u slučaju P, ali trenutno se tako radi samo sa search=G, a ostali search podslučajevi su izvan slučaja P.

Ja bih kod skratio utoliko što bih ispisivanje podataka za jedno vozilo sklonio u posebnu funkciju sa parametrom koji je referenca na to vozilo. Zatim bih tu funkciju pozivao gde god da mi treba. Morao bi da žrtvuješ različitost redosleda, ali to ja vidim kao prednost, jer nema razloga da redosled podataka o vozilu zavisi od toga po kom kriterijumu tražiš vozilo.
[ unknow13 @ 31.05.2012. 16:54 ] @
Da, tako treba. To cemo dodati posle da se program vrati na pocetni meni.
U fajlu plac.txt treba da stoji lista vozila koja se nalaze na placu, a pocetni broj koji bi program trebao da iscita iz istog fajla bi trebao da bude broj vozila na placu. Tako nam je rekla profesorica da uradimo, ne znam da li moze ikako drugacije.
Tu ne znam kako ograniciti for petlju da ne pise preko postojeceg vozila.
Hvala za gresku kod pretrage, do toga jos nismo stigli, ispravicemo.
[ Mihajlo Cvetanović @ 31.05.2012. 17:08 ] @
Fajl plac.txt je tekstualni fajl, i prva linija u fajlu treba da bude broj vozila u fajlu. Okej. To je najelegantnije ostvariti tako što na početku rada programa pročitate kompletan fajl, i učitate sva vozila kod sebe u niz auto1, a na kraju rada prepišete u fajl kompletne podatke (koji su eventualno promenjeni u međuvremenu). Komanda U ne bi radila sa fajlom, nego sa podacima u promenljivoj auto1.

Da bi se lepo učitali ti podaci koje ćete da upišete u fajl najbolje je da svaki podatak stoji u posebnoj liniji tog fajla, odnosno da svaki fprintf ima \n na kraju.

Kad se ovako postave stvari onda se tačno zna šta promenljiva stanje predstavlja, i gde i kad se menja. Prilikom ispisivanja podataka u fajl promenljiva stanje se ne bi menjala.

Kako ste zamislili da radi komanda U, da li sa njom treba da se unesu podaci za jedno vozilo, ili za više odjednom?
[ unknow13 @ 31.05.2012. 17:13 ] @
Za jedno vozilo, i nakon unosa poslednjeg podatka za to jedno vozilo, da pita da li zelimo da unesemo jos jedno, ako ne onda vraca na pocetni meni.
[ Mihajlo Cvetanović @ 31.05.2012. 17:23 ] @
Onda treba da postoji nekakva petlja u slučaju U, ali izlazak iz te petlje treba da zavisi od toga kako je korisnik odgovorio na pitanje da li hoće da unese još vozila. Trenutno to pitanje ne postoji. Kad napravite kod koji ne dira fajl u slučaju U (nego podatke samo smešta u auto1) onda će vam biti lako da ubacite i ovu petlju, ali za početak namestite da se na U unosi samo jedno vozilo, promenite kod kako sam napisao u preostalim porukama, i na kraju ubacite i tu petlju u slučaju U.