C++ - ispunjavanje prvog uvjeta pod svaku cijenu

poruka: 14
|
čitano: 2.521
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
offline
C++ ispunjavanje prvog uvjeta pod svaku cijenu

#include <iostream>

#include <string>

 

using namespace std;

 

int main() {

 

string test;

 

cout << "Upisite ABC kako biste zavrsili zadatak";

cin >> test;

 

if(test == "ABC")

 

    cout << "Zadatak je izvrsen";

 

else

 

   cout << "Zadatak nije izvrsen";


system("pause");
return 0;
}

 

Ako ispunim prvi uvjet if zadatak se završava na onaj način na koji ja to želim i program se zatvara, ako upišem netočno zadatak se opet završava na način na koji to nisam htio ali program se opet zatvara

 

E sad, zanima me kako izvesti da se program ne završava / zatvara sve dok se prvi uvjet ne ispuni s tim da želim da me obavijesti ako nisam ispunio prvi uvjet?

 

 

Ne stavljajte ruku u ventilator dok ventilator radi. Upozorenje na klimatizacijskom uređaju
Poruka je uređivana zadnji put ned 31.10.2010 1:15 (lovac82).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
C++ jedno pitanje
while petlja :)
&lt;&lt;Karlovačko&gt;&gt;
Moj PC  
0 0 hvala 0
16 godina
offline
C++ jedno pitanje

Eh, do tog dijela još nisam došao pošto C++ učim tek 5-10 dana

Ne stavljajte ruku u ventilator dok ventilator radi. Upozorenje na klimatizacijskom uređaju
Moj PC  
0 0 hvala 0
16 godina
odjavljen
offline
RE: C++ ispunjavanje prvog uvjeta pod svaku cijenu

Testiranje stringova:

if ( stricmp(test, "ABC" ) == 0)

Heart: _/\_/\_/\_/\_/\_/\_/\_/\_ Brain: __________________________
16 godina
neaktivan
offline
RE: C++ ispunjavanje prvog uvjeta pod svaku cijenu
MrBlc kaže...

Testiranje stringova:

if ( stricmp(test, "ABC" ) == 0)

To je za C-ovske stringove (char*). U C++u postoji klasa string (koja se i koristi u kodu) i koja ima implementiran operator ==.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
offline
C++ - ispunjavanje prvog uvjeta pod svaku cijenu

Što se tiče stringa Luuka ti je dao najjednostavnije rješenje, a inače sve ove provjere unosa možeš postaviti do-while petljom, koja se vrti dok se ne zadovolji uvjet:

 

 

#include<iostream>
#include<string>
using namespace std;


#include<iostream>
#include<string>
using namespace std;


int main()
{
    string test;
    int n;
    do {
       n=0;
       cout<< "Unesi ABC: ";
       cin>> test;
       if(test != "ABC") {
          n=1;
          cout<< "Krivi unos!" << endl;
       }
       } while(n);
       cout<< "Ispravan unos!" << endl;
    }


         
      ova petlja se izvršava dok god je n=1    

 
0 0 hvala 1
16 godina
neaktivan
offline
RE: C++ - ispunjavanje prvog uvjeta pod svaku cije

Može to i bez n-a :D

 

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string test;
    do
    {
       cout<< "Unesi ABC: ";
       cin>> test;
       if(test != "ABC")
          cout<< "Krivi unos!" << endl;
       else
          cout<< "Ispravan unos!" << endl;

    } while(test != "ABC");
   
    system("pause");
    return 0;
}

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
offline
C++ - ispunjavanje prvog uvjeta pod svaku cijenu

da, sad ima sve da skuži rad do-while petlje i kako je upotrijebiti za kontrolu unosa

 
0 0 hvala 0
17 godina
moderator
online
RE: C++ - ispunjavanje prvog uvjeta pod svaku cije

Sad bi se moglo diskutirati koje je rjesenje bolje. Od ta dva, zapravo mislim da je bolje rjesenje s uvodjenjem dodatne varijable - naime, usporedba stringova tada se ne radi dvaput nego samo jednom, a na uvodjenje te varijable potrosi se minorna kolicina memorije.

 

