C言語 入門 小学生でもわかるC言語2

最終日 乱数(らんすう)と時間

「わかりやすく!」がテーマです!

HOME/小学生でもわかるC言語2 目次/最終日 乱数(らんすう)と時間/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

?と思ったら

わからなそうな用語集

乱数(らんすう)と時間

いよいよ最終日です!

もう少しがんばりましょう!

今回は乱数(らんすう)と現在の時間を調べる方法について見ていきます!

乱数っていうのは簡単に言うと適当な数、ランダムな数になります!

これを使ってゲームなどの偶然に起こる事を表現します!

乱数と時間なんて、関係ないような2つですが、ちょこっと関係あります。

というか、乱数を表すのに時間を調べる命令が少し必要になります!

まずは時間を調べる命令を見ていきましょう!

時間を調べる

今まで何回もプログラムの最初に

#include <stdio.h>

と書いてきた、「#include <stdio.h>」の部分に新しい仲間が入ります!

#include <time.h>

意味はわからないけど、時間に関係ありそうな名前ですね!

実はこの先頭の部分は、そのプログラムで使う命令の集まりを書いたものなんです!

キホンはこの「<stdio.h>」ってやつだけで大丈夫なんですけど、時間を調べる命令とかはこの中に入ってないので

「<time.h>」という命令の集まりを使いますと、コンピューターに教えるワケです!

この命令の集まりをライブラリっていいます!

「time()」命令

時間を調べるには「time()」という命令を使います!

使う時は

time(NULL);

「NULL(ヌル)」というものを()カッコに書きます!

「NULL」とはなんだ?と言われますと、「何にもない」みたいな意味です。

関数の時に使った「void」と同じような意味と今は考えてもらえれば大丈夫です。

とりあえずは「time()」命令だけで時間は調べられますがもしその調べた時間を変数に入れたい時は、

「int」ではなく「time_t」というものを使います。

time_t jikan;

時間用の「time_t」を使って変数「jikan」を宣言しました。

ここに時間の情報を入れる時は

time(&jikan);

これで変数「jikan」に調べた時間の情報が保存されます。

プログラミング!

/*プログラム46*/
#include <stdio.h>
#include <time.h>

int main(){
	time_t jikan;
	time(&jikan);

	printf("%ld\n",time(NULL));
	printf("%ld\n",jikan);

	return 0;
}

■実行結果■

実行結果(e-14-1)

「time()」命令をそのまま使った場合と変数に保存した場合と2種類で表示してます。

printf("%ld\n",time(NULL));
printf("%ld\n",jikan);

ケタ数が多い時は「%d」ではなく、「%ld」というので表示します!

実行結果は少し違うかもしれませんが、時間?と思える数字が出てきたと思います。

一昔前までのPCだと西暦1970年ぐらいからスタートした合計の秒数で時が管理されているので、こんな値がでてきます。(2015.5現在)

1430977377(秒) ÷ 60 = 23849623(分)

23849623(分) ÷ 60 = 397493(時間)

397493(時間) ÷ 24 = 16562(日)

16562(日) ÷ 365 = 45(年)

なんとなくそんな値になりますね!

こんな計算を毎回して時間を表示するのかというと、そんな事はありません。

時間構造体

今回は親切な誰かが作ってくれた「時間構造体」というのを使います。

struct tm;

こちらが時間構造体になります。

構造体は自分で作るだけではなく、もう誰かがまとめた方がいいと思った共通する情報なんかを構造体にまとめてくれている場合があります。

これは使い方を見た方が早いと思いますので、さっそく使ってみましょう!

年月日に変換して時間を表示

/*プログラム47*/
#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;
}

■実行結果■

実行結果(e-14-2)

まずは「time_t」と「struct_tm」を使って時間変数と時間構造体変数を決めます。

time_t jikan;
struct tm *jikan_set;

「jikan」と「*jikan_set」が変数名になります。

時間構造体の方は「*」を付けてポインタにしている所に注意です!

次に「jikan」の方にさきほどと同じく時間を保存します!

time(&jikan);

そして「jikan」に保存されたさきほどの西暦1970年から続く秒数を「localtime()」命令というのを使って、時間構造体へと変換します!

localtime(&jikan);

そして変換された「jikan」を時間構造体変数の「jikan_set」へと保存しなおします。

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の間の数字が乱数として発生します。

そして「%」は余りを表す事を計算の所で学びました。覚えておりますでしょうか?

なんでこれが「1〜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」だったら必ずそれより小さい数になるのです!

まとめてプログラミング

/*プログラム48*/
#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;
}

■実行結果■

実行結果(e-14-3)

乱数を保存するのに「ransu」という変数を用意しました!

時間の時と同じく

#include <stdlib.h>

「rand()」命令「srand()」命令を使う時はこちらのライブラリを加えます!

あとは説明どおりですね!

たとえばこれで「rand()%100」で0〜99までの数を発生させてその数に対して「if」命令や「switch」命令などを使って

「0〜30」→30%

「31〜99」→70%

のように確率で枝分かれさせたりする事もできます!

お疲れ様です!

これにて「小学生でもわかるC言語2」を終了したいと思います!

お付き合い頂いた方は感謝です!

小学生でもわかるC言語3にてファイル操作のやり方など解説しております。

あとはゲームプログラミング入門として

C言語入門 STGの作り方

C言語入門 ブロック崩しの作り方

などもありますので興味ありましたらのぞいてみてください。

このサイトを通して少しでもプログラムの楽しさを感じていただけたら幸いです!

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本