/* たし算 1990-04-28, written by Iwase */ #include <stdio.h> main() { int a, b, sum; /* 変数の宣言 */ a = 2; /* 代入 */ b = 3; sum = a + b; printf("%d たす %d は %d です.\n", a, b, sum); }
K&R2 §1.2 が参考になるが、 そこのプログラム例はループを含む分だけこれよりむずかしい。
コンピュータの中は有限なので、 int 型ですべての整数を表わせるわけではない。
%d の代わりに別のものを書くと数の出力法が変わる。 興味のある者は K&R2 §1.2 の終わり近く、§7.2, §B1.2 を見よ。
算術演算子については K&R2 §2.5 を見よ。 ベキ乗を表わす演算子はC言語にはないことに注意。 int 型どうしの割り算では小数点以下は切り捨て。 % については例えば 10 % 3 は 1 となる。
演算の優先順位は数学の場合と同じ。必要ならば小カッコ「( )」を使う。 中カッコ「{ }」、大カッコ「[ ]」 をこの目的に使ってはならない。
「-」は c = -b/a のように「符号を変える」の意味でも使える。
#include <stdio.h> main() { int a, b; printf("数を入れてください.\n"); scanf("%d", &a); /* 数の入力 */ printf("もう一つ数を入れてください.\n"); scanf("%d", &b); printf("%d たす %d は %d です.\n", a, b, a+b); }
「数の入力」の行。 ここでプログラムは止まってキーボードからの入力を待つ。 変数名 a の前に & がついて &a となっていることに注意。 なぜ & が必要かは、いまは説明できない。
scanf() は K&R2 §7.4 で論じられているが、 いま読んでもむずかしいだろう。
#include <stdio.h> main() { double a, b; printf("数を入力してください.\n"); scanf("%lf", &a); printf("もう一つ数を入力してください.\n"); scanf("%lf", &b); if (b == 0) { /* if による分岐 */ printf("0 では割れません.\n"); } else { printf("%f 割る %f は %f です.\n", a, b, a/b); } }
入力 | 出力 | |
---|---|---|
int | scanf("%d", &a); | printf("%d", a); |
double | scanf("%lf", &a); | printf("%f", a); |
if (条件1) { 文1 } else { 文2 }は次のように動作する。 「条件1をまずチェック。 それが真ならば文1を実行し、文2は飛ばして先へ進む。 条件1が偽ならば文1は飛ばし、文2を実行して先へ進む」。
if (条件1) { 文1 } else if (条件2) { 文2 } else if (条件3) { 文3 } else { 文4 }は次のように動作する。 「条件1が真ならば文1だけを実行する。 条件1が偽で条件2が真なら文2だけを実行する。 条件1も条件2も偽で条件3が真ならば文3だけを実行する。 条件1も条件2も条件3も偽なら文4だけを実行する」。 文のうち一つだけが実行されることに注意。
条件1が真ならば文1を実行し、 偽ならば何も行わない、という場合は
if (条件1) { 文1 }とする。
K&R2 では §3.2 を参照。 そこでは省略可能なカッコは省略しているが、 このプリントのように全てつけておくほうが、間違いが少ない。
if (...) の中で使える記号は、数学上の記号と少々異なる。
C言語での記号 | < | > | <= | >= | == | != |
---|---|---|---|---|---|---|
数学上の記号 | < | > | ≦ | ≧ | = | ≠ |
「==」(等号二つ)には特に注意すること。 「=」は代入の記号だったので比較の意味では使えない。 「if (b = 0)」 も文法的には正しいのでコンパイラはメッセージを出さないが、 「もし b が 0 に等しかったら」という意味ではない。
他のプログラム言語では「=<」「=>」 と書いても「≦」「≧」の意味になることがあるが、 C言語はそうではない。
「if (a+b < c+d)」のように if の小カッコ内で計算をすることもできる。
K&R2 では §2.6, A7.9, A7.10 を参照のこと。
/* 「gcc ファイル名 -lm」としてコンパイルすること */ #include <stdio.h> #include <math.h> /* sin */ #define PI 3.14159265 main() { printf("%d 度の正弦は %f です.\n", 30, sin(30*PI/180)); }
「#define ...」の行は、 「以下で PI が出てきたら 3.14159265 で置き換えろ」という意味である。 このような定数は大文字で書く習慣である。 これについては K&R2 の §1.4 を参照のこと。
関数 sin を使うには、 プログラムの3行目にあるように math.h の include が必要である。 また、コメントにもつけておいたように 「-lm」(エル、エム)をつけてコンパイルする必要がある。 つけないでコンパイルしたらどうなるか、試してみるとよい。
ほかの数学関数については K&R2 の § 7.8.6, B4 を見よ。
3行目の「/* sin */」というコメントは、 関数 sin を使うから math.h を include したんだぞ、という意味でつけてある。
ここまでに習ったことを組み合わせると、 「2×2行列の積」「2×2行列の逆行列」 「二元の連立一次方程式を解く」「二次方程式を解く」 「等差数列の初項と公差、第何項目かを入力するとその項の値を出力する」 「等比数列の初項と公比、第何項目かを入力するとその項の値を出力する」 などのプログラムが作れるはずである。 興味のある人はどんどんやってみよう。