(続き)
条件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 を参照のこと。
ここまでに習ったことを組み合わせると、 「二元の連立一次方程式を解く」「二次方程式を解く」 などのプログラムが作れるはずである。 興味のある人はどんどんやってみよう。 二次方程式は実係数の場合だけを扱えばよいが、 解が虚数の場合も答えを出すようにするとなおよい。
== sin.c =================================================== /* 「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 したんだぞ、という意味でつけてある。
C言語でくり返しを実行させる方法には三種類あるが、 ここでは for と while だけを説明し、 do-while はとりあげない。 K&R2 では §1.2, 1.3, 3.5 を見よ。 do-while は §3.6 にある。
for (文1; 式2; 文3) { ... }
while (式) { ... }
for も while も、 中カッコの中(ループ本体)が一度も実行されないこともありえる。
#include <stdio.h> /* ユーザが数を入力すると,1 からその数までの和を出力 */ main() { int i, n, sum; printf("いくつまで足しますか?\n"); scanf("%d", &n); sum = 0; for (i = 1; i <= n; i++) { sum = sum + i; } printf("1 から %d まで足すと %d です.\n", n, sum); }
i++ は「i を 1 だけ増やせ」、 i-- は「i を 1 だけ減らせ」の意味。 それぞれ「i = i+1」「i = i-1」と書いても同じこと。 これらは等式としては正しくないが、 「i に i+1 を代入せよ」 「i に i-1 を代入せよ」の意味だから問題ない。
(この項、続く)