Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Sulkeutumis ongelma

Sivun loppuun

TVdata [19.11.2011 15:01:37]

#

Kun painan entteriä tiedon syötön jälkeen,ohjelma usein sulkeutuu,esim.

#include <iostream>

int main() {
	std::cout << "Pelataanpa jalkapalloa. Montako pelaajaa on?" << std::endl;
	int pelaajia;
	std::cin >> pelaajia; /*Kun tämän syötön jälkeen painetaan entteriä,
	if (pelaajia < 6) {   ohjelma sulkeutuu/kaatuu.*/
		// Tähän päästään, jos luku on alle 6.
		std::cout << "Pelaajia on aika vähän!" << std::endl;
	} else if (pelaajia % 2 == 0 || pelaajia > 10) {
		// Nyt else-lohko koostuu vain yhdestä if-lauseesta.
		// Jos siis ensimmäinen ehto ei toteudu, kokeillaan tätä ehtoa:
		// parillinen määrä tai yli 10 pelaajaa.
		std::cout << "Näillä pelaajilla saadaan jo aika tasaiset joukkueet." << std::endl;
	} else {
		// Tämä on jälkimmäisen if-lauseen else-lohko, johon päästään,
		// jos toinenkaan ehto ei toteudu.
		std::cout << pelaajia << " pelaajaa riittää kyllä peliin." << std::endl;
		std::cout << "Toiselle puolelle jää kuitenkin yhden ylivoima." << std::endl;
	}
	// Kaikkien vaihtoehtojen jälkeen päädytään lopulta tänne.
}

Grez [19.11.2011 15:23:25]

#

Olet varmaankin lisännyt tuon kaksirivisen kommentin riveille 6-7 tänne kopioidessasi koska nykyiselläänhän tuo ei edes käänny.

Mutta siis ohjelman kuuluukin sulkeutua sen jälkeen kun käyttäjä on antanut syötteen ja ohjelma on antanut tulosteen. Oliko viestissäsi tarkoitus olla jokin kysymys?

Korjasin kommentin, käänsin ohjelman ja testasin:

$ ./tvdata
Pelataanpa jalkapalloa. Montako pelaajaa on?
4
Pelaajia on aika vähän!
$ ./tvdata
Pelataanpa jalkapalloa. Montako pelaajaa on?
7
7 pelaajaa riittää kyllä peliin.
Toiselle puolelle jää kuitenkin yhden ylivoima.
$ ./tvdata
Pelataanpa jalkapalloa. Montako pelaajaa on?
8
Näillä pelaajilla saadaan jo aika tasaiset joukkueet.
$

TVdata [19.11.2011 15:59:11]

#

Tarkotan sitä,että kun olen kirjoittanut luvun kysymykseen "Montako pelaajaa on ?" ja painan entteriä,ohjelma sulkeutuu mitään ilmoittamatta.

TVdata [19.11.2011 16:00:39]

#

Anteeksi lauseen muotoiluni.

Sienikasvusto [19.11.2011 16:01:31]

#

Tietenkin se sulkeutuu, niinhän sinä olet sen ohjelmoinut? Mitä oikein haluat että ohjelmasi tekee ennen kuin se sulkeutuu?

Ps. Koodisi main() on tyyppiä int, mutta ohjelma ei palauta siitä huolimatta mitään.

vesikuusi [19.11.2011 16:03:36]

#

Hän haluaa sen pysähtyvän/odottavan enteriä. Lisää loppuun

std::cin.get();

vesikuusi [19.11.2011 16:05:01]

#

Sienikasvusto kirjoitti:

Ps. Koodisi main() on tyyppiä int, mutta ohjelma ei palauta siitä huolimatta mitään.

Hyvä pointti :D

TVdata [19.11.2011 16:12:57]

#

vesikuusi kirjoitti:

Hän haluaa sen pysähtyvän/odottavan enteriä. Lisää loppuun...

Minkä loppuun?

Grez [19.11.2011 16:15:11]

#

TVdata kirjoitti:

Minkä loppuun?

Koodin loppuun. Ennen "return 0;"aa

TVdata kirjoitti:

Anteeksi lauseen muotoiluni.

Ei lauseenmuotoiluissasi ole mitään vikaa. Ongelma on enemmänkin se, että et kerro mitä haluat.

Sitä paitsi, kuten testistäni huomasit, ohjelmasi toimi ihan moitteettomasti.

TVdata [19.11.2011 16:31:24]

#

Okei,haluan että se tulostaa myös "Pelaajia on aika vähän!","Näillä pelaajilla saadaan jo aika tasaiset joukkueet."," pelaajaa riittää kyllä peliin." ja "Toiselle puolelle jää kuitenkin yhden ylivoima.".
Sain aikaiseksi tämän:

