変数には型がある
変数というものを扱い始めてそれなりに時間が経ちました。だいぶその概念にも馴染めたのではないでしょうか。
ところで今まで使ってきた変数は皆「int型の変数」というもので、整数しか扱えないものでした。
このままでは永遠に小数を変数に格納したりなんてことはできなさそうです。
変数について説明するとき
C言語では文字を格納する変数、整数を格納する変数、小数を格納する変数、などがそれぞれ区別されています。
ということを書きました。C言語ではその中に格納されるデータの種類やその大きさに応じて変数の種類がある程度決まっているわけです。
これを型と呼んでいます。int型の変数というのは「intという型の変数」ということだったわけですね。
型は色々種類があります。一覧してみましょう。
名前 |
範囲 |
int |
-2,147,483,648~2,147,483,647 |
char |
-128~127 |
float |
-3.40282*1038 ~ 3.40282*1038 |
double |
省略(floatより扱える範囲が大きい) |
他にもたくさんあるわけですが、FPで使うのは多分これくらいです。もしかしたらlongというintよりも扱える範囲が大きい整数の型も出てくるかもしれないです。
基本的には上2つが整数を扱う型で、下2つが小数を扱う型です。
しかしcharを整数を扱う型としてそのまま使うことは少なく、文字一文字を入れる型として使うことが多いです。
(コンピュータの中では文字も数字として扱われているということはコンピュータ・リテラシーでやったと思います)
じっさいにこれらの型の変数を使ってみるとこんなかんじです。
上のソースでさり気なく使っていますが、//という文字を書いておくとそれより後ろにかいた文字はすべてプログラムとは無関係としてコンパイルの時に無視されます。
この機能を使うとソースコードにメモ書きができるので長いソースコードを書くときに便利ですね。
この機能はコメントと呼ばれているので、覚えておきましょう。ソースコードを書くときにコメントを付ける癖をつけておくと後で助かることが多いです。
型変換
複数の型が出てくると、違う型の組み合わせの計算をしたときにどうなるのかが気になります。そのことについて触れてみましょう。
暗黙的な型変換
本来違う型同士では計算をすることができません。しかしこっちが特別ソースコードに書かなくてもコンパイラ側で無難に型を合わせてくれるようになっています。
これを暗黙的な型変換と呼んでいます。まあことばよりも実際に何をしているのかを見てみるほうが大事ですので見てみましょう。
代入
代入の時には左側の変数の型に合わせられます。
1 int a;
2 double pi = 3.14;
3
4 a = pi;
piには3.14という小数が入っていますが、aに代入するとaはint型なので、小数点以下は全て切り捨てられて3が代入されます。
数式
数式の中に違う型の変数が出てきたときは、一番精度の高い型に合わせられます。
整数だけしか表せない型よりも小数も表せる型の方が精度が高いですし、またfloatよりもdoubleのほうが表せる数が多いので
char < int < float < double
の順で精度が上がって行きます。
これだと、7.5がcに格納されます。
キャスト
強制的に別の型にしたいということがたまにあります。例えば
とすると、int型同士の割り算なので答えもint型になり、小数点以下は切り捨てられてcには2.0が代入されます。
しかし小数の答えである2.5が欲しいことがあるでしょう。そういう時は強制的に型をint型でなくdouble型にすればよいのです。
さっきのプログラムと違うのは、(double)というのが増えている点です。こう書くと後ろのa / bの結果が強制的にdouble型になります。
これを明示的な型変換、あるいはキャストといいます。
すすんだprintfの使い方
小数を格納する変数があつかえるようになったところで、printfでも小数を自在に扱う方法を学ぶことにしましょう。
今まで整数をprintfで表示するときは
1 int chokin = 0;
2 printf("alstamberの貯金は%d円です\n", chokin);
のように%dを使ってきました。しかし%dはあくまで整数を10進数表示するためのものなので小数には使えません。
小数には%fをつかいます。
1 double gpa = 3.14;
2 printf("alstamberのGPAは%f円です\n", gpa); //嘘です
3
わざわざ%dの説明で10進数と書いているのは、8進数や16進数で出力する方法もあるからです。
8進数で出力するには%o、16進数で出力するには%xをつかいます。またchar型から一文字出力するには%cを使います。
1 int a = 10;
2 printf("10を16進数で書くと%xです\n", a); //aと出る。
3
更に実は、出力される数字の桁数も制御できます。まずは整数から。
続いて小数。
すすんだscanfの使い方
printfときたら、scanfでも小数を扱えるようにしたいですね。整数の入力では%dを使いましたが文字では%c、小数では%fか%lfを使います。
なぜ2つあるかというと、float型では%f、double型では%lfと分かれているのです。printfではどちらの型でもおなじ%fです。scanfとprintfの違いの一つなので覚えておきましょう。
演習問題
問一 キーボードから半径[cm]を入力させ、円の面積[cm2]を求めるプログラムを作りなさい。なおπ=3.14とします。また小数点以下の表示を4ケタになるようにしてください。
半径は? 3.1 半径3cmの円の面積は30.1754cm2です。