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

Petlja i unos sa konzole

[es] :: C/C++ programiranje :: Petlja i unos sa konzole

[ Pregleda: 2671 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

CnD
Nenad Cocic
Indjija

Član broj: 16627
Poruke: 7
*.ptt.yu

ICQ: 24957640


Profil

icon Petlja i unos sa konzole25.02.2004. u 19:51 - pre 245 meseci
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

 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.beg.sezampro.yu



Profil

icon Re: Petlja i unos sa konzole25.02.2004. u 23:18 - pre 245 meseci
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.
 
Odgovor na temu

CnD
Nenad Cocic
Indjija

Član broj: 16627
Poruke: 7
195.252.101.*

ICQ: 24957640


Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 08:37 - pre 245 meseci
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
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 09:30 - pre 245 meseci
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;
}
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 09:57 - pre 245 meseci
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;
}
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 10:03 - pre 245 meseci
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.
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.beg.sezampro.yu



Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 10:27 - pre 245 meseci
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;
}

 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.beg.sezampro.yu



Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 10:31 - pre 245 meseci
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.
 
Odgovor na temu

CnD
Nenad Cocic
Indjija

Član broj: 16627
Poruke: 7
195.252.101.*

ICQ: 24957640


Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 11:18 - pre 245 meseci
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++.
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Petlja i unos sa konzole26.02.2004. u 15:27 - pre 245 meseci
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 ....
 
Odgovor na temu

[es] :: C/C++ programiranje :: Petlja i unos sa konzole

[ Pregleda: 2671 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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