広告
↓発売日:2018年09月22日↓
新品価格 |
いよいよ最終日です!
もう少しがんばりましょう!
今回は現在の時間を調べる方法と乱数について見ていきます。
乱数っていうのは簡単に言うと適当な数、ランダムな数になります。
これを使ってゲームなどの偶然に起こる事を表現します。
時間と乱数なんて、関係ないような2つですが、ちょこっと関係あります。
というか、乱数を表すのに時間を調べる命令が少し必要になります。
まずは時間を調べる命令を見ていきましょう!
時間を調べるには「time()」という命令を使います!
使う時は
time(NULL);
「NULL(ヌル)」というものを()カッコに書きます!
「NULL」とはなんだ?と言われますと、「何にもない」みたいな意味です。
とりあえずは「time()」命令だけで時間は調べられますがもしその調べた時間を変数に入れたい時は、
「int」ではなく「time_t」というものを使います。
time_t jikan;
時間用の「time_t」を使って変数「jikan」を宣言しました。
ここに時間の情報を入れる時は
time(&jikan);
先ほどの「time()」命令を使って先頭に「&」アンパサンドをつけたこの変数を入れます。
ただ調べたい時は「NULL」、変数に保存したい時は「&変数」みたいな感じです。
/*最終日 プログラム1*/ #include <stdio.h> #include <time.h> int main(){ time_t jikan; time(&jikan); printf("%ld\n",time(NULL)); printf("%ld\n",jikan); return 0; }
「time()」など時間に関する命令を使う時は
#include <time.h>
こちらを先頭に加えます。
「time()」命令をそのまま使った場合と変数に保存した場合と2種類で表示してます。
printf("%ld\n",time(NULL)); printf("%ld\n",jikan);
ケタ数が多い時は「%d」ではなく、「%ld」というので表示します!
実行結果は少し違うかもしれませんが、時間?と思える数字が出てきたと思います。
3、4年昔前までのPCだと西暦1970年ぐらいからスタートした合計の秒数で時が管理されているので、こんな値がでてきます。(2017.2現在)
1486515392(秒) ÷ 60 = 24775257(分)
24775257(分) ÷ 60 = 412921(時間)
412921(時間) ÷ 60 = 17205(日)
17205(日) ÷ 365 = 47(年)
1970年 + 47年 = 2017年
なんとなくそんな値になりますね!
こんな計算を毎回して時間を表示するのかというと、そんな事はありません。
今回は親切な誰かが作ってくれた「時間構造体」というのを使います。
struct tm;
こちらが時間構造体になります。
構造体は自分で作るだけではなく、もう誰かがまとめた方がいいと思った共通する情報なんかを構造体にまとめてくれている場合があります。
これは使い方を見た方が早いと思いますので、さっそく使ってみましょう!
広告
/*最終日 プログラム2*/ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> int main(){ time_t jikan; struct tm *jikan_set; time(&jikan); jikan_set = localtime(&jikan); printf("%d年",jikan_set -> tm_year + 1900); printf("%d月",jikan_set -> tm_mon + 1); printf("%d日",jikan_set -> tm_mday); printf("%d時",jikan_set -> tm_hour); printf("%d分",jikan_set -> tm_min); printf("%d秒\n",jikan_set -> tm_sec); return 0; }
まずは「time_t」と「struct_tm」を使って時間変数と時間構造体変数を決めます。
time_t jikan; struct tm *jikan_set;
「jikan」と「*jikan_set」が変数名になります。
時間構造体の方は「*」を付けてポインタにしている所に注意です!
次に「jikan」の方にさきほどと同じく時間を保存します!
time(&jikan);
そして「jikan」に保存されたさきほどの西暦1970年から続く秒数を「localtime()」というのを使って時間構造体へと変換、先ほどの時間構造体へと保存しなおします。
jikan_set = localtime(&jikan);
ここもまた「&」アンパサンドが先頭につくので注意です!
「jikan_set」に保存された時間を表示する時はポインタにしたので、「->」を使って表示します!
それぞれの時間の単位は
tm_year・・・年
tm_mon・・・月
tm_mday・・・日
tm_hour・・・時
tm_min・・・分
tm_sec・・・秒
こちらになります。
年を表す「tm_year + 1900」と月を表す「tm_year + 1」だけ見たとおり数を足してあげないときちんと表示されないので、注意です!
では時間を調べる命令を学んだ所で、乱数の使い方を学びましょう!
たとえば0~99までの数をランダムに発生させてみたい時は
srand((unsigned)time(NULL)); printf("%d ",rand() % 100);
ずばりこちらになります!
「rand() % 100」の数字を50にすれば0~49までの数が発生します。
ここでは「srand()」命令と「rand()」命令と2つの命令が使われております!
「srand()」命令は乱数の「最初の数」を決める命令で、そこにさきほどやった「time(NULL)」という時間を調べる命令を使ってます。
実は乱数は乱数らしくみえる数を表示させてるだけで、この「最初の数」が同じだとプログラムを実行するたびに同じ乱数がでてきてしまうので常に変化する数、「時間」を使って「最初の数」を変化させてるワケです。
「unsigned」っていうのは、時間がマイナスの数字だったらプラスにしましょう!意味です。
次に「% 100」ですね!
printf("%d ",rand() % 100);
この「% 100」をぬいて
printf("%d ",rand());
とするとコンパイラの設定にもよりますが、だいたい0~30000の間の数字が乱数として発生します。
そして「%」は余りを表す事を計算の所で学びました。覚えておりますでしょうか?
なんでこれが「0~99」になるかというと、適当に1~100まで数を10個ぐらい書いてみましょう!
「98 44 37 1 8 33 12 3 82 10」
これを「30」でそれぞれ割ってみて余りをみてみましょう!
98 ÷ 30 = 3 余り 8
44 ÷ 30 = 1 余り 14
37 ÷ 30 = 1 余り 7
1 ÷ 30 = 0 余り 1
8 ÷ 30 = 0 余り 8
33 ÷ 30 = 1 余り 3
12 ÷ 30 = 0 余り 12
3 ÷ 30 = 0 余り 3
82 ÷ 30 = 2 余り 22
10 ÷ 30 = 0 余り 10
なんとなくわかりましたでしょうか?
余りっていうのは文字通り「余った数」なので割る数が「30」だったら必ずそれより小さい数になるのです!
/*最終日 プログラム3*/ #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int i; int ransu; srand((unsigned)time(NULL)); for(i=0;i<10;i++){ ransu = (rand() % 100); printf("%d ",ransu); } printf("\n"); return 0; }
「rand()」命令「srand()」命令を使う時は
#include <stdlib.h>
こちらを先頭に加えます!
あとは説明どおりですね!
たとえばこれで「rand()%100」で0~99までの数を発生させてその数に対して「if」命令や「switch」命令などを使って
「0~30」→30%
「31~99」→70%
のようにすれば確率のように枝分かれさせたりする事もできます!(正確にこの確率になるワケではないです!)
これにて「小学生でもわかるC言語2」を終了したいと思います!
最後までお付き合いいただいた方は感謝です!
このサイトを通して少しでもプログラミングの楽しさを感じていただけたら幸いです!
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |