Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ongelma ehtolauseessa

Sivun loppuun

Azure [22.04.2007 01:27:30]

#

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...)

Blaze [22.04.2007 02:45:31]

#

Jälkimmäisen iffin pitäis olla else if.

Metabolix [22.04.2007 19:21:41]

#

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.

Azure [22.04.2007 21:19:40]

#

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ä?

TsaTsaTsaa [22.04.2007 23:23:17]

#

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ä.

Grez [22.04.2007 23:55:38]

#

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.

tgunner [23.04.2007 11:01:48]

#

Onko koodin tarkoitus kumminkin käyttää loogista operaattoria "ja"?

os [23.04.2007 11:50:15]

#

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.

tgunner [23.04.2007 14:47:26]

#

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.

koo [23.04.2007 14:47:50]

#

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";
}

os [23.04.2007 16:30:12]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta