/* たし算 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行列の逆行列」 「二元の連立一次方程式を解く」「二次方程式を解く」 「等差数列の初項と公差、第何項目かを入力するとその項の値を出力する」 「等比数列の初項と公比、第何項目かを入力するとその項の値を出力する」 などのプログラムが作れるはずである。 興味のある人はどんどんやってみよう。