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
int Potenssi(int kanta, int potenssi){
int tulos = kanta;
for(int a = 1; a < potenssi; a++){
tulos *= kanta;
}
return tulos;
}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...
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.
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.
Purkkavirityksiähän nuo on ja sellaisina pysyvätkin. Nyt sain tuon kuitenkin toimimaan taas uudelleen. Iso kiitos kaikille auttaneille!
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...
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;
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.