Ongelma koulutehtävässä [RATKAISTU]

Liittynyt
04.11.2020
Viestejä
22
Eli minun C-kielen perusteet tehtävänä oli muuttaa minun koodia, joka näyttää kolema randomia numeroa 1 ja 6 väliltä niin, että numeron arvonta tapahtuu alifunktiossa. Jostakin syystä ainoa numero, mitä muokattu ohjelma näyttää on "0", eikä minulla ole mitään hajua mitä tein väärin.

Alkuperäinen koodi:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
int stop; //Muuttua, joka kertoo, että haluaako käyttäjä keskeyttää ohjelman
int loop; //Muuttuja, joka kertoo kuinka monta kertaa ohjelma on loopannut
int randomNumber;
int aika=time(NULL);

while(stop <= 1)
{
do //do komento, joka loopaa ohjelmaa,kunnes loop muuttuja on yhtäsuuri tai enemmän, kuin 3
{
srand(aika*loop*randomNumber);
randomNumber = rand() % 6 +1; //Arpoo satunnaisen numeron 1 ja 6 väliltä.
//Käyttää siemenenä "aika*loopien määrä*random numero",
//jotta saataisiin jokaisella kieroksella muutuva siemen

switch(randomNumber) //Ilmoittaa arvotun numeron roomalaisilla numeroina, koska piti saada jotakin merkitystä tuolla case rakenteelle
{

case 1: printf("\nLukusi on I");
break;
case 2: printf("\nLukusi on II");
break;
case 3: printf("\nLukusi on III");
break;
case 4: printf("\nLukusi on IV");
break;
case 5: printf("\nLukusi on V");
break;
case 6: printf("\nLukusi on VI");
break;
}
loop++; //Kastavaa loop muutujaa yhdellä jokaisen loopin jälkeen
}
while(loop <= 3); //while komento, joka keroo milloin ohjelma kuuluu lopettaa

int valinta; //Muuttuja, joka kertoo minkä valinnan käyttäjä teki


printf("\nHaluatko jatkaa ohjelmaa?\n1.Kyllä 2.Ei ");
scanf("%d", &valinta);

if(valinta==1)
{
stop=0;
loop=1;
}
if(valinta==2)
{
stop=2;
}
}
}


Muokattu koodi:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int randomLuku(int randomNumber, int aika, int loop);

main()
{
int stop; //Muuttua, joka kertoo, että haluaako käyttäjä keskeyttää ohjelman

while(stop <= 1)
{
int randomNumber;
int aika=time(NULL);
int loop;

loop++;
printf("Luku on %d\n", randomNumber);
loop++;
printf("Luku on %d\n", randomNumber);
loop++;
printf("Luku on %d\n", randomNumber);


int valinta; //Muuttuja, joka kertoo minkä valinnan käyttäjä teki


printf("\nHaluatko jatkaa ohjelmaa?\n1.Kyllä 2.Ei ");
scanf("%d", &valinta);

if(valinta==1)
{
stop=0;
}
if(valinta==2)
{
stop=2;
}
}
}

int randomLuku(int randomNumber, int aika, int loop)
{
srand(aika*loop);
randomNumber = rand() % 6 +1; //Arpoo satunnaisen numeron 1 ja 6 väliltä. Käyttää siemenenä "aika*loopien määrä*random numero", jotta saataisiin jokaisella kieroksella muutuva siemen

return(randomNumber);
}
 
Eli minun C-kielen perusteet tehtävänä oli muuttaa minun koodia, joka näyttää kolema randomia numeroa 1 ja 6 väliltä niin, että numeron arvonta tapahtuu alifunktiossa. Jostakin syystä ainoa numero, mitä muokattu ohjelma näyttää on "0", eikä minulla ole mitään hajua mitä tein väärin.

Alkuperäinen koodi:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
int stop; //Muuttua, joka kertoo, että haluaako käyttäjä keskeyttää ohjelman
int loop; //Muuttuja, joka kertoo kuinka monta kertaa ohjelma on loopannut
int randomNumber;
int aika=time(NULL);

while(stop <= 1)
{
do //do komento, joka loopaa ohjelmaa,kunnes loop muuttuja on yhtäsuuri tai enemmän, kuin 3
{
srand(aika*loop*randomNumber);
randomNumber = rand() % 6 +1; //Arpoo satunnaisen numeron 1 ja 6 väliltä.
//Käyttää siemenenä "aika*loopien määrä*random numero",
//jotta saataisiin jokaisella kieroksella muutuva siemen

switch(randomNumber) //Ilmoittaa arvotun numeron roomalaisilla numeroina, koska piti saada jotakin merkitystä tuolla case rakenteelle
{

case 1: printf("\nLukusi on I");
break;
case 2: printf("\nLukusi on II");
break;
case 3: printf("\nLukusi on III");
break;
case 4: printf("\nLukusi on IV");
break;
case 5: printf("\nLukusi on V");
break;
case 6: printf("\nLukusi on VI");
break;
}
loop++; //Kastavaa loop muutujaa yhdellä jokaisen loopin jälkeen
}
while(loop <= 3); //while komento, joka keroo milloin ohjelma kuuluu lopettaa

int valinta; //Muuttuja, joka kertoo minkä valinnan käyttäjä teki


printf("\nHaluatko jatkaa ohjelmaa?\n1.Kyllä 2.Ei ");
scanf("%d", &valinta);

if(valinta==1)
{
stop=0;
loop=1;
}
if(valinta==2)
{
stop=2;
}
}
}


