Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zasto ovo vraca beskonacnu petlju?

[es] :: C++ programiranje :: Zasto ovo vraca beskonacnu petlju?

Strane: 1 2

[ Pregleda: 966 | Odgovora: 20 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Zasto ovo vraca beskonacnu petlju?27.12.2006. u 12:07

Zato ovaj kod kada unesem neko slovo, a ne broj, upada u beskonacnu petlju?
I jos me naravno zato zanima kako to sprijecit?
Code:
#include <iostream.h>

int Ulog(){
    int ulog=0;
    do {        
        cout << endl << "Odaberite ulog izmedju [1] i [100]" << endl;
        cout << "->";
        cin  >> ulog;            
    }    
    while (ulog < 1 || ulog > 100);
        return ulog;
    }

int main() {
    Ulog();
    return 0;    
}

Hvala na pomoci!
...trying to do my best...
27.12.2006. u 12:07 

#Ninja#
Tuzla

Član broj: 28925
Poruke: 250
*.PPPoE-2767.sa.bih.net.ba.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?27.12.2006. u 15:28
Ako uneseš ulog između 1 i 100, ulaziš u beskonačnu petlju koja stalno vraća tu vrijednost. Pokušaj sa if -> else.
27.12.2006. u 15:28 

absBeg
BiH

Član broj: 97773
Poruke: 201
*.com
Via: [es] mailing liste



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?27.12.2006. u 15:54
>
kad uneses slovo onda comp prevede ASCI vrijednost tog slova koja je
vjerojatno preko 100. sjeti se da si rekao kompajleru da unosis int, a
ne char ;)
"I don't read books, but I have friends who do."
George W. Bush
27.12.2006. u 15:54 

SuPeR_MaSteR
Mladen Krstic
Loznica

Član broj: 88590
Poruke: 114
*.inffo.net.

Sajt: mladen.krsticc.net


Profil

icon Re: Zasto ovo vraca beskonacnu petlju?27.12.2006. u 19:00
Hm..Ne bih rekao.

Iteracija se odvija sve dok je ulog manji od 1 ili ulog veci od 100 i tek posle petlje se funkciji vraca vrednost varijable ulog.
A ako korisnik unese char umesto int dodela se uopste ne izvrsava, tj. varijabla ulog ce imati vrednost kakvu je imala pre dodele, a imala je:
Code:
int ulog=0;

Tako da je u slucaju unosenja slova, ovaj uslov ispunjen:
Code:
(ulog < 1 || ulog > 100)

Posto je varijabla ulog i dalje 0, petlja se ponavlja. U baferu se nalazi prethodni (nepravilan) unos tako da se automatski ponovo ucita u varijablu ulog, i ponavlja se ista prica..

Edit:
Ovako se nece javljati beskonacna petlja:
Code:

#include<cstdlib>
...
cin >> ulog;
if (cin.fail())
   break;
}
while (ulog < 1 || ulog > 100);
....


Ili jednostavno u definiciji funkcije pri deklarisanju varijable ulog, inicijalizuj je odmah (na primer) na 1.

[Ovu poruku je menjao SuPeR_MaSteR dana 27.12.2006. u 20:32 GMT+1]
Ako ne mozes da pobedis, mozes poraz da prihvatis kao deo procesa dobijanja.
27.12.2006. u 19:00 

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 880
*.plus.com.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?27.12.2006. u 19:45
Po 1000-ti put - Debugger is your friend!
27.12.2006. u 19:45 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 00:28
Hvala na pomoci! Pomoglo je rjesenje sa /cin.fail()/ samo sto jos onda nakon toga trebam napravit nekako da mi ponovno ispisuje ono sve za ponovan unos broja posto ovako ostane inicijalizirana vrijednost!
...trying to do my best...
28.12.2006. u 00:28 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 10:51
E ovako! Ipak nije pomoglo!

Dogadja se jedna vrlo zanimljiva stvar za raspravu. Nakon provjere // if(cin.fail()) // program se odvrti automatski do kraja bez vise ikakvih ponuda za unos. Mozda nisam jasan pa evo primjer.
Code:
#include <iostream>
using namespace std;

