Tuossa piti lopuksi vielä virittää tuollainen hömpötys:
#include<iostream> #include <cstdlib> using namespace std; void ProfileJ() { system ("cls"); cout <<"PROFILE: Jukka" << endl; cout << "--------------------" "--------------------" "--------------------" "-------------------" << endl; } void ProfileT() { system ("cls"); cout <<"PROFILE: Test" << endl; cout << "--------------------" "--------------------" "--------------------" "-------------------" << endl; } int main() { int a,b,c,d; cout <<" Welcome to the my Profile" << endl; cout <<" -------------------------" << endl; cout <<" PINCODE: "; cin >> a >> b >> c >> d; if (a==4 & b==3 & c==2 & d==1) { cout << "Access granted"<<endl<<endl; ProfileT(); } if (a==1 & b==2 & c==3 & d==4) { cout << "Access granted"<<endl<<endl; ProfileJ(); } else cout << "Access denied"<<endl<<endl; }
Ohjelmaan syötetään salasana ja kun ohjelma on tarkistanut sen se joko avaa jonku profiilin tai sanoo että pääsy evätty(access denied). Miten tuo "access denied" toiminto saadaan toimimaan, eli miten estän ohjelmaa suorittamasta sitä jos salasana menee oikein? En löytäny mitään ratkaisua?
(Mod. Edit. Jos saisi pyytää hieman katkomaan niitä rivejä tänne foorumille, ettei leiska hajoa...)
Jälkimmäisen iffin pitäis olla else if.
Lisäksi suosittelisin &:n paikalle &&:ta, kun on kyse loogisesta operaatiosta (siis totuusarvojen kesken). Myöskin nyt siis koodi pitää antaa välein eroteltuna, jotta kukin numero tulisi erikseen, onko tämä varmasti tarkoitus? Jospa lukisit vain yhden luvun ja tarkistaisit sen oikeellisuuden.
Omassa kirjassani mistä luen C++ ohjelmointia en ole löytäny tätä "else if" systeemiä, olen kyllä itse ihmetelly sitä. Miten se eroaa normaali else-rakenteesta ja milloin sitä tulisi yleensä käyttää. Voisiko joku selittää vielä?
Tuossa sinun koodissasi nyt ensin ekalla iffillä tarkistetaan, onko PIN 4321 ja jos on tehdään jotain ja sen jälkeen joka tapauksessa toisessa iffissä tarkastetaan onko PIN 1234. Mutta jos jälkimmäinen if olisi else if niin sitten sitä ehtoa testattaisiin vain jos ensimmäinen ei toteudu.
Väsyttää, sekavaa tekstiä.
Ei C:ssä olekaan else if rakennetta, se on aivan normaali if ... else -rakenne, jonka else-haaraan on laitettu toinen if ... else rakenne.
Eli jos siihen laittaisi selkeyden vuoksi kaarisulut niin se näyttäisi tältä
if (a==4 & b==3 & c==2 & d==1) { cout << "Access granted"<<endl<<endl; ProfileT(); } else { if (a==1 & b==2 & c==3 & d==4) { cout << "Access granted"<<endl<<endl; ProfileJ(); } else { cout << "Access denied"<<endl<<endl; } }
Aika usein on tapana jättää tuon elsen lauseen kaarisulut pois jos lause koostuu yksinomaan if ... else rakenteesta. Jopa sellaisetkin ihmiset jotka yleensä itkevät yhden komennon kirjoittamisesta ilman kaarisulkuja tekevät usein niin.
Onko koodin tarkoitus kumminkin käyttää loogista operaattoria "ja"?
TGunner kirjoitti:
Onko koodin tarkoitus kumminkin käyttää loogista operaattoria "ja"?
Tässä tapauksessa on sama, kumpaa operaattoria käyttää. ==-operaattori palauttaa joko arvon 1 tai 0 riippuen vertailun tuloksesta ja näiden tulosten bitittäinen &-operaatio palauttaa saman tuloksen kuin looginen &&-operaatio.
os kirjoitti:
Tässä tapauksessa on sama, kumpaa operaattoria käyttää. ==-operaattori palauttaa joko arvon 1 tai 0 riippuen vertailun tuloksesta ja näiden tulosten bitittäinen &-operaatio palauttaa saman tuloksen kuin looginen &&-operaatio.
Ahaa! Kiitos tiedosta. Tuo tuli uutena.
Vaikka bitti-ja ja looginen-ja antavat justiinsa tässä tapauksessa saman tuloksen, kannattaa silti käyttää loogista ja:ta. Metabolix jo kertoi miksi.
Stringien käyttö voisi tehdä näistä kovakoodatuista pin:eistä pikkuisen simppelimpää.
cout << "PINCODE: "; string pin; cin >> pin; if (pin == "4321") { cout << "Access granted\n\n"; ProfileT(); } else if (pin == "1234") { cout << "Access granted\n\n"; ProfileJ(); } else { cout << "Access denied\n\n"; }
Samat tuloksethan johtuvat tässä tapauksessa siitä, että &-operaatio on C:n laskujärjestyksessä hämäävästi ==-operaation alapuolella eli ohjelma laskee ko. lausekkeen seuraavasti:
( (a==4) & (b==3) & (c==2) & (d==1) ) != 0
eikä kuten voisi luulla:
( a == (4 & b) == (3 & c) == (2 & d) == 1 ) != 0
,
mikä taas tarkoittaisi täysin eri asiaa. Sekaannusten välttämiseksi kannattaa tosiaankin käyttää loogista &&-operaattoria "loogisissa" vertailuissa. Esimerkiksi vertaillessa lausekkeita nollaan & ja && palauttavat eri tuloksen:
(a && b)!=0
on sama kuin (a!=0 & b!=0)!=0
, mutta ei (a & b)!=0
.
Aihe on jo aika vanha, joten et voi enää vastata siihen.