Ongelma koulutehtävässä [RATKAISTU]

Liittynyt
04.11.2020
Viestejä
20
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);
}
 
Liittynyt
17.10.2016
Viestejä
5 712
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.
 
Liittynyt
17.10.2016
Viestejä
5 406
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.
 
Liittynyt
04.11.2020
Viestejä
20
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ä.
 
Liittynyt
10.01.2017
Viestejä
132
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.
 
Liittynyt
04.11.2020
Viestejä
20
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.
 
Liittynyt
31.10.2018
Viestejä
378
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.
 
Liittynyt
20.10.2016
Viestejä
604
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.
 
Toggle Sidebar

Uusimmat viestit

Statistiikka

Viestiketjut
240 133
Viestejä
4 196 716
Jäsenet
70 854
Uusin jäsen
rata-mestari

Hinta.fi

Ylös Bottom