#include <cstdlib>
#include <iostream>
using namespace std;
void kysyNumbaa(int i);
void numbaRundi();
void randomi(int i);
void randomiRundi();
int num1, num2, num3, num4;
int rnum1, rnum2, rnum3, rnum4;
int rundit = 0;
int main(int argc, char *argv[])
{
cout << "Syota valitsemasi lottonumerot (4): " << endl;
numbaRundi();
randomiRundi();
while(num1 != rnum1 || num2 != rnum2 || num3 != rnum3 || num4 != rnum4) {
randomiRundi();
}
cout << "Jotta numerosi saatiin, piti arpoa " << rundit << " kertaa" << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
void randomiRundi()
{
randomi(rnum1);
randomi(rnum2);
randomi(rnum3);
randomi(rnum4);
rundit++;
}
void randomi(int i) {
srand(time(NULL));
i = rand()%40;
}
void numbaRundi()
{
kysyNumbaa(num1);
kysyNumbaa(num2);
kysyNumbaa(num3);
kysyNumbaa(num4);
}
void kysyNumbaa(int i)
{
cin >> i;
}Eilen illal asensin Dev-C++:an koneelle ja nyt parin ohjelman (printin) jälkeen yritän tehdä "Lottomasiinaa" miksikä sitä ite kutsun.
Mutta ongelmana on kuitenkin että while() loop tehdään vain yhen kerran.
Ensinnäkin, randomi-funktiolle antamasi parametri toimii funktion sisäisenä muuttujana, eikä siihen tehty muutos välity ulkopuolelle. Jotta muutos näkyisi, pitäisi muuttuja välittää viittauksena (reference, &). Järkevämpää olisi laittaa funktion palautusarvoksi int ja jättää koko parametrihäslinki pois. Sama pätee kysymisfunktioon.
Toiseksi, älä kutsu srand-funktiota joka kerta uudestaan vaan vain kerran ohjelman alussa. Noin saat saman luvun rand-funktiolta niin kauan kuin time pysyy samana eli aina sekunnin ajan.
Tuossa on vielä sekin hassutus, että antamalla luvun, joka on suurempi kuin 39 tai pienempi kuin 0, saa aikaan loputtoman silmukan.
Muuttujien välitys funktioille vaatii korjausta.
Mahdollisuuksia on useita:
1. Funktioille välitetään muuttujan arvon asemesta muuttujan osoite muistissa. Nyt funktio pystyy muuttamaan muuttujan arvoa. Tämä tarkoittaa sitä, että funktiokutsussa käytetään merkintää &muuttuja, joka on muuttujan osoite. Funktion sisällä taas kirjoitetaan *muuttuja, joka osoittaa alkuperäiseen muuttujaan. Lisätietoa on C-oppaassa.
2. Kun muuttujat ovat yleisiä (ne on määritelty ohjelman alussa ja ne näkyvät kaikissa ohjelman funktioissa), niiden arvoa voi yhtä hyvin muuttaa suoraan. Silloin funktioille ei tarvitse antaa mitään parametreja ja ohjelma yksinkertaistuu näin:
void randomiRundi()
{
rnum1 = rand() % 40;
rnum2 = rand() % 40;
rnum3 = rand() % 40;
rnum4 = rand() % 40;
rundit++;
}
void numbaRundi()
{
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
}3. Funktiot voivat myös palauttaa arvon. Silloin funktioille ei välitetä mitään muuttujia parametreina, vaan ne palauttavat arvon, jonka voi asettaa suoraan oikeaan muuttujaan. Esimerkiksi numeroiden kyselyn voi tehdä näin:
void numbaRundi()
{
num1 = kysyNumbaa();
num2 = kysyNumbaa();
num3 = kysyNumbaa();
num4 = kysyNumbaa();
}
int kysyNumbaa()
{
int i;
cin >> i;
return i;
}Siirrä myös srand-funktion kutsu eli satunnaislukujen alustus ohjelman alkuun. Todennäköisyys saada neljä tiettyä lukua väliltä 0 - 39 on 1 / 404 eli 1 / 2560000, joten luultavasti randomiRundi-funktiota täytyy kutsua keskimäärin joitakin miljoonia kertoja.
Nyt lähti pelittään, täytyy tota kyllä vähän muokata ettei mene niin kauaa tuossa arpomisessa ja muutakin jännää laittaa. Kiitos avusta :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.