Forum » Programiranje » program c - help ;)
program c - help ;)

Nejcos ::
Jz upam da se bo kdo potrudil in mi pomagal.
Naloga se glasi:
Želiš voditi evidenco, koliko tečeš, kolesariš, plavaš... Za vsako dejavnost si vodi, koliko časa je trajala in razdaljo(km). Pogled mora bit omogočen na zaslon pa tudi zapis v datoteko, iz katere potem bereš zapise, da lahko izračunaš določen čas in km za celo leto ali pa le za en mesec (ker imaš lahko več vnosov v enem mesecu) za določen šport(še en if stavek moram not dat..). Recimo, zanima te kolk km si pretek v marcu. Pa gledaš, daje mesec=3, da je šport pod določeno cifro (npr 1-tek, 2-kolo, 3-plavanje),pa seštevaš v neko spr. km in v drugo čas.
Program še ni čist do konca napisan, ker se je zataknilo že pri tem, da v datoteko zapisuje kar neke znake, ven ne zna pa nič prebrat! Ko ponovno zaženeš program, je s kazalcem na koncu datoteke (ker mamo "a+"), ampak ne vemo pa, kako se premaknit na začetek. Smo mal sprobaval fseek(dat,0,0), pa ni nič pametnega ven prišlo;)
No, kakršnakoli pomoč bi bla dobrodošla. Bi v funkcijah vsota_km in vsota_cas morala definirat kak nov kazalec pa zanj spet rezervirat prostor. K ti kazalci so men kr neki...
Prosim za pomoč! :)
Naloga se glasi:
Želiš voditi evidenco, koliko tečeš, kolesariš, plavaš... Za vsako dejavnost si vodi, koliko časa je trajala in razdaljo(km). Pogled mora bit omogočen na zaslon pa tudi zapis v datoteko, iz katere potem bereš zapise, da lahko izračunaš določen čas in km za celo leto ali pa le za en mesec (ker imaš lahko več vnosov v enem mesecu) za določen šport(še en if stavek moram not dat..). Recimo, zanima te kolk km si pretek v marcu. Pa gledaš, daje mesec=3, da je šport pod določeno cifro (npr 1-tek, 2-kolo, 3-plavanje),pa seštevaš v neko spr. km in v drugo čas.
Program še ni čist do konca napisan, ker se je zataknilo že pri tem, da v datoteko zapisuje kar neke znake, ven ne zna pa nič prebrat! Ko ponovno zaženeš program, je s kazalcem na koncu datoteke (ker mamo "a+"), ampak ne vemo pa, kako se premaknit na začetek. Smo mal sprobaval fseek(dat,0,0), pa ni nič pametnega ven prišlo;)
No, kakršnakoli pomoč bi bla dobrodošla. Bi v funkcijah vsota_km in vsota_cas morala definirat kak nov kazalec pa zanj spet rezervirat prostor. K ti kazalci so men kr neki...
Prosim za pomoč! :)
FILE *dat;
struct zapis {
float cas;
float km;
int sport;
int dan;
int mesec;
int leto;
struct zapis *nasl;
};
struct zapis *prvi;
struct zapis *vnos(struct zapis *prvi) {
int sport1,dan1,mesec1,leto1;
float cas1,km1;
struct zapis *pom=prvi;
printf("cas:");
scanf("%f", &cas1);
printf("km:");
scanf("%f", &km1);
printf("sport(1,2,3):");
scanf("%d", &sport1);
printf("dan:");
scanf("%d", &dan1);
printf("mesec:");
scanf("%d", &mesec1);
printf("leto:");
scanf("%d", &leto1);
if (prvi != NULL) {
while (prvi->nasl != NULL)
prvi=prvi->nasl;
prvi->nasl=(struct zapis*) malloc (sizeof(struct zapis));
prvi=prvi->nasl;
prvi->nasl=NULL;
prvi->cas=cas1;
prvi->km=km1;
prvi->sport=sport1;
prvi->dan=dan1;
prvi->mesec=mesec1;
prvi->leto=leto1;
fwrite(prvi, sizeof(struct zapis), 1, dat);
return pom;
}
else {
prvi=(struct zapis*) malloc (sizeof(struct zapis));
prvi->nasl=NULL;
prvi->cas=cas1;
prvi->km=km1;
prvi->sport=sport1;
prvi->dan=dan1;
prvi->mesec=mesec1;
prvi->leto=leto1;
fwrite(prvi, sizeof(struct zapis), 1, dat);
return prvi;
}
}
void izpis(struct zapis *prvi){
if (prvi==NULL)
printf("Seznam je prazen.");
else
while (prvi!=NULL) {
printf("%f, ", prvi->cas);
printf("%f, ", prvi->km);
printf("%d, ", prvi->sport);
printf("%d, ", prvi->dan);
printf("%d, ", prvi->mesec);
printf("%d\n\n", prvi->leto);
prvi=prvi->nasl;
}
}
float vsota_km(struct zapis *prvi) {
int izbira_km;
float vsota=0.0;
prvi=NULL;
printf("1:Celo leto\n");
printf("2:Po mesecih\n");
scanf("%d",&izbira_km);
switch (izbira_km){
case 1:
while (prvi->nasl !=NULL) {
prvi=(struct zapis*) malloc (sizeof(struct zapis));
fread(prvi, sizeof(struct zapis), 1, dat);
vsota+=prvi->km;
free(prvi);
prvi=prvi->nasl;
}
return (vsota);
break;
case 2:
printf("Vpisi stevilko meseca:");
int st;
scanf("%d",&st);
while (prvi->nasl !=NULL) {
prvi=(struct zapis*) malloc (sizeof(struct zapis));
fread(prvi, sizeof(struct zapis), 1, dat);
if (prvi->mesec==st)
vsota+=prvi->km;
free(prvi);
prvi=prvi->nasl;
}
return (vsota);
break;
}
}
float vsota_cas(struct zapis *PRVI) {
int izbira_cas;
float vsota=0.0;
struct zapis *pom=PRVI;
printf("1:Celo leto\n");
printf("2:Po mesecih\n");
scanf("%d",&izbira_cas);
switch (izbira_cas){
case 1:
while (pom->nasl !=NULL) {
pom=(struct zapis*) malloc (sizeof(struct zapis));
fread(pom, sizeof(struct zapis), 1, dat);
vsota+=pom->cas;
free(pom);
pom=pom->nasl;
}
return (vsota);
break;
case 2:
printf("Vpisi stevilko meseca:");
int st;
scanf("%d",&st);
while (pom->nasl !=NULL) {
pom=(struct zapis*) malloc (sizeof(struct zapis));
fread(pom, sizeof(struct zapis), 1, dat);
if (pom->mesec==st)
vsota+=pom->cas;
free(pom);
pom=pom->nasl;
}
return (vsota);
break;
}
}
int main(int argc, char *argv[])
{
prvi=NULL;
dat=fopen("rekreac.txt","a+");
int izbira;
float vs_km,vs_cas;
do {
printf("\n1:Vnos podatkov\n");
printf("2:Izpis podatko\n");
printf("3:Kilometri\n");
printf("4:Cas\n");
printf("5:Izhod\n");
scanf("%d", &izbira);
switch (izbira) {
case 1: prvi=vnos(prvi);
break;
case 2: izpis(prvi);
break;
case 3: vs_km=vsota_km(prvi);
printf("Vsota kilometrov=&f", vs_km);
break;
case 4: vs_cas=vsota_cas(prvi);
printf("Cas rekreacije=%f",vs_cas);
break;
}
}
while (izbira!=5);
fclose(dat);
system("PAUSE");
return 0;
}
- spremenil: Senitel ()

