Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Drake Forumaš(ica)
Pridružen/a: 26. 10. 2005. (11:32:33) Postovi: (36)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 14:26 sri, 2. 7. 2008 Naslov: |
|
|
Sto fali [tt]fscanf(fp, "%s %d", struktura.ime, &struktura.dug)[/tt]? :-k
Isto kako je opisano u poglavlju o strukturama, samo citas iz datoteke (dakle [tt]fscanf(fp,...)[/tt] umjesto [tt]scanf(...)[/tt]). 8)
Sto fali fscanf(fp, "%s %d", struktura.ime, &struktura.dug)?
Isto kako je opisano u poglavlju o strukturama, samo citas iz datoteke (dakle fscanf(fp,...) umjesto scanf(...)).
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
Drake Forumaš(ica)
Pridružen/a: 26. 10. 2005. (11:32:33) Postovi: (36)16
|
Postano: 14:30 sri, 2. 7. 2008 Naslov: |
|
|
hvala puno, predpostavljam da onda ako imena zelim popremati zasebno da napisem fscanf(fp, "%s %s %d", struktura.ime1, struktura.ime2, &struktura.dug);
hvala puno, predpostavljam da onda ako imena zelim popremati zasebno da napisem fscanf(fp, "%s %s %d", struktura.ime1, struktura.ime2, &struktura.dug);
|
|
[Vrh] |
|
Luuka Forumaš(ica)
Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol:
Lokacija: Hakuna Matata
|
Postano: 14:32 sri, 2. 7. 2008 Naslov: |
|
|
[code:1]
File *ulaz;
int broj;
char prvi[20],drugi[20];
ulaz=fopen("dugovi.in","r");
while ( fscanf(ulaz,"%s %s %d\n",prvi,drugi,&broj)==3)
{
i sad tu pogledat dal u polju struktura već postoje prvi i drugi
ako postoje onda im dodat/oduzet broj,
ako ne postoje, onda ih kreirat.
provjeru dal postoje radiš s nekom fjom koja trči po polju, pa vraća index u polju ak nađe element koji ima to ime (recimo)
}
[/code:1]
:D
Kod: |
File *ulaz;
int broj;
char prvi[20],drugi[20];
ulaz=fopen("dugovi.in","r");
while ( fscanf(ulaz,"%s %s %d\n",prvi,drugi,&broj)==3)
{
i sad tu pogledat dal u polju struktura već postoje prvi i drugi
ako postoje onda im dodat/oduzet broj,
ako ne postoje, onda ih kreirat.
provjeru dal postoje radiš s nekom fjom koja trči po polju, pa vraća index u polju ak nađe element koji ima to ime (recimo)
}
|
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 14:44 sri, 2. 7. 2008 Naslov: |
|
|
[quote="Drake"]hvala puno, predpostavljam da onda ako imena zelim popremati zasebno da napisem fscanf(fp, "%s %s %d", struktura.ime1, struktura.ime2, &struktura.dug);[/quote]
Tocno tako: identicno ne-datotecnom slucaju. 8)
Mozes i pomocu pomocnih varijabli, kao u Luukinom primjeru. :) No, moze ti pomocna varijabla biti i tipa [tt]struct[/tt]... sve su to ekvivalentni nacini; ti izaberi koji ti najbolje "lezi". 8)
Samo nemoj napraviti ono sto studenti ponekad pogrijese: trpati u dinamicki alocirani [tt]struct[/tt] (npr. kad se radi [tt]realloc()[/tt] niza [tt]struct[/tt]-ova) prije nego mu alociras memoriju. :ccc: Dakle, [b]NE[/b]:
[code:1]while (fscanf(ulaz, "%s %s %d\n", struktura->ime, struktura->prezime, &struktura->broj) == 3)
if (meni_se_podaci_svidjaju(*struktura))
struktura = (tip_strukture*) malloc(sizeof(tip_strukture));
// inace, zanemarim ucitano
[/code:1]
;)
Drake (napisa): | hvala puno, predpostavljam da onda ako imena zelim popremati zasebno da napisem fscanf(fp, "%s %s %d", struktura.ime1, struktura.ime2, &struktura.dug); |
Tocno tako: identicno ne-datotecnom slucaju.
Mozes i pomocu pomocnih varijabli, kao u Luukinom primjeru. No, moze ti pomocna varijabla biti i tipa struct... sve su to ekvivalentni nacini; ti izaberi koji ti najbolje "lezi".
Samo nemoj napraviti ono sto studenti ponekad pogrijese: trpati u dinamicki alocirani struct (npr. kad se radi realloc() niza struct-ova) prije nego mu alociras memoriju. Dakle, NE:
Kod: | while (fscanf(ulaz, "%s %s %d\n", struktura->ime, struktura->prezime, &struktura->broj) == 3)
if (meni_se_podaci_svidjaju(*struktura))
struktura = (tip_strukture*) malloc(sizeof(tip_strukture));
// inace, zanemarim ucitano
|
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
Drake Forumaš(ica)
Pridružen/a: 26. 10. 2005. (11:32:33) Postovi: (36)16
|
Postano: 15:45 sri, 2. 7. 2008 Naslov: |
|
|
[code:1]#include <stdio.h>
#include <stdlib.h>
typedef struct{
char ime1[20];
char ime2[20];
int dug;
} dugovi;
int main(){
int i, j, dug,cnt=0, maxdug;
char ime1[20], ime2[20], maximalni[20], iname[20],oname[20];
dugovi niz[100];
printf("Unesite ime ulazne datoteke\n");
scanf("%s", iname);
FILE *ulaz, *izlaz;
ulaz=fopen(iname, "r");
while ( fscanf(ulaz,"%s %s %d\n",ime1,ime2,&dug)==3)
{ ++cnt;
for(i=0;i<cnt;i++){
if(ime1==niz[i].ime1 && ime2==niz[i].ime2){niz[i].dug=niz[i].dug+dug;}
if(ime1==niz[i].ime2 && ime2==niz[i].ime1){niz[i].dug=niz[i].dug-dug;}
else{niz[cnt].ime1=ime1; niz[cnt].ime2=ime2; niz[cnt].dug=dug;}
}
}
for(i=0;i<cnt-1;i++){
ime1=niz[i].ime1;
dug=niz[i].dug;
for(j=0;j<cnt;j++){
if(i!=j){
if(ime1==niz[j].ime1)dug=dug+niz[j].dug;
if(ime1==niz[j].ime2)dug=dug-niz[j].dug;
}
}
if(i==0){maximalni=ime1; maxdug=dug;}
if(dug>maxdug){maxdug=dug; maximalni=ime1;}
}
printf("%s %d", maximalni, maxdug);
scanf(" ");
return 0;
}[/code:1]
evo , napisao sam bez ispisa u datoteku ali nece iskompajlirati, zbog "ISO C++ forbids assignment of arrays " greske pa ako netko zna u cemu je problem bio bi ako zahvalan da me uputi :)
Kod: | #include <stdio.h>
#include <stdlib.h>
typedef struct{
char ime1[20];
char ime2[20];
int dug;
} dugovi;
int main(){
int i, j, dug,cnt=0, maxdug;
char ime1[20], ime2[20], maximalni[20], iname[20],oname[20];
dugovi niz[100];
printf("Unesite ime ulazne datoteke\n");
scanf("%s", iname);
FILE *ulaz, *izlaz;
ulaz=fopen(iname, "r");
while ( fscanf(ulaz,"%s %s %d\n",ime1,ime2,&dug)==3)
{ ++cnt;
for(i=0;i<cnt;i++){
if(ime1==niz[i].ime1 && ime2==niz[i].ime2){niz[i].dug=niz[i].dug+dug;}
if(ime1==niz[i].ime2 && ime2==niz[i].ime1){niz[i].dug=niz[i].dug-dug;}
else{niz[cnt].ime1=ime1; niz[cnt].ime2=ime2; niz[cnt].dug=dug;}
}
}
for(i=0;i<cnt-1;i++){
ime1=niz[i].ime1;
dug=niz[i].dug;
for(j=0;j<cnt;j++){
if(i!=j){
if(ime1==niz[j].ime1)dug=dug+niz[j].dug;
if(ime1==niz[j].ime2)dug=dug-niz[j].dug;
}
}
if(i==0){maximalni=ime1; maxdug=dug;}
if(dug>maxdug){maxdug=dug; maximalni=ime1;}
}
printf("%s %d", maximalni, maxdug);
scanf(" ");
return 0;
} |
evo , napisao sam bez ispisa u datoteku ali nece iskompajlirati, zbog "ISO C++ forbids assignment of arrays " greske pa ako netko zna u cemu je problem bio bi ako zahvalan da me uputi
|
|
[Vrh] |
|
Mad Wilson Forumaš(ica)
Pridružen/a: 29. 05. 2006. (22:51:14) Postovi: (121)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 16:17 sri, 2. 7. 2008 Naslov: |
|
|
Uz ovo sto je M.W. napisao:
- deklaracije idu ispred naredbi
- "ISO [color=red]C++[/color] forbids assignment of arrays " :arrow: imam dojam da si ostavio ekstenziju [tt].cpp[/tt]
:?
Nadalje:
[code:1] while ( fscanf(ulaz,"%s %s %d\n",ime1,ime2,&dug)==3)
{ ++cnt;
for(i=0;i<cnt;i++){ [/code:1]
Cemu bezuvjetno povecavanje [tt]cnt[/tt]-a i to bas za 1 i onda jos odmah iza imas petlju koja cita [i]i[/i]-ti element, bez da mu prije toga postavi vrijednost? :-k Ako su oba imena u nizu, [tt]cnt[/tt] se ne bi smio mijenjati; ako je samo jedno ime u nizu, treba ga povecati za 1; ako niti jedno ime nije u nizu (npr. u prvom koraku), treba ga povecati za 2. :?
Kako sam rekao na vjezbama (za taj isti zadatak): idealno je napisati funkciju koja trazi ime u nizu, te dodavati elemente u niz ako ona ne nadje sto trazi. 8)
[b]Dodatak:[/b] tek sada skuzih da pamtis uredjene parove imena i pripadne dugove, sto nije dobro. :? Dugovi se "prebijaju", sto znaci da trebas pamtiti po jedno ime i dug te osobe, zatim trazis dvije osobe (dva [tt]struct[/tt]-a) i onda njima mijenjas dugove (duzniku povecas dug, ovom drugom smanjis). :)
Uz ovo sto je M.W. napisao:
- deklaracije idu ispred naredbi
- "ISO C++ forbids assignment of arrays " imam dojam da si ostavio ekstenziju .cpp
Nadalje:
Kod: | while ( fscanf(ulaz,"%s %s %d\n",ime1,ime2,&dug)==3)
{ ++cnt;
for(i=0;i<cnt;i++){ |
Cemu bezuvjetno povecavanje cnt-a i to bas za 1 i onda jos odmah iza imas petlju koja cita i-ti element, bez da mu prije toga postavi vrijednost? Ako su oba imena u nizu, cnt se ne bi smio mijenjati; ako je samo jedno ime u nizu, treba ga povecati za 1; ako niti jedno ime nije u nizu (npr. u prvom koraku), treba ga povecati za 2.
Kako sam rekao na vjezbama (za taj isti zadatak): idealno je napisati funkciju koja trazi ime u nizu, te dodavati elemente u niz ako ona ne nadje sto trazi.
Dodatak: tek sada skuzih da pamtis uredjene parove imena i pripadne dugove, sto nije dobro. Dugovi se "prebijaju", sto znaci da trebas pamtiti po jedno ime i dug te osobe, zatim trazis dvije osobe (dva struct-a) i onda njima mijenjas dugove (duzniku povecas dug, ovom drugom smanjis).
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
|