While文の入り方
While文の入り方
オープニングメッセージが出た後キーを押すといきなりエンディングメッセセージまでいってしまい、While文に入りません。このような時はどのように条件を変えればいいんですか?教えてください。
Re:While文の入り方
とりあえず、乱数生成が色々とおかしいです。
----------------------------------------------------------
int ransuu(int i)
{
int kekka ;
while((kekka =(double)rand()/RAND_MAX*1) >=i);
return kekka ;
}
----------------------------------------------------------
①doubleにキャストしている意味が無い
②RAND_MAXに1をかけている意図が分からない
③RAND_MAXで割ってしまったら、乱数になりません。毎回返って来るのは0です。(int型に代入しているので)
④乱数を生成するのであれば、while文にする必要は無い(0以外の値になった時、値が0になるまで無限ループ)
で、iには0以上の値が入っているようなので、条件式が評価されると毎回"偽"になり、while文を抜け
int型の変数kekkaは常に0になります。
----------------------------------------------------------
int ransuu(int i)
{
int kekka ;
while((kekka =(double)rand()/RAND_MAX*1) >=i);
return kekka ;
}
----------------------------------------------------------
①doubleにキャストしている意味が無い
②RAND_MAXに1をかけている意図が分からない
③RAND_MAXで割ってしまったら、乱数になりません。毎回返って来るのは0です。(int型に代入しているので)
④乱数を生成するのであれば、while文にする必要は無い(0以外の値になった時、値が0になるまで無限ループ)
で、iには0以上の値が入っているようなので、条件式が評価されると毎回"偽"になり、while文を抜け
int型の変数kekkaは常に0になります。
Re:While文の入り方
coniさんありがとうございます。
まだ超初心者なのでわからないことばかりなんです。
とりあえず、乱数の生成がおかしいとのことことですが、
①一応本の通り打ってみたんですが、もしかしてint型でもいいと言うことですか?
②これは単なる書き間違えでした。(1じゃなくてiです。)
③、④とに関してはよくわかりません。もしよければもう少し詳しく教えてくれると助かります。
(なんせ超初心者なんで・・・。すみません。)
一応1をiに書き直したんですがまだwhile文にはいりません。
なぜかわかりません・・・。どうすればいいか教えて下さい。すみません・・・。
ソースは書き直しました。よろしくおねがいします。
まだ超初心者なのでわからないことばかりなんです。
とりあえず、乱数の生成がおかしいとのことことですが、
①一応本の通り打ってみたんですが、もしかしてint型でもいいと言うことですか?
②これは単なる書き間違えでした。(1じゃなくてiです。)
③、④とに関してはよくわかりません。もしよければもう少し詳しく教えてくれると助かります。
(なんせ超初心者なんで・・・。すみません。)
一応1をiに書き直したんですがまだwhile文にはいりません。
なぜかわかりません・・・。どうすればいいか教えて下さい。すみません・・・。
ソースは書き直しました。よろしくおねがいします。
Re:While文の入り方
/************************/ /* i未満の整数乱数 */ /************************/ int ransuu(int i) { return (rand() % i); }元のソースは何したいのかよくわかりませんが、i未満の乱数であればこれで十分かと。
この変更でwhile入りましたよ。
ほかにも間違い発見。
/* 乱数の初期化*/
void setransuu();
voidいらないです。
voidが付いているためにプロトタイプ宣言にみなされているのでsetransuuが実行されていません。
で、前回も指摘しましたが引数省略する場合はvoidつけましょう。
void setransuu(); /*乱数の初期設定値の設定*/
Re:While文の入り方
ありがとうございました。
無事ソースを実行ゲームが出来ました。
しかしソースの勉強の仕方ってとりあえず本などのサンプルソースを打って
それをベースに改造いき、わからないことが出ればそのつど可決していくってやり方で
いいんでしょうか?
皆さんは最初どのようにしてはじめて言ったんですか?
もしよろしければ他に方法があれば教えてもらえると助かるのですが・・・。
無事ソースを実行ゲームが出来ました。
しかしソースの勉強の仕方ってとりあえず本などのサンプルソースを打って
それをベースに改造いき、わからないことが出ればそのつど可決していくってやり方で
いいんでしょうか?
皆さんは最初どのようにしてはじめて言ったんですか?
もしよろしければ他に方法があれば教えてもらえると助かるのですが・・・。
Re:While文の入り方
>>①一応本の通り打ってみたんですが、もしかしてint型でもいいと言うことですか?
srand((unsigned int)time(NULL));
↑コレを記述した後、
Mistさんの書いた通り"rand() % i"だけで充分です。
※調べたところ、double型にキャストして生成する方法もあるようです。
a = (int)((rand() / ((double)RAND_MAX+1.0f)) * 10);
ただ、はなたれパンダさんのプログラムではおかしな式になっており、
無意味なものとなっています。
>>③、④とに関してはよくわかりません。もしよければもう少し詳しく教えてくれると助かります。
③について。
rand関数は、0 ~ RAND_MAX(一般に32767)の値を返します。
------------------
rand() / RAND_MAX
------------------
上記のプログラム場合、下の様になります。
割り算をしてみれば分かりますが、int型だとほぼ100%の確率で0にしかなりません。
--------------
456 / 32767
2366 / 32767
17 / 32767
104 / 32767
--------------
④について
----------------------
while(rand() % 100)
;
----------------------
上記の様なプログラムがあったとします。
while文は「条件が偽では無い限り、ループする」というものです。
どうなるかというと、
------------------------------------------------------------------------
32 % 100 = 32 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
1230 % 100 = 30 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
59 % 100 = 59 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
250 % 100 = 50 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
400 % 100 = 0 //0なのでループを抜ける。
------------------------------------------------------------------------
このようになります。0になるまで無限ループです。
【補足】空文とは 式が無い式文のことです。 コレ⇒ ;
>>もしよろしければ他に方法があれば教えてもらえると助かるのですが・・・。
サンプルソースよりも、while文、for文、switch文、if文などの
基本的な構文の理解を先にした方が良いと思います。
(その他、配列や、代入・初期化などの操作)
で、「この構文とこの構文をこう組み合わせるとこういう結果が表示されるんじゃないかな」
と、自分で実行結果を想定しながら たくさん練習すると効果があると思います。
(他にも、「こういうプログラムを作ろう」と決めて、希望通りに動くまで試行錯誤 など)
srand((unsigned int)time(NULL));
↑コレを記述した後、
Mistさんの書いた通り"rand() % i"だけで充分です。
※調べたところ、double型にキャストして生成する方法もあるようです。
a = (int)((rand() / ((double)RAND_MAX+1.0f)) * 10);
ただ、はなたれパンダさんのプログラムではおかしな式になっており、
無意味なものとなっています。
>>③、④とに関してはよくわかりません。もしよければもう少し詳しく教えてくれると助かります。
③について。
rand関数は、0 ~ RAND_MAX(一般に32767)の値を返します。
------------------
rand() / RAND_MAX
------------------
上記のプログラム場合、下の様になります。
割り算をしてみれば分かりますが、int型だとほぼ100%の確率で0にしかなりません。
--------------
456 / 32767
2366 / 32767
17 / 32767
104 / 32767
--------------
④について
----------------------
while(rand() % 100)
;
----------------------
上記の様なプログラムがあったとします。
while文は「条件が偽では無い限り、ループする」というものです。
どうなるかというと、
------------------------------------------------------------------------
32 % 100 = 32 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
1230 % 100 = 30 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
59 % 100 = 59 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
250 % 100 = 50 //0ではないので繰り返す。空文のあと、rand() % 100 を実行。
400 % 100 = 0 //0なのでループを抜ける。
------------------------------------------------------------------------
このようになります。0になるまで無限ループです。
【補足】空文とは 式が無い式文のことです。 コレ⇒ ;
>>もしよろしければ他に方法があれば教えてもらえると助かるのですが・・・。
サンプルソースよりも、while文、for文、switch文、if文などの
基本的な構文の理解を先にした方が良いと思います。
(その他、配列や、代入・初期化などの操作)
で、「この構文とこの構文をこう組み合わせるとこういう結果が表示されるんじゃないかな」
と、自分で実行結果を想定しながら たくさん練習すると効果があると思います。
(他にも、「こういうプログラムを作ろう」と決めて、希望通りに動くまで試行錯誤 など)
Re:While文の入り方
僕は分かりにくい使い方をしなくてはいけないコード以外はサンプルのソースは打たないですね。
読んで理解できればコピーする必要はないと思います。
理解できるのであれば、もう自分のオリジナルのコードを書いて練習するべきではないでしょうか。
意外に書き方から理解できてなかったことに気づくと思います。
そしたらその分からなかった部分を本を見て確認、以下ループ、みたいな感じでいいのでは?
基本的な構文の理解がまだで、プログラミング(もしくはコンピュータの操作)に慣れていないのなら別ですが・・・
打つときでも何も考えないで打つのではなく、理解して本を見ないで打つぐらいの気持ちでで打たないと、タダのタイピング練習になってしまいますよ。
僕は面白そうな関数や、ちょっとした疑問が出てきたら、試しに何かプログラムを作ってみます。
すぐ作れる20~30行くらいですが。
コンパイルの環境がないところで勉強してるときは、試してみたいところに付箋を貼っておいて、家に帰ってから作ります。
あと、一番大事なのは楽しんですること!!
読んで理解できればコピーする必要はないと思います。
理解できるのであれば、もう自分のオリジナルのコードを書いて練習するべきではないでしょうか。
意外に書き方から理解できてなかったことに気づくと思います。
そしたらその分からなかった部分を本を見て確認、以下ループ、みたいな感じでいいのでは?
基本的な構文の理解がまだで、プログラミング(もしくはコンピュータの操作)に慣れていないのなら別ですが・・・
打つときでも何も考えないで打つのではなく、理解して本を見ないで打つぐらいの気持ちでで打たないと、タダのタイピング練習になってしまいますよ。
僕は面白そうな関数や、ちょっとした疑問が出てきたら、試しに何かプログラムを作ってみます。
すぐ作れる20~30行くらいですが。
コンパイルの環境がないところで勉強してるときは、試してみたいところに付箋を貼っておいて、家に帰ってから作ります。
あと、一番大事なのは楽しんですること!!