#include <iostream>

  int main() {
	std::cout << "Pelataanpa jalkapalloa. Montako pelaajaa on?" << std::endl;
	int pelaajia;
	std::cin >> pelaajia;

	if (pelaajia < 6) {
		// Tähän päästään, jos luku on alle 6.
		std::cout << "Pelaajia on aika vähän!" << std::endl;
	} else if (pelaajia % 2 == 0 || pelaajia > 10) {
		// Nyt else-lohko koostuu vain yhdestä if-lauseesta.
		// Jos siis ensimmäinen ehto ei toteudu, kokeillaan tätä ehtoa:
		// parillinen määrä tai yli 10 pelaajaa.
		std::cout << "Näillä pelaajilla saadaan jo aika tasaiset joukkueet." << std::endl;
	} else {
		// Tämä on jälkimmäisen if-lauseen else-lohko, johon päästään,
		// jos toinenkaan ehto ei toteudu.
		std::cout << pelaajia << " pelaajaa riittää kyllä peliin." << std::endl;
		std::cout << "Toiselle puolelle jää kuitenkin yhden ylivoima." << std::endl;
		std::cin.get();
   return 0;
}}

Mizou [19.11.2011 16:58:09]

#

Otappa kuitenkin return ja cin.get() ulos tuosta viimeisestä else lohkosta.

} else {
		// Tämä on jälkimmäisen if-lauseen else-lohko, johon päästään,
		// jos toinenkaan ehto ei toteudu.
		std::cout << pelaajia << " pelaajaa riittää kyllä peliin." << std::endl;
		std::cout << "Toiselle puolelle jää kuitenkin yhden ylivoima." << std::endl;
}
   std::cin.get();
   return 0;
}

Metabolix [19.11.2011 17:04:01]

#

Kun noin ansiokkaasti kopioit koodiesimerkkejä suoraan oppaistani, voisit lukea myös opassarjan ensimmäisestä osasta ratkaisun ongelmaasi. Siis: käynnistä komentorivi (Windowsissa Käynnistä -> Suorita -> cmd.exe) ja aja ohjelma sieltä.

Pelkkä cin.get ei ratkaise ongelmaa, koska aiemmin syötetty enter on vielä muistissa. Oppaassani on tälle eräs pidempi vaihtoehto, jos jostain syystä komentorivin kunnollinen käyttö ei tule kysymykseen.

Voit myös käyttää seuraavanlaista koodia, joka odottaa, että käyttäjä syöttää jonkin merkin ja painaa enteriä:

std::cin >> std::ws;

Viisainta on kuitenkin opetella käyttämään komentoriviä oikein ja suunnitella mutkikkaammat ohjelmat niin, että mitään kikkailua ei tarvita.

Sienikasvusto kirjoitti:

Ps. Koodisi main() on tyyppiä int, mutta ohjelma ei palauta siitä huolimatta mitään.

Tiedoksesi: C++:n standardin mukaan main-funktiossa ei ole pakko olla return-lausetta, vaan paluuarvo on automaattisesti 0.

Grez [19.11.2011 17:28:56]

#

TVdata kirjoitti:

Okei,haluan että se tulostaa myös "Pelaajia on aika vähän!","Näillä pelaajilla saadaan jo aika tasaiset joukkueet."," pelaajaa riittää kyllä peliin." ja "Toiselle puolelle jää kuitenkin yhden ylivoima.".

Sehän tulosti ne, kuten huomasit kun testasin ohjelmaa.

Ongelmasi oli siis ilmeisesti se, että komentorivi-ikkuna jossa ohjelmaa ajoit sulkeutui välittömästi ohjelman päättymisen jälkeen, jolloin et ehtinyt nähdä niitä. Komentorivi-ohjelmat on tarkoitettu ajettaviksi komentoriviltä, ja komentorivin ominaisuuksiin ei kuulu ikkunan sulkeutuminen ohjelman suorituksen päättyessä. Huomaat tämän vaikka ihan perus dir-komennolla. Jos ikkuna sulkeutuu heti kun dir on suoritettu, niin et ehdi lukea mitä tiedostoja siellä olikaan.

Eli tee kuten Metabolix neuvoi, ja testaa ohjelmaa komentorivi-ikkunassa tai jos haluat jostain IDEstä ajaa sitä, niin määritä että ikkuna ei sulkeudu heti suorituksen päättyessä.

Lukemalla ohjelman lopussa syötteen käyttäjältä saat kyllä ikkunan olemaan sulkeutumatta (ennen syötteen antamista) mutta se ei ole hyvä ratkaisu, koska komentoriviohjelmien ei kuulu toimia niin. Mieti nyt jos aina dir:in ajamisen jälkeen pitäisi painaa enter että pääsee takaisin komentoriville. Toki ohjelmassa voi tällainen erikoistoimintatila olla, johon pääsee parametrilla (esim. Dirissä /p )


Sivun alkuun

Vastaus

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

Tietoa sivustosta