Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
Postano: 16:09 pon, 20. 2. 2012 Naslov: Prog2 DZ |
|
|
Moze objasnjenje zasto ovo ne radi :?
[b]Zadatak:[/b]
Napišite program koji čita datoteku "pgombiic.in", te ju prepisuje u datoteku "pgombiic.out" tako da u prepisivanju izostavi sve znakove 'a', 'c', 'g', 'o'.
[code:1]#include <stdio.h>
int main(void){
FILE *fin, *fout;
char c;
fin = fopen("pgombiic.in", "rt");
fout = fopen("pgombiic.out", "wt");
while (fscanf(fin, "%c", &c) != EOF) {
if (c != 'a' && c != 'c' && c != 'g' && c != 'o') {
fprintf(fout, "%c", c);
}
}
fclose(fin);
fclose(fout);
return 0;
}[/code:1]
Moze objasnjenje zasto ovo ne radi
Zadatak:
Napišite program koji čita datoteku "pgombiic.in", te ju prepisuje u datoteku "pgombiic.out" tako da u prepisivanju izostavi sve znakove 'a', 'c', 'g', 'o'.
Kod: | #include <stdio.h>
int main(void){
FILE *fin, *fout;
char c;
fin = fopen("pgombiic.in", "rt");
fout = fopen("pgombiic.out", "wt");
while (fscanf(fin, "%c", &c) != EOF) {
if (c != 'a' && c != 'c' && c != 'g' && c != 'o') {
fprintf(fout, "%c", c);
}
}
fclose(fin);
fclose(fout);
return 0;
} |
Zadnja promjena: gflegar; 18:22 pon, 20. 2. 2012; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
fejky Forumaš(ica)
Pridružen/a: 23. 06. 2010. (16:53:45) Postovi: (3D)16
Spol:
|
|
[Vrh] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 16:53 pon, 20. 2. 2012 Naslov: Re: Prog2 DZ |
|
|
Problem je ovdje:
[code:1] while (fscanf(fin, "%c", &c) != EOF) { .... }
[/code:1]
[tt]fscanf[/tt] (kao i [tt]scanf[/tt] i [tt]sscanf[/tt]) vraća broj učitanih argumenata, dakle gornji poziv funkcije [tt]fscanf[/tt] će vratiti [tt]1[/tt] ako uspije učitati podatke u varijablu [tt]c[/tt], a u slučaju da to ne uspije, vratit će [tt]0[/tt]. S druge strane, konstanta [tt]EOF[/tt] je uvijek definirana kao negativna integer konstanta (u većini implementacija [tt]-1[/tt]).
Dakle, ono što se u gornjem kodu dogodi je beskonačna petlja, jer povratna vrijednost funkcije [tt]fscanf[/tt] nikada ne može biti jednaka konstanti [tt]EOF[/tt].
Problem je ovdje:
Kod: | while (fscanf(fin, "%c", &c) != EOF) { .... }
|
fscanf (kao i scanf i sscanf) vraća broj učitanih argumenata, dakle gornji poziv funkcije fscanf će vratiti 1 ako uspije učitati podatke u varijablu c, a u slučaju da to ne uspije, vratit će 0. S druge strane, konstanta EOF je uvijek definirana kao negativna integer konstanta (u većini implementacija -1).
Dakle, ono što se u gornjem kodu dogodi je beskonačna petlja, jer povratna vrijednost funkcije fscanf nikada ne može biti jednaka konstanti EOF.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
Postano: 17:39 pon, 20. 2. 2012 Naslov: |
|
|
Po standardu bi trebalo biti:
[quote]The fscanf function returns the value of the macro EOF if an input failure occurs
before any conversion. Otherwise, the function returns the number of input items
assigned, which can be fewer than provided for, or even zero, in the event of an early
matching failure.[/quote]
ili iz skripte vsege:
[quote]Funkcija fscanf() vraca broj polja (formata) koji su prepoznati
i kojima je pridana vrijednost. Ukoliko je program dosao do kraja
datoteke koju cita, povratna vrijednost ce biti EOF (naziv iza kojeg se
“skriva” vrijednost −1).
[/quote]
A i kada bi bila beskonacna petlja onda bi aplikacija za zadace vratila Time Limit Exceeded, a ne Wrong Answer (da ne govorimo da bih i ja na svojem racunalu dobio beskonacnu petlju sto nije slucaj)
Ugl. niti kada se zamijeni
[code:1]while (fscanf(fin, "%c", &c) != EOF) { .... }[/code:1]
sa
[code:1]while (fscanf(fin, "%c", &c) > 0) { .... }[/code:1]
program ne prolazi.
Po standardu bi trebalo biti:
Citat: | The fscanf function returns the value of the macro EOF if an input failure occurs
before any conversion. Otherwise, the function returns the number of input items
assigned, which can be fewer than provided for, or even zero, in the event of an early
matching failure. |
ili iz skripte vsege:
Citat: | Funkcija fscanf() vraca broj polja (formata) koji su prepoznati
i kojima je pridana vrijednost. Ukoliko je program dosao do kraja
datoteke koju cita, povratna vrijednost ce biti EOF (naziv iza kojeg se
“skriva” vrijednost −1).
|
A i kada bi bila beskonacna petlja onda bi aplikacija za zadace vratila Time Limit Exceeded, a ne Wrong Answer (da ne govorimo da bih i ja na svojem racunalu dobio beskonacnu petlju sto nije slucaj)
Ugl. niti kada se zamijeni
Kod: | while (fscanf(fin, "%c", &c) != EOF) { .... } |
sa
Kod: | while (fscanf(fin, "%c", &c) > 0) { .... } |
program ne prolazi.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 18:59 pon, 20. 2. 2012 Naslov: |
|
|
Skripta je malo neprecizna. Kako pise u [tt]man[/tt]-u (ovo prvo sto si citirao), [tt]EOF[/tt] vrati ako dodje do kraja datoteke prije prve konverzije. Ovdje je konverzija [tt]%c[/tt] odmah na pocetku, pa bi ti trebao vratiti nulu.
Trenutno nesto ne stima s provjerom datoteka (ostalo, koliko vidim, ok radi). Ne stignem sada provjeravati sto, pa daj me please bocni maliom preko vikenda, ako do tada ne proradi.
Skripta je malo neprecizna. Kako pise u man-u (ovo prvo sto si citirao), EOF vrati ako dodje do kraja datoteke prije prve konverzije. Ovdje je konverzija %c odmah na pocetku, pa bi ti trebao vratiti nulu.
Trenutno nesto ne stima s provjerom datoteka (ostalo, koliko vidim, ok radi). Ne stignem sada provjeravati sto, pa daj me please bocni maliom preko vikenda, ako do tada ne proradi.
_________________ 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] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
Postano: 19:47 pon, 20. 2. 2012 Naslov: |
|
|
[quote="vsego"]Skripta je malo neprecizna. Kako pise u [tt]man[/tt]-u (ovo prvo sto si citirao), [tt]EOF[/tt] vrati ako dodje do kraja datoteke prije prve konverzije. Ovdje je konverzija [tt]%c[/tt] odmah na pocetku, pa bi ti trebao vratiti nulu.[/quote]
Kako sam ja shvatio [tt]man[/tt] trebao bi vratiti [tt]EOF[/tt] a ne [tt]0[/tt]. Jer da bi se uopce dogodila ta konverzija prvo se nesto treba ucitati s datoteke, sto nije moguce ako je kursor na kraju datoteke.
Npr. ovaj kod se zavrti u beskonacnoj petlji:
[code:1]#include <stdio.h>
int main(void){
FILE *fin;
char c;
int ret;
fin = fopen("test.txt", "r");
while (1) {
printf("%d\n", ret = fscanf(fin, "%c", &c));
if (ret == 0) break;
}
return 0;
}[/code:1]
(ispise jedinice i dalje nastavi ispisivati [tt]-1[/tt] iliti [tt]EOF[/tt])
dok se ovaj uredno izvrsi:
[code:1]#include <stdio.h>
int main(void){
FILE *fin;
char c;
int ret;
fin = fopen("test.txt", "r");
while (1) {
printf("%d\n", ret = fscanf(fin, "%c", &c));
if (ret == EOF) break;
}
return 0;
}[/code:1]
vsego (napisa): | Skripta je malo neprecizna. Kako pise u man-u (ovo prvo sto si citirao), EOF vrati ako dodje do kraja datoteke prije prve konverzije. Ovdje je konverzija %c odmah na pocetku, pa bi ti trebao vratiti nulu. |
Kako sam ja shvatio man trebao bi vratiti EOF a ne 0. Jer da bi se uopce dogodila ta konverzija prvo se nesto treba ucitati s datoteke, sto nije moguce ako je kursor na kraju datoteke.
Npr. ovaj kod se zavrti u beskonacnoj petlji:
Kod: | #include <stdio.h>
int main(void){
FILE *fin;
char c;
int ret;
fin = fopen("test.txt", "r");
while (1) {
printf("%d\n", ret = fscanf(fin, "%c", &c));
if (ret == 0) break;
}
return 0;
} |
(ispise jedinice i dalje nastavi ispisivati -1 iliti EOF)
dok se ovaj uredno izvrsi:
Kod: | #include <stdio.h>
int main(void){
FILE *fin;
char c;
int ret;
fin = fopen("test.txt", "r");
while (1) {
printf("%d\n", ret = fscanf(fin, "%c", &c));
if (ret == EOF) break;
}
return 0;
} |
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 20:04 uto, 21. 2. 2012 Naslov: |
|
|
Ispravljeno. 8) Ukratko, kad sam aktivirao aplikaciju, bila je hrpa nasumicno pisanih rekurzija, pa sam ogranicio vrijeme izvrsavanja pojedinog programa na 2 sec, sto za tvoj prvi program iz Datoteka (ovaj gore) nije bilo dosta. Sad je stvar sredjena i rjesenje ti je proslo kao tocno. Drugi i treci program ti jednostavno nisu tocni (pregledah ih). Za sada te pustim da sam debuggiras, znam da to volis. :P
Ispravljeno. Ukratko, kad sam aktivirao aplikaciju, bila je hrpa nasumicno pisanih rekurzija, pa sam ogranicio vrijeme izvrsavanja pojedinog programa na 2 sec, sto za tvoj prvi program iz Datoteka (ovaj gore) nije bilo dosta. Sad je stvar sredjena i rjesenje ti je proslo kao tocno. Drugi i treci program ti jednostavno nisu tocni (pregledah ih). Za sada te pustim da sam debuggiras, znam da to volis.
_________________ 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] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
|
[Vrh] |
|
malalodacha Forumaš(ica)
Pridružen/a: 11. 10. 2011. (17:06:13) Postovi: (79)16
|
Postano: 18:35 ned, 4. 3. 2012 Naslov: |
|
|
Napišite program koji učitava prirodni broj k < 9, te niz od k različitih dekadskih znamenaka. Ukoliko učitane znamenke nisu različite, program treba ispisati poruku "Greska!" (bez navodnika).
Program treba ispisati sumu svih prirodnih brojeva čije su znamenke iz učitanog niza, te se ne ponavljaju unutar jednog broja.
Na primjer, za k = 2 i učitane brojeve 1 i 3, program ispisuje "48" (jer je 1+3+13+31=48).
Može pomoć ili hint u vezi funkcijskog dijela rješenja.
Napišite program koji učitava prirodni broj k < 9, te niz od k različitih dekadskih znamenaka. Ukoliko učitane znamenke nisu različite, program treba ispisati poruku "Greska!" (bez navodnika).
Program treba ispisati sumu svih prirodnih brojeva čije su znamenke iz učitanog niza, te se ne ponavljaju unutar jednog broja.
Na primjer, za k = 2 i učitane brojeve 1 i 3, program ispisuje "48" (jer je 1+3+13+31=4.
Može pomoć ili hint u vezi funkcijskog dijela rješenja.
|
|
[Vrh] |
|
Gino Forumaš(ica)
Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Gino Forumaš(ica)
Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Namdev Forumaš(ica)
Pridružen/a: 01. 11. 2011. (19:23:40) Postovi: (29)16
Spol:
|
Postano: 12:46 pon, 5. 3. 2012 Naslov: |
|
|
Ja sam napisao funkciju koja prima neki broj te tom broju dodaje članove niza kao zadnju znamenku, ako naravno to zadovoljava zadane uvjete, dodajem taj broj u sumu i ponovno pozivam funkciju koja sada prima taj dobiveni broj.
To je više kao hint, da ne napišem cijelu funkciju i što ona vraća, ako vraća, što prima na početku, uvjete, pomoćne funkcije, itd.
Ja sam napisao funkciju koja prima neki broj te tom broju dodaje članove niza kao zadnju znamenku, ako naravno to zadovoljava zadane uvjete, dodajem taj broj u sumu i ponovno pozivam funkciju koja sada prima taj dobiveni broj.
To je više kao hint, da ne napišem cijelu funkciju i što ona vraća, ako vraća, što prima na početku, uvjete, pomoćne funkcije, itd.
|
|
[Vrh] |
|
|