[ Ivan_HR @ 27.12.2006. 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!
[ #Ninja# @ 27.12.2006. 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.
[ absBeg @ 27.12.2006. 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 ;)
[ SuPeR_MaSteR @ 27.12.2006. 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]
[ NastyBoy @ 27.12.2006. 19:45 ] @
Po 1000-ti put - Debugger is your friend!
[ Ivan_HR @ 28.12.2006. 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!
[ Ivan_HR @ 28.12.2006. 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!!
[ SuPeR_MaSteR @ 28.12.2006. 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;
}
[ Ivan_HR @ 28.12.2006. 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]
[ absBeg @ 28.12.2006. 12:59 ] @
>
Supermaster: U pravu si. U brzini sam zakljucio da je to greska, posto
je to cesta pojava. :D
[ Ivan_HR @ 28.12.2006. 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]
[ absBeg @ 28.12.2006. 14:48 ] @
>
mozda preko?!
Code:
if (znak=='n')
[ Ivan_HR @ 28.12.2006. 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.......
[ absBeg @ 28.12.2006. 15:24 ] @
>
oprosti, omaklo mi se slovo. mislio sam na 'n' (backslash + n) koji je
oznaka novog reda.
[ Ivan_HR @ 28.12.2006. 15:30 ] @
ne moze se tako napravit isprobao sam.........
[ SuPeR_MaSteR @ 28.12.2006. 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/

[ Ivan_HR @ 29.12.2006. 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??
[ DjoleReject @ 29.12.2006. 17:36 ] @
Pokusao je covek dva puta, ali mu nesto ne ide :)

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

je trik koji ti treba
[ Ivan_HR @ 29.12.2006. 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..
[ absBeg @ 30.12.2006. 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;
}
[ Ivan_HR @ 31.12.2006. 10:42 ] @
e to je ono sto sam trazio..
puno hvala na pomoci