int Ulog(){
    int ulog=2;
    do {        
        cin  >> ulog;
        if (cin.fail())
        break;
    }    
    while (ulog < 1 || ulog > 100);
    return ulog;
    }

int main() {
    cout << endl << "Odaberite ulog izmedju [1] i [100]" << endl;
    cout << "->";
    cout << "Ulog je: " << Ulog() << endl;
    int novo;
    cout << "Ovdje se trebalo unijeti nesto novo!!!" << endl;
    cin >> novo;
    return 0;    
}


Ako unesem dobar broj ponudi mi da unesem i varijablu novo, a ako unesem neko slovo kao da red
// cin >> novo // ne postoji!
To mi i je u principu glavni problem jer ako slucajno na pocetku igre koju sam pravio unesem za ulog neko slovo vrti mi stalno cijelu igru sa default vrijednostima u beskonacnost!!
...trying to do my best...
28.12.2006. u 10:51 

SuPeR_MaSteR
Mladen Krstic
Loznica

Član broj: 88590
Poruke: 114
*.inffo.net.

Sajt: mladen.krsticc.net


Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 11:33
Evo ovako ce ti uvek ponuditi da uneses ponovo:
Code:

#include <iostream>
using namespace std;
int Ulog();
bool indikator = true;
int main()
{
    while (indikator)
    try
    {
        Ulog();
    }
    catch (char const *)
    {
        cin.clear();
        cout << "Nepravilan unos." << endl;
        indikator = true;
    }
    return 0;
}
int Ulog()
{
    int ulog = 0;
    cout << endl << "Odaberite ulog izmedju [1] i [100]" << endl;
    cout << "->";
    fflush(stdin);
    cin >> ulog;
    if (ulog < 1 || ulog > 100 || cin.fail())
        throw "error";
    indikator = false;
}

Ako ne mozes da pobedis, mozes poraz da prihvatis kao deo procesa dobijanja.
28.12.2006. u 11:33 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 11:41
Puno hvala na trudu! Sad je sve rijeseno i radi kako treba.

P.S.jel bi mi neko mogao kratko objasniti sta rade ove dvije naredbe

fflush(stdin); i cin.clear();


[Ovu poruku je menjao Ivan_HR dana 28.12.2006. u 13:57 GMT+1]

[Ovu poruku je menjao Ivan_HR dana 28.12.2006. u 14:19 GMT+1]
...trying to do my best...
28.12.2006. u 11:41 

absBeg
BiH

Član broj: 97773
Poruke: 201
*.com
Via: [es] mailing liste



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 12:59
>
Supermaster: U pravu si. U brzini sam zakljucio da je to greska, posto
je to cesta pojava. :D
"I don't read books, but I have friends who do."
George W. Bush
28.12.2006. u 12:59 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 14:37
Ajd da ne postavljam novu temu moze jos jedno kratko pitanje ovdje.

kako da mi neka petlja reagira na pritisak ENTER, ono da ne moram napisat 'y' pa stisnit enter nego da mi enter odmah znaci da je unos dobar???

ako koristim cin.peek() on reagira tek kad stisnem noko slovo pa onda iduci puta reagira na enter


[Ovu poruku je menjao Ivan_HR dana 28.12.2006. u 15:48 GMT+1]
...trying to do my best...
28.12.2006. u 14:37 

absBeg
BiH

Član broj: 97773
Poruke: 201
*.com
Via: [es] mailing liste



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 14:48
>
mozda preko?!
Code:
if (znak=='n')

"I don't read books, but I have friends who do."
George W. Bush
28.12.2006. u 14:48 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 15:02
To mi znaci da moram upisat 'n' da bi mi izvrsio ono sto je pod // if //
mene zanima kako da napravim da mi reagira na pritasak tipke ENTER znaci npr...
hocu napisat ovako nesta "Za nastavak pritisni ENTER" stisnem ENTER i program se nastavlja

