ここではコンピュータを使った簡単な計算について学びます。計算結果の表示は次の回で行いますので、ここでは計算のみです。
とてもはやいです。
どれだけはやいか?
int main(){ int i,j,a; for(i = 0; i < 10000; i++){ for(j = 0;j < 10000; j++){ a=2*3*4; } } }
上のプログラムは2×3×4を1億回計算するプログラムです。表示はしませんが・・・。
これが何秒で終了するか、実際にコンパイルして試してみてください。(作者環境では1秒以下でした)
(※forは別の機会に登場します。)
これだけ速いと、大量の計算をさせることができます。手で一つ一つ計算すると面倒な行列の計算もあっという間に終わります。便利ですね。
コンピュータは計算機ですので、計算ができます。文字表示とかもしますが、計算が本職です。巨大な電卓のようなものと考えてOKです。
電卓は計算結果を画面に表示して、終了です。
一方、コンピュータは計算直後にその結果を直接画面に出すようなことはしません。一度メモリに取り込んでおいて、それをprintfなどで画面に出力することによって初めて画面に表示できます。コンピュータは多くのデータ、計算結果を保持できます。
変数には大きく分けて整数型と浮動小数点数型の2種類があります。整数型は小数点以下が表現できません。浮動小数点数型は有効数字何桁かと桁数によって表現します。
計算速度は整数型の方が速いですが、簡単な計算ならそれほど変化ありません。
変数型の種類を下に示します。サイズが大きい程大きな数値を表現できます。
(※64ビットOSの場合。上記サイズは環境によります。必ずしもこうではありません。特にlong型。)
よく分からなければとりあえずdoubleを使えばいいでしょう。
変数の宣言は、上に挙げた変数型と変数名を書きます。変数名はなんでも構いません。ただし、大文字と小文字は区別されますので注意してください。
short abcd; int ball; double Foo;
↑はshort型の「abcd」、int型の「ball」、double型の「Foo」という3つの変数を定義しています。
カンマ区切りで複数の変数を宣言することもできます。次の2つは同じ意味です。
int a,b,c;
int a; int b; int c;
また、変数は初期状態ではでたらめな数字が入っています。ありがちなミスとして、変数を定義して、そのまま使って、でたらめな数字を参照するということがあります。数字は定義してから、適当な数字で初期化する必要があります。後で値を代入して使用することもできますが、宣言時に適当な値で初期化することも可能です。
/* 変数宣言時に初期化 */ int a = 0; int b = 5;
/* 変数使用前に初期化 */ int a; int b; /* 中略(この部分で変数aや変数bを使用してはいけない) */ a = 0; b = 5;
計算は計算結果を変数に代入するように記述します。
#include <stdio.h> int main(){ double a; a = 1 + 2; return 0; }
aに1+2の結果が代入されました。C言語では「=」は代入と考えるとわかりやすいです。結果を画面に表示する方法は次のページで説明します。
引き算も同様に計算できます。
#include <stdio.h> int main(){ double a; a = 1 - 2; return 0; }
結果は-1です。
掛け算や割り算も足し算、引き算と同じですが記号が一般に使用されるものと異なります、掛け算は「×」ではなく、「*」を、割り算は「÷」ではなく「/」を使用します。また、割り算をした余りは「%」で表示できます。
/* 掛け算 */ #include <stdio.h> int main(){ double a; a = 3 * 2; /* a = 6 */ return 0; }
/* 割り算 */ #include <stdio.h> int main(){ double a; a = 10 / 2; /* a = 5 */ return 0; }
/* 割り算の余り */ #include <stdio.h> int main(){ double a; a = 10 % 3; /* a = 1 */ return 0; }
計算の順序は数学のルールが適用されます。すなわち、掛け算や割り算が足し算、引き算よりも先に計算されます。
#include <stdio.h> int main(){ double a; a = 8 + 2 * 7; return 0; }
この場合、掛け算が優先され、次のように計算されます。
8 + 2 * 7 = 8 + 14 = 22
足し算を優先的に計算させたい場合は括弧を使います。
#include <stdio.h> int main(){ double a; a = (8 + 2) * 7; return 0; }
この場合、8 + 2が先に計算されます。
(8 + 2) * 7 = 10 * 7 = 70
なお、括弧に使用できるのは丸括弧「(」、「)」のみでそれ以外の括弧(中括弧など)は計算の優先度設定には使用できません。丸括弧の中に丸括弧を入れて書くことは可能です。
#include <stdio.h> int main(){ double a; a = (8 * (2 + 6)) * 7; return 0; }
(8 * (2 + 6)) * 7 = (8 * 8) * 7 = 64 * 7 = 448
人間世界と同様、0での割り算はやってはいけません。エラーになります。
整数型の変数を用いて計算した場合、小数点以下は切り捨てられます。
#include <stdio.h> int main(){ int a; a = 1.2 + 3.2; return 0; }
1.2 + 3.2 = 4.4 ですが、変数が整数型(int型)なので、小数点以下は切り捨てられます。これは引き算、掛け算、割り算の場合も同じです。小数点以下まで計算したい場合は浮動小数点数型を使用しましょう。
#include <stdio.h> int main(){ double a; a = 1.2 + 3.2; return 0; }
aに4.4が代入されます。
複数の変数を用いて計算することにより、より高度な計算ができます。ユーザが入力した数値を用いて計算するなどもできます。
#include <stdio.h> int main(){ double a; double b; a = 7; /* a に 7 を代入した。 */ b = a + 8; /* a = 7 */ return 0; }
「/*」、「*/」で囲まれた部分はコメントです。実際のプログラムには影響しません。
途中でaに7を代入しており、bはそれに8を加算したものですから、bは 7 + 8 = 15となります。
整数型と浮動小数点数型など、型が違っていても普通に計算できます。ただし、計算内容によって小数点以下が切り捨てられたりします。
#include <stdio.h> int main(){ double a; double b; int c; c = 4; a = 2.2; b = a + c; /* c = 4, a = 2.2 : b = 6.4 */ c = a + b; /* c = 2.2, b = 6.4 : c = 8(整数型だから) */ return 0; }
例えば-4に-2をかける場合、
a = -4 * -2;
と書くとエラーになります。「*」と「-」の演算子が連続しているためです。
この様な計算の場合は、負の数を括弧で囲みます。
a = -4 * (-2);
ある計算式は次のように簡略化して記述することができます。
一番上を「インクリメント」、上から二番目を「デクリメント」といいます。
次のような記述は注意してください。左の記述方法で、右の計算が行われます。
次の問題の答えを考えてみましょう