Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Sanan tarkastus pienellä ja isolla

Sivun loppuun

SukaBljat [26.09.2017 16:19:42]

#

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

Metabolix [26.09.2017 16:40:08]

#

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

SukaBljat [26.09.2017 17:16:57]

#

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

Grez [26.09.2017 21:11:35]

#

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

Jaska [27.09.2017 10:16:47]

#

Netissä varoitellaan using namespace std:n käytöstä: https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

SukaBljat [27.09.2017 21:54:57]

#

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.

Metabolix [27.09.2017 22:29:44]

#

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

SukaBljat [28.09.2017 08:28:31]

#

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.

SukaBljat [30.10.2017 19:30:32]

#

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

Metabolix [30.10.2017 21:16:25]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta