Yritän tehdä yksinkertaista ohjelmaa, jota en saa toimimaan. Ohjelman idea on seuraava:
- Ohjelma kysyy käyttäjältä taikasanaa (Simsalabim)
- Käyttäjä syöttää sanan
- Ohjelma pyytää käyttäjää syöttämään oikean sanan yhä uudestaan ja uudestaan, kunnes käyttäjä syöttää oikean sanan, jonka jälkeen ohjelma sulkeutuu.
Koodi toimii, mutta en saa ohjelmaa tunnistamaan taikasanaa sekä isolla että pienellä kirjoitettuna. Missä vika?
#include <iostream> #include <string> using namespace std; int main() { string taikasana; cout << "Sano taikasana: "; cin >> taikasana; if (taikasana == "Simsalabim" || taikasana == "simsalabim") { cout << "Oikea vastaus!" << endl; system("pause"); return 0; } else do { cout << "Väärin! Yritä uudelleen: "; cin >> taikasana; } while (taikasana != "Simsalabim"||taikasana != "simsalabim"); cout << "Oikea vastaus!" << endl; system("pause"); return 0; }
SukaBljat kirjoitti:
while (taikasana != "Simsalabim"||taikasana != "simsalabim")
Ehtosi while-silmukassa on nyt ”ei isolla TAI ei pienellä”. Näistähän jompikumpi pätee aina, koska jos salasana on isolla, se ei ole pienellä, ja päinvastoin. Oikea ehto while-silmukkaan olisi ”ei isolla JA ei pienellä” tai vaihtoehtoisesti ”ei (isolla tai pienellä)”.
while (taikasana != "Simsalabim" && taikasana != "simsalabim")
while (!(taikasana == "Simsalabim" || taikasana == "simsalabim"))
Metabolix kirjoitti:
(26.09.2017 16:40:08): ”– –” Ehtosi while-silmukassa on nyt ”ei isolla TAI...
Kiitos!!! Yleensä koodi menee pieleen aina jossakin pienessä yksytyiskohdassa, jota ei tajua, kuten tässä!
Sinänsähän tuossa on tuo vertailu aivan tarpeettomasti tehty kahteen kertaan. Saman asian tekeminen moneen kertaan lisää turhia virheen mahdollisuuksia..
#include <iostream> #include <string> using namespace std; int main() { string taikasana; cout << "Sano taikasana: "; cin >> taikasana; while (taikasana != "Simsalabim" && taikasana != "simsalabim") { cout << "Väärin! Yritä uudelleen: "; cin >> taikasana; } cout << "Oikea vastaus!" << endl; system("pause"); return 0; }
Netissä varoitellaan using namespace std:n käytöstä: https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice
Grez kirjoitti:
(26.09.2017 21:11:35): Sinänsähän tuossa on tuo vertailu aivan...
Tuo ei jostain syystä toimi mulla. Kirjoitan väärän sanan, painan ENTER ja ohjelma menee jumiin.
SukaBljat kirjoitti:
Tuo ei jostain syystä toimi mulla.
Kyllä se toimii.
Alkuperäisessä vähän samantapaisessa koodissasi (jonka jo poistit) oli vikana se, että et lukenut sanaa uudestaan silmukan sisällä.
Metabolix kirjoitti:
SukaBljat kirjoitti:
Tuo ei jostain syystä toimi mulla.
Kyllä se toimii.
Alkuperäisessä vähän samantapaisessa koodissasi (jonka jo poistit) oli vikana se, että et lukenut sanaa uudestaan silmukan sisällä.
Juu, tajusin sen ja korjasin sen.
Tosiaan hänellä oli yksi puolipiste tuon while()-lausekkeen perässä minkä takia tuo koodi ei toiminut. Huomasin sen vasta nyt ja sain sen toimimaan.
Yksi muutos tähän koodiin tarvitsisi vielä tehdä. Nimittäin siinä tapauksessa, jos käyttäjä syöttääkin vaikkapa sanan "Alakazam", joka ei siis ole vaadittu taikasana, niin ohjelma vastaakin siihen eri tavalla.
#include <iostream> #include <string> using namespace std; int main() { string taikasana; cout << "Sano taikasana: "; cin >> taikasana; while (taikasana != "Simsalabim" && taikasana != "simsalabim") { if (taikasana == "Alakazam" || taikasana == "alakazam") { cout << "Hyvä yritys mutta väärin. Yritä uudelleen: "; cin >> taikasana; } else cout << "Väärin! Yritä uudelleen: "; cin >> taikasana; } cout << "Oikea vastaus!" << endl; system("pause"); return 0; }
Tämä ratkaisu ei toimi täydellisesti, koska jos kirjoitan vastaukseksi "Alakazam", niin joudun kirjoittamaan sen jälkeen jostain syystä kahdesta uuden vastauksen, ennen kuin ohjelma sen lukee. Pitäisikö tämä toteuttaa jotenkin Switch-lausekkeella?
EDIT: Ja kun lisään continue; tuonne if-lausekkeen loppuun, niin se toimii...
Olet unohtanut merkitä else-lohkon suluilla, jolloin else kattaa vain cout-rivin ja cin-rivi ajetaan joka tapauksessa. Toisaalta cin-rivi on turha toistaa, eli voisit ottaa if-lohkosta cin-rivin pois. Vaikka continue toimii, se on tyylitön ratkaisu.
Aihe on jo aika vanha, joten et voi enää vastata siihen.