- 締切済み
分からないです(;_;)
分からないです(;_;) 1 さいころを振り出た目を返す(1~6の乱数を返す)ユーザ関数int dice(void)と、そのユーザ関数int dice(void)を用いてスタートからゴールまで一本道のすごろくを行うユーザ関数int sugoroku(int goal, int toss_max, int *toss_count)を作成せよ。int sugoroku(int goal, int toss_max, int *toss_count)は以下の条件をつける。 ・さいころを振るたびに、出た目と進んだ後のマスを表示する。 ・goalをゴールとし、ゴールにちょうど止まらなかった場合、ゴールを越えた分だけ戻る。 ・さいころをtoss_max回振るまでにゴールできた場合には1を返し、toss_max回振ってもゴールできなかった場合は0を返す。 ・さいころを振った回数の合計をtoss_countに入れる。 そして、実行結果例のように、goalとtoss_maxを入力するとすごろくを行って結果を表示するプログラムを作成する。 乱数を使用するときはstdlib.hをインクルードし、rand()を用いることで実現可能。 乱数の範囲を指定するには以下の公式を用いる。 最小値+(int)( rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX)) <実行結果> input goal. 11 input toss_max. 5 sugoroku start! pip = 2, mass = 2 pip = 4, mass = 6 pip = 5, mass = 11 goal!! toss_count = 3 input goal. 11 input toss_max. 5 sugoroku start! pip = 2, mass = 2 pip = 3, mass = 5 pip = 4, mass = 9 pip = 5, mass = 8 pip = 1, mass = 9 failure...
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- magicalpass
- ベストアンサー率58% (378/648)
No.1 補足 わざわざインクルードファイルまで指定してrandの使用法まで言及してる割には記述がないから仕様外かと思って入れなかったけど、dice()をそれなりに使えるランダムな目にするには、srandによる初期化が必要です。 一般的なtime関数を用いた初期化はインクルードファイルとか増えて、想定範囲を越えるのかもしれないけど、それ以外にも初期化の方法が無いわけではありません。 例えば、main関数の頭でユーザーに適当な5桁の数字を入力させて初期化するとか。もっとも、ユーザーが毎回同じ数字を入力すると無意味ですが。(5桁というのにとくに意味はありません) int initialize; puts("input random five-digit number."); scanf("%d", &initialize); srand((unsigned int)initialize);
- magicalpass
- ベストアンサー率58% (378/648)
// 仕様を満たす範囲でコンパクトにまとめてみました // でも、初心者が書くコードじゃないので要注意 #include <stdio.h> #include <stdlib.h> int dice() { return( 1 + (int)(rand() * 6.0 / (1.0 + RAND_MAX))); } int sugoroku(int goal, int toss_max, int *toss_count) { int pip, mass = 0; for (*toss_count = 0; *toss_count < toss_max;) { (*toss_count)++; mass += (pip = dice()); mass = (mass > goal) ? goal - (mass - goal) : mass; printf("pip = %d, mass = %d\n", pip, mass); if (mass == goal) break; } return(mass == goal ? 1 : 0); } void main() { int goal, toss_max, toss_count; puts("input goal."); scanf("%d", &goal); puts("input toss_max."); scanf("%d", &toss_max); puts("sugoroku start!\n"); sugoroku(goal, toss_max, &toss_count) ? printf("goal!!\ntoss_count = %d\n", toss_count) : printf("failure..\n"); }