[ CnD @ 25.02.2004. 19:51 ] @
Poceo sam da ucim c++ koristeci dev c++ i neki pdf c++ za 21 dan i posle nekoliko lekcija sam naleteo na neki glup problem koji ne mogu da resim.
Ovo je veoma obican primer, hteo sam samo da posle citanja isprobam malo c++ da vidim kako rade nake osnovne stvari... Primer je unosenje broja od 1 do 1000 kroz loop koji treba da se vrti dok se ne unese pravilno.

#include <iostream.h>
int main()
{
int broj;
do
{
cout << "\nUnesi broj od 1 do 1000: ";
cin >> broj;
} while ((broj<1) || (broj >1000));
cout << broj;
return 0;
}

Problem je ako se slucajno unese string ili broj izvan intervala tipa int loop se vrti beskonacno i svaki put preskace red za unos...Nisam uspeo to da resim. U cemu je problem, da li je compiler iz dev c++ los ili moram nesto drugacije da uradim?

Cole

[ Milan Aksic @ 25.02.2004. 23:18 ] @
U cin-u (stdin) ostaje '\n' (prevodi se u '\0') nakon unosa, zbog cega se "preskace" cin >> broj;.
Zapravo, ne preskace se izvrsavanje same linije kooda, vec cin "dobije" '\0', kao kraj, praznog stringa, zaostalog u stdin-u iz prethodnog unosa, i ne menja promenljivu "broj", koja i dalje sadrzi broj izvan opsega u while petlji.
[ CnD @ 26.02.2004. 08:37 ] @
A kako da nateram cin da proradi ponovo. Da li postoji neka kontrola greske pomocu koje bih mogao da prepoznam da je unet string? Voleo bih da resim ovaj problem sto pre, posto mi se svideo c++ a vec neko vreme sam zaglavio na ovom problemu...


cole
[ Reljam @ 26.02.2004. 09:30 ] @
Nazalost, ne mogu da ti pomognem sa cin i cout jer ne znam nista o njima, ali mogu da ti preporucim da ih ne koristis vec da pogledas printf i scanf. Cin i cout su vrlo lepe ideje ali nazalost nisu bas najsrecnije realizovane, i generalno su vise muka nego koristi.

Tvoj program bi sa printf izgledao ovako:

Code:

#include <stdio.h>

int main()
{
    int broj;
    do
    {
        puts("Unesi broj od 1 do 1000: ");
        scanf("%d", &broj);
    } while ((broj<1) || (broj >1000));

    printf("%d", broj);
    return 0;
}
[ idb @ 26.02.2004. 09:57 ] @
Problem nije tako velik, pošto ti nula "0" ne utiče na rezultat.
Ja nemam problema sa cin i cout, šta više samo njh i koristim. Evo ti dole dve mogućnosti, pa biraj koja ti se više sviđa.
Code:
#include <iostream>
#include <sstream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
    int broj;
    char ulaz[100];
    // 1: BEZ koriscenja string stream class 
    broj=-1;
    do {
        cout << "\nUnesi broj od 1 do 1000: ";
        cin.getline(ulaz,100);
        cout<<"\nUcitano: "<<ulaz<<"\n";
        broj=atoi(ulaz);
    }while ((broj<1) || (broj>1000));
    cout << " broj = "<< broj<<"\n";
    cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
    // 2: SA koriscenja string stream class 
    broj=-1;
    while ((broj<1) || (broj>1000))
     {
        cout << "\nUnesi broj od 1 do 1000: ";
        cin.getline(ulaz,100);
        cout<<"\nUcitano: "<<ulaz<<"\n";
        istringstream iss(ulaz, istringstream::in);    
        iss>>broj;
    }
    cout << " broj = "<< broj<<"\n";
    system("PAUSE");    
    return 0;
}
[ idb @ 26.02.2004. 10:03 ] @
Izvinjavam se što moram samog sebe da dopunim.
Drugi tip petlje u drugom primeru nije zato što to string stream klasa zahteva, nego zato što ja tu petlju češće koristim.
[ Milan Aksic @ 26.02.2004. 10:27 ] @
Citat:
Reljam:
Nazalost, ne mogu da ti pomognem sa cin i cout jer ne znam nista o njima, ali mogu da ti preporucim da ih ne koristis vec da pogledas printf i scanf. Cin i cout su vrlo lepe ideje ali nazalost nisu bas najsrecnije realizovane, i generalno su vise muka nego koristi.

