Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Miksi char-muuttujan vertailu numeroon ei toimi?

Tiirikka [19.06.2013 11:47:52]

#

Lueskelin muutaman ensimmäisen Ohjelmointiputkan C++ ohjeista, ja päätin väsätä pienen laskimen. Aluksi laskin kysyy halutaanko plussata, vai miinustaa, kuitenkin kun syötetään 1 tai 2, niin ohjelma sammuu välittömästi.

Käännösvaiheessa kääntäjä ei anna mitään erroria, mutta siitä huolimatta ohjelma ei toimi. Kääntäjänä käytän Ohjelmointiputkan omaa kääntäjää. ja käännän ohjelmani sillä kaanna-cpp.bat -tiedostolla.

#include <iostream>

int main () {
	unsigned char toimitus;

	std::cout << "Tama on laskin, Huom! et voi laskea desimaalilukuja esim: 6.5 + 2.4" << std::endl;
	std::cout << "Valitse minkä laskutoimituksen haluat laskea" << std::endl;
	std::cout << "1 = pluslasku" << std::endl;
	std::cout << "2 = miinuslasku" << std::endl;
	std::cin >> toimitus; //kun tässä kohdassa syötän joko numeeron 1 tai 2, niin ohjelma sammuu välittömästi
	if (toimitus == 1) {
		std::cout << "Syötä ensimmäinen plussattava" << std::endl;
		long ensimmainen;
		std::cin >> ensimmainen;
		std::cout << "Kiitos, nyt syota toinen plussattava" << std::endl;
		long toinen;
		std::cin >> toinen;
		std::cout << "Laskutoimituksen tulos on: " << ensimmainen + toinen <<  std::endl;
		std::cout << "Kiitos kun laskitte @ laskin on versiossa 1.02" << std::endl;
		std::cin >> ensimmainen;
	}
	else if (toimitus == 2) {
	std::cout << "Syötä miinustettava" << std::endl;
	long ensimmainen;
	std::cin >> ensimmainen;
	std::cout << "Kiitos, nyt syötä miinustaja" << std::endl;
	long toinen;
	std::cin >> toinen;
	std::cout << "Laskutoimituksen tulos on" << ensimmainen - toinen << std::endl;
	std::cout << "Ohjelma sulkeutuu, kun painat enteriä" << std::endl;
	std::cin >> ensimmainen;
	}
}

Metabolix [19.06.2013 11:53:30]

#

Kun luet virrasta char-muuttujaan, tulos on merkki ('1' tai '2') eikä luku (1 tai 2).

Tyyppiä unsigned char tarvitaan harvoin eikä ainakaan tällaisessa tilanteessa. Lukujen käsittelyyn on yleensä selvintä ja tehokkainta käyttää int-tyyppiä, jos ei ole aivan erityistä syytä tehdä toisin. Merkkien käsittelyyn taas sopii parhaiten tavallinen char.

Olinkin jättänyt oppaassa merkit liian vähälle huomiolle. Lisäsin niistä nyt muutaman sanan osaan 2. Kiitos epäsuorasta palautteesta.

Osan 3 laskimessa käytetään myös char-muuttujaa, joten voit katsoa siitä mallia. Sen koodi on lyhyempi, ja se on myös laskimena paljon parempi, koska lausekkeen voi syöttää järkevässä muodossa. En sitten millään ymmärrä, miksi kaikki tekevät tuollaisen purkkalaskimen ja miksi jopa ohjelmointikursseilla opetetaan usein noin.

Teuro [19.06.2013 13:10:02]

#

Metabolix kirjoitti:

En sitten millään ymmärrä, miksi kaikki tekevät tuollaisen purkkalaskimen ja miksi jopa ohjelmointikursseilla opetetaan usein noin.

Ehkä opettaja sen koommin kuin oppilaatkaan eivät hahmota yksinkertaisen parserin toimintaa riittävästi.

Kysymys on sikäli väärin, että if-lause toimii aivan oikein. Ohjelmakin sammuu aivan kuten ohjelmoija on sen ohjelmoinut se ei siis kaadu, vaikka siltä ehkä tuntuukin. Asian voi varmistaa lisäämällä ennen viimeistä aaltosulkua jotakin tulostettavaa. Tämän tulostuksen pitäisi tulla ohjelman viimeiselle riville.

fergusq [19.06.2013 13:12:25]

#

Teuro kirjoitti:

Ehkä opettaja sen koommin kuin oppilaatkaan eivät hahmota yksinkertaisen parserin toimintaa riittävästi.

No ohjelmointia opiskeleville on varmaan tärkeämpää saada ohjelma lukemaan jotain syötettä kuin alkaa heti parsimaan monimutkaisia kaavoja, vaikka se ei lopulta edes ole niin vaikeaa.

Metabolix [19.06.2013 13:20:22]

#

Tulipa ihmeellisiä vastauksia. Ei siihen parempaan laskimeen liity mitään erityistä parsimista, vaan ihan samanlaisella >>-operaattorilla luetaan kolme arvoa. Vain järjestys on erilainen ja arvot järkevämmät.

Vai kumpi näistä on muka selvempi idealtaan:

int luku1, luku2, laskutyyppi;
cout << "Mitä haluat laskea? 1) sitä, 2) tätä" << endl;
cin >> laskutyyppi;
cout << "Kiva, syötä kaksi lukua" << endl;
cin >> luku1;
cin >> luku2;
if (laskutyyppi == 1) {
	cout << (luku1 + luku2) << endl;
} // else ...
double a, b;
char merkki;
cout << "Syötä yksinkertainen lasku." << endl;
cin >> a >> merkki >> b;
if (merkki == '+') {
	cout << (a + b) << endl;
} // else ...

Tiirikka [19.06.2013 13:37:24]

#

Kiitos kaikista vastauksista, ja nyt laskin toimiikin hyvin. Tarkoituksenani oli siis vain hieman kokeilla oppimaani, eikä välttämättä tehdä niin hyvää laskinta.
Painunkin tästä tutkimaan oppaan seuraavia sivuja ;)

Vastaus

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

Tietoa sivustosta