Muokattu koodi:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int randomLuku(int randomNumber, int aika, int loop);

main()
{
int stop; //Muuttua, joka kertoo, että haluaako käyttäjä keskeyttää ohjelman

while(stop <= 1)
{
int randomNumber;
int aika=time(NULL);
int loop;

loop++;
printf("Luku on %d\n", randomNumber);
loop++;
printf("Luku on %d\n", randomNumber);
loop++;
printf("Luku on %d\n", randomNumber);


int valinta; //Muuttuja, joka kertoo minkä valinnan käyttäjä teki


printf("\nHaluatko jatkaa ohjelmaa?\n1.Kyllä 2.Ei ");
scanf("%d", &valinta);

if(valinta==1)
{
stop=0;
}
if(valinta==2)
{
stop=2;
}
}
}

int randomLuku(int randomNumber, int aika, int loop)
{
srand(aika*loop);
randomNumber = rand() % 6 +1; //Arpoo satunnaisen numeron 1 ja 6 väliltä. Käyttää siemenenä "aika*loopien määrä*random numero", jotta saataisiin jokaisella kieroksella muutuva siemen

return(randomNumber);
}

Laskepas (tai printtaa) huviksesi mitä tuo sun random seedisi arvo on eri iteraatioilla.

Oma C-osaaminen on ruosteessa, mutta yleensä satunnaislukugeneraattoria ei kuulu alustaa uudella seedillä joka luvun välissä, vaan se alustetaan kerran ja sitten kutsutaan sitä samaa. Jos nyt sitten alustat sen joka kerta uudelleen samalla seedillä niin toki se palauttaakin aina samaa.
 
Ainakaan pääohjelmasi ei taida missään vaiheessa kutsua tuota randomLuku -funktiota. Ainakaan en yhtäkkiä huomannut että sitä kutsuttaisiin missään.

Ja vinkkinä, nuo koodit kannattaa laittaa täällä foorumilla koodi-tagien sisään niin sisennykset pysyy ja on muutenkin luettavampaa.
 
Ainakaan pääohjelmasi ei taida missään vaiheessa kutsua tuota randomLuku -funktiota. Ainakaan en yhtäkkiä huomannut että sitä kutsuttaisiin missään.

Ja vinkkinä, nuo koodit kannattaa laittaa täällä foorumilla koodi-tagien sisään niin sisennykset pysyy ja on muutenkin luettavampaa.

Kiitos.
randomLukun-funktion kutsuminen tosiaan pääsi unohtumaan.
Ja kiitos tuosta vinkistä.
 
Tuosta seed:n käytöstä pääsee eroon käyttämällä jotain hienompaa random-funktiota, kuten vaikka arc4random():ia. Käyttöjärjestelmä ei tästä postista selvinnyt, mutta linuxissa tuo lienee jossain libbsdjotain-kirjastossa, kun taas bsd:ssä ei tarvitse mitään ylimääräistä kirjastoa. Windowsista löytyy sitten omat vaihtoehtonsa.
 
Tuosta seed:n käytöstä pääsee eroon käyttämällä jotain hienompaa random-funktiota, kuten vaikka arc4random():ia. Käyttöjärjestelmä ei tästä postista selvinnyt, mutta linuxissa tuo lienee jossain libbsdjotain-kirjastossa, kun taas bsd:ssä ei tarvitse mitään ylimääräistä kirjastoa. Windowsista löytyy sitten omat vaihtoehtonsa.

Windows 10 on käyttöjärjestelmänä. Ja tuo on ainoa random-funktio, mikä mulle on opetettu. Joten se on myös se mitä käytän. Ja randomin numeron arvonta toimii tarpeeksi hyvin näinkin, joten en näe tarvetta sen muutamiseen.
 
Yleensä tuo srand(int) olisi hyvä kutsua vain kerran ohjelman suorituksen aikana ellei oikeasti haluta alustaa pseudosatunnaislukuja uudelleen.

Tuo perus pseudo srand/rand on ihan hyvä moneen käyttöön mm. ongelmien selvittämisessä on helpompaa kun pystyy pakottamaan ohjelman toimimaan testaamisen ajaksi aina samoilla "satunnais"luvuilla joilla jokin ongelma ilmenee.
 
Sellainen huomio, että muuttuja integer valinta on tarpeeton, voit suoraan lukea stop-muuttujaan käyttäjän valinnan ja sen pohjalta joko jatkaa ohjelman suorittamista tai lopettaa sen.
 

Statistiikka

Viestiketjuista
261 791
Viestejä
4 547 285
Jäsenet
74 849
Uusin jäsen
ookooo

Hinta.fi

Back
Ylös Bottom