Naravno, uvodjenje dodatne varijable bi trebalo korigirati - ovo je C++, a ne C, pa bi se trebao koristiti tip bool (velicine jednog bajta), a ne int (velicine 4 bajtova na 32-bitnim OS-evima). Takodjer, tu pomocnu varijablu bas i nema smisla nazvati n - zasto ne bi bila ispravno ili ispravanUnos ili OK ili tako nesto? Retoricko pitanje, naravno.

 

 

Inace, postoji i jos jedno rjesenje - niti se usporedba stringova radi dvaput, niti se uvodi dodatna varijabla. Tajna je "beskonacnoj petlji" i u rezerviranoj rijeci break:

 

#include<iostream>#include<string>using namespace std;
int main() {   string test;    while (true) {       cout << "Unesi ABC: ";       cin >> test;      
       if (test == "ABC") break;
       cout<< "Krivi unos!" << endl;    };   
    cout << "Ispravan unos!" << endl;}

 

Ovaj nacin nema ni jedan od dva prije navedenih nedostatka, jedino je pitanje smeta li vam to sto se prekida nekakav "normalan" tijek izvodjenja programa - dakle, rijec je o nekakvom filozofskom stavu - slicno kao goto naredba, iako je ovo blaza i bolja varijanta.

 

Osobno break, ako se pametno koristi, ne smatram losim. Recimo kod programa za racunanje prim brojeva, break je gotovo neizostavna naredba, jer u suprotnom bezveze vrtis unutarnju petlju ili moras raditi vrlo upitne stvari (rucno mijenjat iterator unutar for petlje). {#} U takvim slucajevima break smatram manjim zlom.

16 godina
neaktivan
offline
RE: C++ - ispunjavanje prvog uvjeta pod svaku cije

Slažem se s mbaksom, i ja sam mislio staviti beskonačnu petlju+break, i to često koristim, ali ovdje mi se činilo prikladnijim napraviti ovako da se vidi kako se do...while koristi, pošto je autor topica početnik u programiranju. Kad se nauče osnove i skuži kako sve funkcionira, onda je lako neku sitnicu popravit da bude brže, optimalnije, troši manje memorije itd.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put pon 1.11.2010 11:32 (Luuka).
17 godina
offline
C++ - ispunjavanje prvog uvjeta pod svaku cijenu

Ja više volim bez break naredbe, doduše ovdje se uvodi varijabla bool, a kod breaka se isto mora postaviti vrijednost bool-a

Mada je while(true) if(true) break; čisto "cool" rješenje

 

 

#include<iostream>
#include<string>
using namespace std;


int main()
{
    string test;
    bool provjera = true;
   
    while(provjera) {
       cout<< "Unesi ABC: ";
       cin>> test;
       if(test != "ABC")
          cout<< "Krivi unos!" << endl;
       else
          provjera = false;
    }
    cout<< "Ispravan unos!" << endl;;
}

Poruka je uređivana zadnji put pon 1.11.2010 13:59 (Floki).
 
0 0 hvala 0
17 godina
moderator
online
RE: C++ - ispunjavanje prvog uvjeta pod svaku cije
Luuka kaže...

Slažem se s mbaksom, i ja sam mislio staviti beskonačnu petlju+break, i to često koristim, ali ovdje mi se činilo prikladnijim napraviti ovako da se vidi kako se do...while koristi, pošto je autor topica početnik u programiranju. Kad se nauče osnove i skuži kako sve funkcionira, onda je lako neku sitnicu popravit da bude brže, optimalnije, troši manje memorije itd.

Da me se krivo ne shvati - ja sam protiv beskonacnih petlji i inace ih nikad ne koristim. Smatram da je break u odredjenim situacijama dobro koristiti za prekidanje "konacnih" petlji (while kod kojeg postoji uvjet koji ce omoguciti izlazak iz petlje ili pak kao u slucaju odredjivanja prim brojeva - dvije for petlje, jedna unutar druge). Gornji primjer sam dao samo kao jednu mogucnost, ali smatram da je za spomenuti problem najbolje rjesenje uvodjenje dodatne bool varijable - dakle, nesto kao sto je Floki to napravio.

 

Petlje while ili do-while se lijepo demonstriraju i na toj bool varijabli - nema potrebe istu provjeru (jednakost stringova - znaci, mora se ici znak po znak i provjeravati jesu li jednaki - jos je gore ako usporedba mora biti case sensitive) raditi i kod while uvjeta - tim vise sto je autor pocetnik - treba mu odmah pozornost skrenuti na to da bezveze dvaput radi istu stvar. {#}

14 godina
neaktivan
offline
C++ - ispunjavanje prvog uvjeta pod svaku cijenu
Sto je tako lose kod beskonacih petlji?Ja ih jako cesto koristim...
prof.dr.ing.sc.
Moj PC  
0 0 hvala 0
17 godina
moderator
online
RE: C++ - ispunjavanje prvog uvjeta pod svaku cije

Beskonacna petlja cesto je rezultat greske programera (programer postavi uvjet koji ce preknuti petlju, ali je pogresno formulirao uvjet pa se on nikad ne ispunjava). Dakle, cesce je u pitanju bug, nego da se stvarno zeli napraviti beskonacna petlja. Naravno, tome bi trebalo izuzeti loopove u kojima se love eventi poput klika misem ili pritiska tipke na tipkovnici i iz kojih ce se nasilno izaci naredbama return ili break. Takav je zapravo i onaj moj primjer - iako je u slucaju petlje to infinite loop, u realnosti nije, jer postoji tocno odredjen uvjet koji ce prekinuti daljnje izvrsavanje petlje. Samo sto se uvjet ne ispituje na "regularan nacin".

 

U osnovi, bilo pravi infinite loopovi ili ovakvi nazivno infinite loopovi a u stvari se prekidaju returnom ili breakeom, u mnogim su slucajevima losa programerska praksa jer ruse strukturu programa/funkcije. Drugim rijecima, funkcija tada nema neki svoj prirodni tijek koji si oblikovao kontrolama tijeka (if-ovima, switchevima, for i while petljama), nego jednostavno nasilno prekidas petlju ili funkciju kad ti se sprdne. Ako vise takvih stvari napravis u jednoj funkciji, onda ti moze i tesko biti pratiti sto se u funkciji doista dogadja, odnosno kako zaista ide tijek programa - na primjer, ako si pogresno formulirao uvjet za break ili return, mozda ni neces biti svjestan da prekidas petlju ili funkciju i za one slucajeve za koje si htio da petlja/funkcija prodju do kraja.

 

Suma sumarum: nemoj krsiti normalan tijek programa ako to nije opravdano. Kod racunanja prim brojeva to je opravdano. Kod one funkcije koju sam napisao - s obzirom da je tako jednostavna, moglo bi se mozda smatrati opravdanim (ako ti nesto znaci onaj jedan bajt memorije za pomocnu varijablu), iako mislim da je bolji nacin s pomocnom varijablom.

 

Ako imas potrebe cesto raditi infinite loopove, onda ti samo mogu reci da nisi dobro naucio programirati, da si usvojio pogresne koncepte. Vjerujem da to cesto rade ljudi koji su poceli s QBasicom gdje se GOTO naredba smatra najnormalnijom pojavom. Osobno sam i sam poceo s QBasicom, ali se nisam dugo zadrzao, nego sam poceo raditi u Turbo Pacalu. Kako sam samouk, a u to vrijeme prakticki nije bilo Interneta, te u primjerima koji su dolazili s Turbo Pascalom nisam nailazio na GOTO naredbe, nisam ni znao kako napraviti GOTO u Pascalu. To mi je ispocetka zadavalo puno glavobolje jer sam navikao na to u QBasicu, ali sto dalje radis, to vise vidis da ti GOTO uopce ne treba. Jednostavno se naucis kako pravilno oblikovati if/switch/for/while (dakle, das programu neku korektnu hijerarhijsku strukturu) i zaboravis da si ikad cuo za GOTO naredbu. A i za infinite loopove.

 

 

Kazes da cesto koristis beskonacne petlje - mozes objasniti, na primjerima, gdje ih koristis? I zbog cega ne mozes umjesto beskonacne napraviti konacnu petlju?

 

 

 

PS Evo jedne sale vezane uz beskonacnu petlju: A standard joke has been made about each generation's exemplar of the ultra-fast machine: "The Cray-3 is so fast it can execute an infinite loop in under 2 seconds!"

 

 

Poruka je uređivana zadnji put sri 3.11.2010 1:22 (mbaksa).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice