【初心者向け】情報学部生と学ぶC言語 [2限目:様々な型と配列]

今回は前回に少しだけ触れたについて勉強していこうと思います。その過程で配列の知識も必要になってくるので配列についても抑えていきましょう。

前回の復習

型にはどんな種類があったのかおさらいしておきましょう。下の表を見てください。

 
型名とその意味
型名 意味
int 整数型
double 浮動小数点数型(8バイト)
float 浮動小数点数型(4バイト)
char 文字型
void 型なし

ではそれぞれの型について確認していきましょう。

int型

int型とは、整数を扱うための型で、サイズは4バイトです。バイトというのは情報量の単位のことで1バイト=8ビットとなります。ビットも同じく情報量の単位のことなのですが、こちらは最小単位となります。コンピュータは0と1の二つの値を組み合わせて情報を扱う(=2進数)ので、1ビットとは取り扱っているデータの一桁目が”0″か”1″かを表現していると思ってください。以下の表で2進数の3ビットで表現できる数字を確認しましょう。

 
3ビットまでで表現できる数字
ビット表現
(2進数)
普段扱う数字
(10進数)
ビット表現
(2進数)
普段扱う数字
(10進数)
0 0 100 4
1 1 101 5
10 2 110 6
11 3 111 7

表からもわかるように3ビット(桁)で0〜7の8個(2個)の数字を表現することができます。

nビットで表現できる数字の数は2n表現できる範囲の数字は0〜2n−1ということです。

***説明のため正の数に限定していますが負の数が入ってくると表現できる範囲は変わることに注意しましょう***

では4バイトのとき表現できる数字の数と範囲について考えてみてください。

4バイト = 4 × 8 ビット より
数字の数:232
範囲:0〜232−1

では二つのint型の数字の平均を計算するプログラムを作成してみましょう。

/***
filename:average.c
***/

#include<stdio.h>
int main(void)
{
int num1,num2;

printf("一つ目の数字を入力してください:");
scanf("%d",&num1);
printf("二つ目の数字を入力してください:");
scanf("%d",&num2);

printf("ふたつの値の平均は %d です\n", (num1+num2)/2);

return 0;
}
■実行結果<例>
一つ目の数字を入力してください:24
二つ目の数字を入力してください:11
ふたつの値の平均は 17 です

二つの平均値は17ってなってるけど、、、
(24+11)/2=17.5だよね?

鋭い指摘ですね。int型では小数部は切り捨てられます。そこで次に浮動小数点数を扱えるdoubleとfloatについて学んでいきましょう。

double(float)型

double(float)型について理解するために上のプログラムを改変した下のプログラムを作ってみましょう。

/***
filename:average_double.c
***/

#include<stdio.h>

int main(void)
{
	int num1,num2;
	double ans_d;
	float ans_f;
	
	printf("一つ目の数字を入力してください:");
	scanf("%d",&num1);
	printf("二つ目の数字を入力してください:");
	scanf("%d",&num2);
	
	ans_d = num1 + num2; //ans_d = (num1+num2)/2; としないことに注意
	ans_d = ans_d/2;
	
	ans_f = num1 + num2;
	ans_f = ans_f/2;
	
	
	puts("ふたつの値の平均は");
	printf("	double型ans:%f\n", ans_d);
	printf("	float型ans:%f\n", ans_f);
	printf("	キャスト:%.1f\n", (double)(num1 + num2) / 2); //(num1+num2)をdouble型にキャスト
	puts("です");
	
	return 0;
}
■実行結果<例>
一つ目の数字を入力してください:24
二つ目の数字を入力してください:11
ふたつの値の平均は
double型ans:17.500000
float型ans:17.500000
キャスト:17.5
です

実行結果からもわかるようにdoubleとfloatでは小数を扱えるということにおいて違いはありません。両者の違いは扱える範囲で、double型の方が広い範囲を扱えるよくらいの認識で大丈夫です。

ソースコードの説明

double型をprintfで出力するためには、変数指定フォーマットは%fとする必要があります。この時小数第6位まで表示されます。

ans_d = num1 + num2; //ans_d = (num1+num2)/2; としないことに注意
ans_d = ans_d/2;

の部分ですが、上の行ではint型の変数 num1 + num2 をdouble型の変数 ans_d に変換しています。上の例で言えば、num1 + num2 は 24 +11 なので 35 になります。それをdouble型に変換するので 35.000000 となります。
そして2行目で35.000000を2で割っているためans_dには17.500000が格納されているということになります。

“//ans_d = (num1+num2)/2; としないことに注意”とありますがなぜこれがダメなのでしょうか?

これは、35/2を計算した結果(=17[int型であるから小数点切り捨て])をdouble型に変換することになってしまい、ans_dに格納された数字は 17.000000 になってしまうということが問題です。

printf("	キャスト:%.1f\n", (double)(num1 + num2) / 2); //(num1+num2)をdouble型にキャスト

キャストとは、上で行った、ans_d = num1 + num2; の操作と似たようなもので、あらかじめ宣言していた型から別の型に変換するときに使います。
(double)(num1 + num2) の部分がキャストを行っている部分で、
(型名) 変数名
で宣言します。

また変数指定フォーマットを%.1fとしていますが”.1″とつけることで小数点第1位まで表示してくださいという指示を送ることができます。

このプログラムではint型のnum1とnum2をdouble型に変えるということを行っていますが、最初から
double num1,num2;
と宣言しておくという手法もあります。

そのとき、scanfの変数指定フォーマットは%lf(エルエフ)としなければならないことに注意しましょう。

scanf("%lf", &num1);

char型

続いては文字型のcharについてみていきましょう。

charは文字を格納する変数を扱うための型です。以下のプログラムで確認していきましょう。

/***
filename:char.c
***/

#include<stdio.h>

int main(void)
{
	char s1[] = "A";
	char s2[] = "ABC";
	
	printf("s1の文字列は %s\n",s1);
	printf("s2の文字列は %s\n",s2);
	printf("s2の文字列の1文字目は %c\n",s2[0]);
	printf("s2の文字列の2文字目は %c\n",s2[1]);
	printf("s2の文字列の3文字目は %c\n",s2[2]);
	printf("s2の文字列の4文字目は %c\n",s2[3]);
	
	return 0;
}

このソースコードを理解するためにはまず、配列について学ばなければいけません。一緒に確認していきましょう。

配列

配列は
型名 変数[要素数]
で宣言します。

変数とは文字や数字を格納するための箱のようなものです。配列はその箱を要素数ぶんだけ並べたものだと思ってください。図に示すとこんな感じ。

配列の要素数は指定しなければ、宣言された時の文字列と文字列の終わりを表す”\0″の分だけ用意されます。ですから上の変数sの配列の要素数は”ABC”と”\0″を合わせて4つということになります。
要素数は0番目から始まるので格納された文字のn番目を呼び出したいときには、
変数[n-1]
と宣言しなければいけません。

ソースコードの説明

printfで文字を出力するときの変数指定フォーマットは%sです。
逆に一文字だけ出力するときには%cを使います。



様々な型が扱えるようになったことで、作成できる範囲が広がったのではないかなと思います。
次回はif文やfor文など条件分岐について扱っていきます。条件分岐では配列が活躍するので、復習しておきましょう。

C言語学習におすすめのテキストはこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です