Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Opako pitanje
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Ongo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2006. (14:37:33)
Postovi: (23)16
Sarma = la pohva - posuda
= 6 - 3

PostPostano: 17:55 sri, 10. 5. 2006    Naslov: Opako pitanje Citirajte i odgovorite

Hmm... Nisam siguran da bih to ovdje trebao pitati... Stovise nisam uopce siguran bih li to trebao pitati, ali to me nitko nije naucio ni na predavanjima ni na vjezbama, a cini mi se da ni nece, pa cu ipak pitati.

So... Recimo da hocu ucitati broj. E sad, ja hocu biti extra pedantan (a ne samo my usual pedantan), pa hocu da se korisnik informira ukoliko unese nesto sto nije broj. Stovise jos hocu da mu se pruzi druga prilika u tom nesretnom slucaju. Ideja (za sada losa):

[code:1]int i;
while(!scanf("%d",&i))
printf("Treba unijeti broj!");
[/code:1]

Problem je u tome sto se scanf, kad jedamput ne uspije ucitati unos, tj. kad jedamput vrati 0, 'ugasi' tj. nakon toga vise ni ne pokusava ista ucitati, uopce se ne izvrsava, nego samo vraca 0.

Pitanja:
Zasto nastaje taj problem? (ima li veze s strerr?)
Kako ga izbjeci? (kako resetirati strerr, ukoliko sam na pravom putu?)
Hmm... Nisam siguran da bih to ovdje trebao pitati... Stovise nisam uopce siguran bih li to trebao pitati, ali to me nitko nije naucio ni na predavanjima ni na vjezbama, a cini mi se da ni nece, pa cu ipak pitati.

So... Recimo da hocu ucitati broj. E sad, ja hocu biti extra pedantan (a ne samo my usual pedantan), pa hocu da se korisnik informira ukoliko unese nesto sto nije broj. Stovise jos hocu da mu se pruzi druga prilika u tom nesretnom slucaju. Ideja (za sada losa):

Kod:
int i;
while(!scanf("%d",&i))
   printf("Treba unijeti broj!");


Problem je u tome sto se scanf, kad jedamput ne uspije ucitati unos, tj. kad jedamput vrati 0, 'ugasi' tj. nakon toga vise ni ne pokusava ista ucitati, uopce se ne izvrsava, nego samo vraca 0.

Pitanja:
Zasto nastaje taj problem? (ima li veze s strerr?)
Kako ga izbjeci? (kako resetirati strerr, ukoliko sam na pravom putu?)


[Vrh]
Korisnički profil Pošaljite privatnu poruku
pbanicev
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 23. 10. 2004. (19:32:44)
Postovi: (52)16
Spol: muško
Sarma = la pohva - posuda
= 4 - 0
Lokacija: /dev/random V /dev/null V /dev/zero

PostPostano: 18:34 sri, 10. 5. 2006    Naslov: Citirajte i odgovorite

$ man scanf

***

RETURN VALUES
If the input ends before the first conflict or conversion, EOF is
returned. Otherwise, these functions return the number of
successfully assigned input items. This number is a short count, or
even zero if a conflict ensues between an input character and the
control string.

***

tj, treba se uzeti neku drugu funkciju :wink: , a ako takve nema, treba napisati novu.

HINT: neka funkcija uzima char po char iz inputa i onda provjerava njen ascii kod
$ man scanf

***

RETURN VALUES
If the input ends before the first conflict or conversion, EOF is
returned. Otherwise, these functions return the number of
successfully assigned input items. This number is a short count, or
even zero if a conflict ensues between an input character and the
control string.

***

tj, treba se uzeti neku drugu funkciju Wink , a ako takve nema, treba napisati novu.

HINT: neka funkcija uzima char po char iz inputa i onda provjerava njen ascii kod



_________________
vim vim vim
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail Posjetite Web stranice
Zvone
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 07. 2003. (13:09:44)
Postovi: (9D)16
Sarma = la pohva - posuda
67 = 74 - 7