VASkO ::
v datoteko itak zapisuje kar neke znake, če vanjo zapisuješ strukture, ki se nehajajo v pomnilniku, poleg tega če hočeš serializirati strukture, kot to počneš ti, kar odpri binary file - parameter a+b
pa datoteko beres le v primeru, ce imas shranjen kak zapis v pomnilniku. ce vse zapise shranjujes v datoteko takoj ob kreiranju, rajsi preverjaj, ali datoteka ni prazna kot pogoj za izpis podatkov in potem nadaljujes z izpisom.
edit:
za pomik kazalca na zacetek datoteke imas funkcijo rewind(FILE* fp)
nekaj o tem, poglej se related examples
pa datoteko beres le v primeru, ce imas shranjen kak zapis v pomnilniku. ce vse zapise shranjujes v datoteko takoj ob kreiranju, rajsi preverjaj, ali datoteka ni prazna kot pogoj za izpis podatkov in potem nadaljujes z izpisom.
edit:
za pomik kazalca na zacetek datoteke imas funkcijo rewind(FILE* fp)
nekaj o tem, poglej se related examples
Zgodovina sprememb…
- spremenil: VASkO ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | enojno povezan seznam -izpis nazajOddelek: Programiranje | 3800 (3340) | Randomness |
» | [C] kazalčni seznamOddelek: Programiranje | 3250 (3064) | MrBrdo |
» | [C] Povezani seznami in kazalciOddelek: Programiranje | 2642 (2209) | Good Guy |
» | [C] Narascajoce sortiranje linearnega seznamaOddelek: Programiranje | 1945 (1834) | Jebiveter |
» | spet problem v Cju ... kazalciOddelek: Programiranje | 1109 (1023) | hatch |