Tvoj program bi sa printf izgledao ovako:
Code:

...


Ja sam i hteo da predlozim u pocetku ovaj program u C-u, ali nisam hteo da rizikujem da opet pocinjemo raspravu o tome dali je za pocetnika "generalno dobro" ili "generalno lose" da pocinje sa C-om ako ima namere da nauci i C++ :)
Mada, moram napomenuti da ni ovaj primer ne radi u potpunosti kako treba, jer ako se unese string "blabla" opet se ulazi u beskonacnu petlju. Mala dopuna:
Code:

#include <stdio.h>

int main()
{
        int broj;
        char cr;
        do
        {
                puts("Unesi broj od 1 do 1000: ");
                scanf("%d", &broj);
                scanf("%c", &cr);
        } while ((broj<1) || (broj >1000));

        printf("%d", broj);
        return 0;
}

[ Milan Aksic @ 26.02.2004. 10:31 ] @
Citat:
idb:
Problem nije tako velik, pošto ti nula "0" ne utiče na rezultat.
Ja nemam problema sa cin i cout, šta više samo njh i koristim. Evo ti dole dve mogućnosti, pa biraj koja ti se više sviđa.
Code:

...

Opet bih samo napomenuo (ako je to uopste bitno u ovom slucaju) da ova dva primera "rade korektno" samo dok se ne unese string od >100 karaktera, u suprotnom, ponasaju se kao i prvi primer (ulazi se u beskonacnu petlja).
Na zalost (ili na srecu :)) ni ja ne radim puno sa c++ "cin/cout) strimovima, medjutim, koliko se secam, postoji funckija clanica "ignore" koja (naravno :)) ignorise odredjeni broj karaktera u ulaznom strimu dok ne naidje na zadani karakter.
Znaci nesto kao:
Code:
cin.ignore(255, '\n');

Ovde ce "cin" odbaciti onoliko karaktera (najvise 255) dok ne naidje na '\n' a onda i sam "new line" karakter.
[ CnD @ 26.02.2004. 11:18 ] @
Hvala na ovome, trenutno sam na poslu, ali cim dodjem kuci bacam se na c++. Dugo vremena sam planirao da pocnem da ga ucim i sad kada sam krenuo, odusevljen sam.... Radio sam ranije u Pascalu, VB, Delphi, da ne pominjem c64 - basic+asembler :) i svidja mi se dataljan pristup svemu u c++.
Da upitam jos nesto, koristim dev c++, da li je on ok ili mi preporucujete neki drugi paket za c++.
[ idb @ 26.02.2004. 15:27 ] @
Citat:
Opet bih samo napomenuo (ako je to uopste bitno u ovom slucaju) da ova dva primera "rade korektno" samo dok se ne unese string od >100 karaktera, u suprotnom, ponasaju se kao i prvi primer (ulazi se u beskonacnu petlja).

Evo malkice da ispravim ogranicenje od 100 karaktera, mislio sam da je 100 dovoljno, pod uslovom da neko na zaboravi prst na tastaturi :)
Code:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
    int broj;
    char *ulaz;
    broj=-1;
    do {
        cout << "\nUnesi broj od 1 do 1000: ";
        cin>>ulaz;
        broj=atoi(ulaz);        
            cout<<"   Prihvaceno sa ulaza: "<<ulaz<<"\n";
    } while ((broj<1) || (broj>1000));
    cout << "broj = "<< broj<<"\n";
    system("PAUSE");    
    return 0;
}

Citat:

Da upitam jos nesto, koristim dev c++, da li je on ok ili mi preporucujete neki drugi paket za c++.

Ja koristim Dev-Cpp, nesto vise od godinu dana. Medju besplatnim resenjima on je najbolji, i ima siroku lepezu prosirenja (*.DevPack).
Mozda bi dosli u obzir jos i MinGW Developer Studio, ili Visual-MinGW ali njih nisam probao, mozes ih potraziti na internetu, pa ako ti odgovaraju ....