PostPostano: 9:01 čet, 11. 5. 2006    Naslov: Citirajte i odgovorite

Pitanje je sasvim na mjestu :)
Problem je u slijedecem: nakon sto se liniji [tt]scanf ("%d", &i);[/tt] unese nesto sto nije broj, to nesto ostane u [i]input bufferu[/i]. Kada se ponovno pozove [tt]scanf ("%d", &i);[/tt] ili bilo koja druga funkcija za citanje ulaza, ona nece traziti novi ulaz od korisnika ako vec nesto ima u [i]input bufferu[/i] vec ce prvo citati iz njega.

Sada je jasno zbog cega se Ongov kod vrti u beskonacnoj petlji.
Da se to popravi treba nakon neuspjesnog citanja int-a pocistiti buffer, tako da npr. procitamo sve znakove do kraja retka:

[code:1]int i;
while (!scanf("%d", &i))
{
printf ("Treba unijeti broj!");
scanf ("%*[^\n]");
}[/code:1]

Umjesto [tt]scanf ("%*[^\n]");[/tt] moze i [tt]fgets[/tt] ili petlja u kojoj [tt]getchar[/tt] cita sve do kraja retka.

[tt]fflush(stdin)[/tt] ne radi.
Pitanje je sasvim na mjestu Smile
Problem je u slijedecem: nakon sto se liniji scanf ("%d", &i); unese nesto sto nije broj, to nesto ostane u input bufferu. Kada se ponovno pozove scanf ("%d", &i); ili bilo koja druga funkcija za citanje ulaza, ona nece traziti novi ulaz od korisnika ako vec nesto ima u input bufferu vec ce prvo citati iz njega.

Sada je jasno zbog cega se Ongov kod vrti u beskonacnoj petlji.
Da se to popravi treba nakon neuspjesnog citanja int-a pocistiti buffer, tako da npr. procitamo sve znakove do kraja retka:

Kod:
int i;
while (!scanf("%d", &i))
{
    printf ("Treba unijeti broj!");
    scanf ("%*[^\n]");
}


Umjesto scanf ("%*[^\n]"); moze i fgets ili petlja u kojoj getchar cita sve do kraja retka.

fflush(stdin) ne radi.


[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Ongo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2006. (14:37:33)
Postovi: (23)16
Sarma = la pohva - posuda
= 6 - 3

PostPostano: 13:17 čet, 11. 5. 2006    Naslov: Citirajte i odgovorite

pbanicev thx, ali to nisam pitao; znam sto i zasto scanf vraca.

Zvone, to mi je odgovor. Dapace, to su mi oba odgovora. Puno hvala.
pbanicev thx, ali to nisam pitao; znam sto i zasto scanf vraca.

Zvone, to mi je odgovor. Dapace, to su mi oba odgovora. Puno hvala.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
pbanicev
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 23. 10. 2004. (19:32:44)
Postovi: (52)16
Spol: muško
Sarma = la pohva - posuda
= 4 - 0
Lokacija: /dev/random V /dev/null V /dev/zero

PostPostano: 13:24 čet, 11. 5. 2006    Naslov: Citirajte i odgovorite

OK, pogrijesio sam, onaj moj hint nije nimalo elegantan, ali ipak sto ako sam ja recimo samo za primjer pedantniji od recimo Onga i umjesto sto upisem:

fasdjklfj24

upisem

24dfa66

tada scanf uzima samo prve dvije znamenke no ono gore nije cijeli broj :twisted:
OK, pogrijesio sam, onaj moj hint nije nimalo elegantan, ali ipak sto ako sam ja recimo samo za primjer pedantniji od recimo Onga i umjesto sto upisem:

fasdjklfj24

upisem

24dfa66

tada scanf uzima samo prve dvije znamenke no ono gore nije cijeli broj Twisted Evil



_________________
vim vim vim
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan