Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++-harjoituksessa ongelma

Sivun loppuun

tuomas11 [12.06.2008 17:56:02]

#

Eli yritän tehdä ohjelman joka kysyy, kantaluvun ja eksponentin ja laskee potenssilaskun tuloksen. Onnistuin tässä jo kerran, mutta sitten kun harjoitusmielessä vaihtelin muuttujien nimiä, en enää saanutkaan koodia alkuperäiseksi ja se ei enää toimikaan. Jos joku keksii, että mikä tuossa mättää niin kertokoot mieluusti. Siis tuon pitäisi todellakin toimia äärimmäisin pienin muutoksin. Ottaa päähän niin maan pirusti kun pitää mennä kämmimään jo valmis ohjelma.

#include <iostream.h>

int laske(int kanta, int eksp, int alkup);

int main() {
    int kantaluku;
    int eksponentti;
    int tulos;

    cout << "Anna kantaluku: " << endl;
    cin >> kantaluku;
    cout << "Anna eksponentti: " << endl;
    cin >> eksponentti;
    tulos = laske(kantaluku, eksponentti, kantaluku);
    cout << "lopullinen: " << tulos << endl;

    system("PAUSE");
    return 0;
}

int laske(int kanta, int eksp, int alkup) {
     int kerta = 2;
     int valitulos = kanta * alkup;


     while (kerta <= eksp) {
           valitulos * alkup;
           kerta++;
           cout << valitulos << endl;
           }
     return valitulos;
}

Mod. lisäsi kooditagit

Teuro [12.06.2008 18:31:37]

#

int Potenssi(int kanta, int potenssi){
	int tulos = kanta;

	for(int a = 1; a < potenssi; a++){
		tulos *= kanta;
	}

	return tulos;
}

tuomas11 [12.06.2008 18:43:40]

#

Saattaahan se toki noinkin toimia, mutta en vaan tajua, että mitä niin suurta mä muka ohjelmastani tietämättäni muutin kun muuttujien nimiä vaan vaihtelin. En MITÄÄN muuta tehnyt. Nyt jo yli 1.5h ettinyt virhettä, mutta mitään en ole löytänyt. Ottaa päähän...

Pekka Karjalainen [12.06.2008 18:46:24]

#

Teuron esimerkki on mallikas. Jos haluat korjata omaa koodiasi, niin luulen, että tässä kohdassa on virhe:

tuomas11 kirjoitti:

valitulos * alkup;

Näiden kahden pitäisi toimia:

valitulos = valitulos * alkup;
valitulos *= alkup;

Toiminta on kuitenkin vielä kyseenalaista potenssilaskun oikeellisuuden kannalta. Vertaa tuloksiasi Teuron ohjelman tai vaikka ihan oikein laskemisen antamiin, niin virheen pitäisi tulla esille.

Teuro [12.06.2008 18:48:09]

#

Ainakin sulla varsin paljon enemmän koodia tuossa laskufunktiossa. Saattaa joskus mennä helpollakin sekaisin, jos on kovin paljon sekalaista koodia. Toinen mikä pistää silmään on tämä rivi:

tulos = laske(kantaluku, eksponentti, kantaluku);

Miksi passitat kaksi kertaa saman muuttujan parametrinä? Eihän vaan mennyt muuttujat sekaisin? Oma tapanikaan ei ole varmastikaan paras eikä vähiten vähintäänkin oudon nimeämisen takia, mutta se toimii ja siinä ei ole kovinkaan paljoa turhaa kamaa.

tuomas11 [12.06.2008 18:54:04]

#

Purkkavirityksiähän nuo on ja sellaisina pysyvätkin. Nyt sain tuon kuitenkin toimimaan taas uudelleen. Iso kiitos kaikille auttaneille!

vehkis91 [13.06.2008 23:52:21]

#

vaihda <iostream.h> => <iostream> ja pistä sen jälkeen using namespace std.

Tämä ei kyllä vaikuta toimivuuteen, mutta näin kuulemma pitää tehdä nykyään...

Teuro [14.06.2008 09:39:56]

#

vehkis91 kirjoitti:

vaihda <iostream.h> => <iostream> ja pistä sen jälkeen using namespace std.

Tämä ei kyllä vaikuta toimivuuteen, mutta näin kuulemma pitää tehdä nykyään...

Nykyään kait suositaan jopa ihan tarkkaa kutsua noissa std nimiavaruudessa olevilta jutuilta tyyliin:

std::cout << muuttuja << std::endl;

vehkis91 [14.06.2008 09:50:47]

#

no toi on melkein sama asia, mä vain tykkään kirjoittaaa siihen alkuun ton using namespace std, niin ei tarvii kirjoittaa niitä std::cout ja endl... Tulis enemmän kirjoitettavaa.

Teuro [14.06.2008 13:19:20]

#

Näissä harjoituksissa tuo using namespace std; on ihan ok varmaankin, koska ei ole määritelty muita nimiavaruuksia. Oikeissa ja hieman isommissa ohjelmissa kannattaa kuitenkin käyttää tuota edellä mainittua tapaa.

Teuro [14.06.2008 14:26:48]

#

Innostuin nyt säätämään sitten urakalla, joten tässäpä olisi nyt valmis ohjelma, jossa on jopa hieman varmistusta muuttujien arvoista.

#include <iostream>

int Potenssi(int kanta, int exponentti){
	int tulos = kanta;

	for(int a = 1; a < exponentti; a++){
		tulos *= kanta;
	}

	return tulos;
}

int main(){
	int kanta, exponentti;

	do{
		std::cout << "anna kantaluku ja exponentti" << std::endl;
		std::cin >> kanta >> exponentti;
	}while(Potenssi(kanta, exponentti) > 65536 || Potenssi(kanta, exponentti) == 0);

	std::cout << kanta << "^" << exponentti << " = " << Potenssi(kanta, exponentti) << std::endl;
}

Pieni selvennös ehkä on paikallaan. do-while rakenteessa tivataan siis lukua ja exponenttia, kunnes funktion Potenssi(int, int) palautusarvo on int tyypin arvoalueella. Ilmeisesti arvo pyörähtää nollaan, jos menee reilusti yli.


Sivun alkuun

Vastaus

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

Tietoa sivustosta