画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語2 目次/最終日 時間と乱数

広告

[C言語 入門 小学生でもわかるC言語2]
最終日 時間と乱数

広告

↓発売日:2018年09月22日↓

たった1日で基本が身に付く! C言語 超入門

新品価格
¥2,225から
(2018/10/8 23:10時点)

目次へ戻る

時間と乱数

いよいよ最終日です!

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

今回は現在の時間を調べる方法と乱数について見ていきます。

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

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

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

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

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

「time()」命令

時間を調べるには「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;
}

■実行結果■

画像(ce_14_1)

「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;
}

■実行結果■

画像(ce_14_2)

まずは「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()

ここでは「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;
}

■実行結果■

画像(ce_14_3)

「rand()」命令「srand()」命令を使う時は

#include <stdlib.h>

こちらを先頭に加えます!

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

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

「0~30」→30%

「31~99」→70%

のようにすれば確率のように枝分かれさせたりする事もできます!(正確にこの確率になるワケではないです!)

お疲れ様です!

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

最後までお付き合いいただいた方は感謝です!

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

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓発売日:2016年02月29日↓

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

新品価格
¥2,462から
(2018/10/8 23:25時点)

↓発売日:2018年06月22日↓

スッキリわかるC言語入門

新品価格
¥2,916から
(2018/10/8 23:15時点)

↓発売日:2018年03月09日↓

C言語本格入門 ~基礎知識からコンピュータの本質まで

新品価格
¥3,218から
(2018/10/8 23:16時点)

↓発売日:2017年06月14日↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2018/10/8 23:17時点)

↓発売日:2018年05月21日↓

作って身につく C言語入門

新品価格
¥2,462から
(2018/10/8 23:18時点)

↓発売日:2017年12月07日↓

新・標準プログラマーズライブラリ C言語 ポインタ完全制覇

新品価格
¥2,678から
(2018/10/8 23:19時点)

↓発売日:2017年02月08日↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2018/10/8 23:20時点)

↓発売日:2017年09月26日↓

かんたん C言語 [改訂2版] (プログラミングの教科書)

新品価格
¥2,916から
(2018/10/8 23:22時点)