bez unosa ikakvog drugog znaka.......
...trying to do my best...
28.12.2006. u 15:02 

absBeg
BiH

Član broj: 97773
Poruke: 201
*.com
Via: [es] mailing liste



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 15:24
>
oprosti, omaklo mi se slovo. mislio sam na 'n' (backslash + n) koji je
oznaka novog reda.
"I don't read books, but I have friends who do."
George W. Bush
28.12.2006. u 15:24 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 15:30
ne moze se tako napravit isprobao sam.........
...trying to do my best...
28.12.2006. u 15:30 

SuPeR_MaSteR
Mladen Krstic
Loznica

Član broj: 88590
Poruke: 114
*.inffo.net.

Sajt: mladen.krsticc.net


Profil

icon Re: Zasto ovo vraca beskonacnu petlju?28.12.2006. u 20:30
Code:

void ask()
{
    cout << "\nPress ENTER to continue";
    cin.get();
}

Mozes koristiti i ovo:
Code:
system("PAUSE");

Jednostavnije je ali zavisi od skoljke.

A sto se tice fflush(stdin) i cin.clear() sta mislis da bacis pogled na:
http://www.cplusplus.com/ref/


Ako ne mozes da pobedis, mozes poraz da prihvatis kao deo procesa dobijanja.
28.12.2006. u 20:30 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?29.12.2006. u 09:28
Citat:
SuPeR_MaSteR: A sto se tice fflush(stdin) i cin.clear() sta mislis da bacis pogled na:
http://www.cplusplus.com/ref/


Hvala za link tako nesta mi je trebalo..

Sto se tice ovog ostalog izgleda da se nismo razumjeli.. Ja sam mislio na ovakav primjer.. recimo da imam petlju u kojoj provjeravam dali su mi dobro unesene neke varijable, znaci ispisem ih na zaslonu i u slucaju da je sve dobro uneseno upisem 'y' pa enter naravno za potvrdu, u slucaju da nije dobro uneseno upisujem 'n' pa enter... e sada ja zelim da za krivi unos ostane sve isto no u slucaju da je sve u redu samo stisnem enter, znaci ne moram vise upisivat onaj 'y'. Dali je to moguce napravit??
...trying to do my best...
29.12.2006. u 09:28 

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 278
*.dynamic.sbb.co.yu.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?29.12.2006. u 17:36
Pokusao je covek dva puta, ali mu nesto ne ide :)

if(c == '\n') . . .

je trik koji ti treba

De si Deda...
29.12.2006. u 17:36 

Ivan_HR

Član broj: 87291
Poruke: 134
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?29.12.2006. u 22:14
stalno mi pisete jednu te istu stvar koja uopce ne radi...
ajd probaj ovo iskompajlirat pa vidi jel reagira na enter.......
Code:
#include <iostream>
using namespace std;

int main() {
    char znak;
    cin >> znak;
    if (znak == '\n') {
        cout <<"stiso si enter";
    }
    return 0;
}

ajd mi sad to obajsni..
...trying to do my best...
29.12.2006. u 22:14 

absBeg
BiH

Član broj: 97773
Poruke: 201
*.com
Via: [es] mailing liste



Profil

icon Re: Zasto ovo vraca beskonacnu petlju?30.12.2006. u 09:50
>
Ivane, poenta je sto koristis 'cin' koji je prilicno glup. Evo probao
sam tvoj kod sa "pametnom" cin.get() i fino radi. Staro je pravilo, a i
sala da cin jedino pravilno radi sa integerima :)

Code:
int main()
{
    char znak;
    cout << "Unesi neki znak: ";
    cin.get(znak);
    if (znak == 'n') {
        cout <<"stiso si enter";
    }
    else
        cout << "nista se nije dogodilo";

    return 0;
}

"I don't read books, but I have friends who do."
George W. Bush
30.12.2006. u 09:50 

[es] :: C++ programiranje :: Zasto ovo vraca beskonacnu petlju?

Strane: 1 2

[ Pregleda: 966 | Odgovora: 20 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.