• ベストアンサー

明解C++を購入したのですが

前回こちらで質問をさせていただきました(http://oshiete1.goo.ne.jp/qa4660996.html) 明解C++を購入し、現在120Pまで読んだのですが演習問題1-12あたりからほとんど分かりません。 答えがついていないので、自分で考えるみたいですが・・・。 内容は大体な気持ちで理解はしていますが、このまま進めていっても問題ないのでしょうか? それか、一通り読んだ後に問題を解いたほうがよろしいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

すいません。推薦したものです。 演習は全部やらないても構いませんが本を読んでいただけでは身に付きません。自分でプログラムを書いてみて初めて身に付きます。演習問題1-12もプログラムを作る問題ですので、実際に作ってみてはどうでしょうか? で、動かないプログラムが出来たら、こちらのサイトで添削してもらえばよいだけです。目的のゲームプログラムまでは遠い道ですが慌てずやりましょう。一ヶ月とかでゲームプログラムまでなんてたどり着けませんので長~く考えて下さい。 それと、演習問題1-12は乱数生成ですから、シューティングゲームの必須知識ですよ。

JEIFONN
質問者

お礼

またもやご回答ありがとうございます。 やはり読むだけではダメみたいですね・・。 確かに演習1-11以前は全て自分で書いて、しっかり覚えれました。 自分のペースでしっかりした知識でやっていきたいと思います。 演習1-12は0以上9以下は分かるのですが、ランダムの整数を1以上9以下や10以上99以下にする方法がどうしても分からないです。。

その他の回答 (5)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

>乱数をRAND_MAXで割ると0~1はわかったのですが、 >いざ10をかけてみると0で計算されてしまうのですが・・・。 int型で計算してませんか? int型は整数値つまり小数点以下の値を保持しません(本のP24)。 なので型変換ってのを行う必要があります(本だとP130ぐらい)。 まだそこまで読んでいないようでしたら早かったかも知れませんね。とりあえず先に読んでもかまいませんのでP130~135を一読してみてください。 でそこを読むとrand()はint型ですのでdouble型へ数値を変更する必要があるのが分ると思います。 >演習1-13のプログラムですが、合っていますでしょうか? 合ってます。十分理解していると思います。 この調子で進んでいけば良いと思います。演習が無い部分でも、本を読んで理解or納得出来なければ、プログラムを動かして色々と書き換えたりして納得できるまで機能を確認してみてください。

JEIFONN
質問者

お礼

なるほど。0~1ということは0.5とかもありましたね・・・。 分かりやすい解説ありがとうございます。 演習1-13の確認についてもありがとうございます。 また、分からないことがありましたら質問させていただきます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

ここはrand()の意味を理解しておいて下さい。 rand()は0~RAND_MAXの乱数を作り出します。このままだと0~好きな数値の間では無いので計算して範囲を変えてやる必要があります。この本で紹介されているは方法は、乱数を好きな数値+1で割った余りを取ると0~好きな数値となるって方法です。 ですが、「乱数を実数化してRAND_MAXで割ることで0~1の範囲に変える。それに好きな値を掛け算すると0~好きな数値が得られる」で計算した乱数がよりランダムに確率分布します。今は難しいかも知れませんが、なぜかは考えてみておいてください。 >演習1-13も合っているか分かりませんが、±5の範囲で実行できました。 出来ていれば問題ないと思いますよ。プログラムの作り方の答えは一つじゃありませんので。気になるならプログラムを提示してこれより効率よく出来ますかと訪ねてみてください。

JEIFONN
質問者

お礼

ありがとうございます。 ふむ・・・難しいですね; 乱数をRAND_MAXで割ると0~1はわかったのですが、 いざ10をかけてみると0で計算されてしまうのですが・・・。 演習1-13のプログラムですが、合っていますでしょうか? int main() { int lucky,i; cout << "整数値:"; cin >> lucky ; srand(time(NULL)); i = rand() % 11; cout << "今日の乱数ナンバーは?" << lucky - 5 + i << "です!\n"; return 0; }

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>ランダムの整数を1以上9以下や10以上99以下にする方 ヒント1。加算を使います。 ヒント2。0以上8以下や0以上89以下の乱数を作る。 とにかく、プログラムを書くだけでだめで動かしてください。実行して色々とやってみる事。これが重要です。

JEIFONN
質問者

お礼

ご回答ありがとうございます。 ヒント1は分かっていたのですが、ヒント2の作り方が分かりませんでした。 後々しっかり計算してみると確かにそうでした。。 演習1-13も合っているか分かりませんが、±5の範囲で実行できました。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

> 確かに演習1-11以前は全て自分で書いて、しっかり覚えれました。 書いたプログラムを実際に動かしてみましたか? 動かしていないならぜひ動かしてみてください。 > 演習1-12は0以上9以下は分かるのですが、ランダムの整数を1以上9以下や10以上99以下にする方法がどうしても分からないです。。 例えば、0以上8以下の乱数に1を足すとそれはどんな乱数になりますか?

JEIFONN
質問者

お礼

ご回答ありがとうございます。 >書いたプログラムを実際に動かしてみましたか? 書き方が悪かったですね。というか書いてないですね・・・。 一応、合っているか分かりませんが全ての演習問題は動作しました。 >例えば、0以上8以下の乱数に1を足すとそれはどんな乱数になりますか? その考えまでには達したのですが0以上8以下の作り方がわかりませんでした・・。 無事動作しました。ありがとうございます。

  • jam-best
  • ベストアンサー率27% (94/344)
回答No.1

質問者様はC++以外の言語はやったことあるのでしょうか?? C++は継承とかクラスとかの考慮が入ってくるのかな。プログラムはもう実際にプログラム書いてとことんやって慣れてくしかないと思います。 知識だけつけても、なかなか使えるもんではないです。 でも最低限の知識は必要だと思いますので、大体が理解できているのであればまずは大丈夫だとは思います。いきなり完璧には無理ですよ。 私的にはこのまま進めていってもいいとは思います、こういうものがある程度だけ頭にいれておき、あとはひたすらプログラムを書く!! 現状理解できていないと、今後もおそらく理解できないのがいっぱいでてくると思います。そこで挫折しないでがんばってください。

JEIFONN
質問者

お礼

ご回答ありがとうございます。 C++以外の言語はVBを少し学んだぐらいです。 なるほど・・。知識を広くして、その後深くしていきたいと思います。

関連するQ&A