Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ void funktio poistuu funktiosta automaattisesti

Jankonbetoni [25.11.2022 19:27:57]

#

Minulla on void funktio toisen void funktion sisällä.

void huoneenVaraus() {
	system("cls");
	int toiminto1;
	cout << "Tervetuloa huoneenvaraukseen" << endl;
	cout << "Jos haluatte yhden hengen huoneen painakaa 1. " << endl;
	cout << "Jos haluatte kahden hengen huoneen painakaa 2. " << endl;
	cout << "Jos haluatte takaisin valikkoon painakaa 3. " << endl;
	cout << "Jos haluatte poistua ohjelmasta painakaa 4. " << endl;
	cout << "HINNASTO" << endl;
	cout << "Yhden henkilön huone 100€/yö. " << endl;
	cout << "Kahden henkilön huone 150€/yö. " << endl;
	cin >> toiminto1;


	while(true){
	if (toiminto1 == 1)
	YhdenhengenHuone();
	else if (toiminto1 == 2)
	KahdenhengenHuone();
	else if (toiminto1 == 3)
	main();
	else if (toiminto1 == 4)
	cout << "Näkemiin! ";
	break;

	}
}

Ja

void YhdenhengenHuone() {
	string kokonimi, osoite, kaupunki, postinumero;
	system("cls");
	cout << "Kirjoittakaa koko nimenne: " << endl;
	getline(cin, kokonimi);

}

Ideana siis olisi, että tosta ekasta funktiosta "huoneenVaraus()" kutsutaan tätä "YhdenhengenHuone" funktiota jos käyttäjä niin haluaa. Tähän asti ohjelma toimii, mutta kun "YhdenhengenHuone" funktion sisään päästään ja se tulostaa "Kirjoittakaa koko nimenne" hypää tämä funktio takaisin alkuperäiseen "huoneenVaraus()" funktioon ja siinä olevaan looppiin, jolloin en pääse kirjoittamaan kysyttyä nimeä ja koko ohjelma loppuu.
--------------------------

while(true){
	if (toiminto1 == 1)
	YhdenhengenHuone();
	else if (toiminto1 == 2)
	KahdenhengenHuone();
	else if (toiminto1 == 3)
	main();
	else if (toiminto1 == 4)
	cout << "Näkemiin! ";
	break;

	}

Eli miten pystyn estämään ettei tuo YhdenhengenHuone() funktio hyppää automaattisesti takaisin tuohon alkuperäiseen funktioon "huoneenVaraus()".

Metabolix [25.11.2022 22:14:06]

#

Ongelma johtuu siitä, että kun luet yhden luvun (toiminto1), lukua seuraava rivinvaihto jää vielä lukematta, ja seuraava getline lukee sitten loput kyseisestä rivistä eli käytännössä tyhjän rivin.

Käyttäjä syöttää:        1234<enter>
cin >> toiminto1;        1234
getline(cin, kokonimi);      <enter>

Ratkaisuun on kolme vaihtoehtoa:

a) Kun luet jotain >>-operaattorilla, lisää sen jälkeen getline (tai cin.ignore), jolla saat ohitettua seuraavan rivinvaihdon.

b) Kun luet kokonaisen rivin, ohita tyhjät rivit. Ennen getline-riviä cin >> ws ohittaa kaiken white-spacen eli rivinvaihdot ja välit; toisaalta tämä ohittaa rajattomasti tyhjiä rivejä, jolloin hämmentynyt käyttäjä voi naputtaa enteriä eikä mitään tapahdu. Vaihtoehtoisesti getline-rivin jälkeen voit tarkistaa, tuliko tyhjä rivi, ja voit lukea sitten vielä uudestaan getlinella; tällöin hallitset paremmin itse lukemista.

c) Käytä getline-funktiota kaikkeen lukemiseen ja muuta tekstit luvuiksi jälkikäteen vaikka stoi-funktiolla. Tämä ratkaisee ongelmat rivinvaihdon kanssa ja lisäksi ne vielä oudommat ongelmat, jos käyttäjä syöttääkin heti ensimmäiselle riville ”1 Petteri”, josta siis valinnaksi tulee ”1” ja nimeksi ” Petteri”.

Jankonbetoni [26.11.2022 17:05:05]

#

Kiitos! Laitoin ton cin >> ws; ennen getline-riviä ja nyt näyttäis toimivan! Ei kyllä varmastikkaan tule olemaan viimeinen ongelma tässä miniprojektissa.

Vastaus

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

Tietoa sivustosta