2004 年度「計算機基礎論3B」 2004-10-22

(続き)

条件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言語でくり返しを実行させる方法には三種類あるが、 ここでは forwhile だけを説明し、 do-while はとりあげない。 K&R2 では §1.2, 1.3, 3.5 を見よ。 do-while は §3.6 にある。

    for (文1; 式2; 文3) {
        ...
    }
    while (式) {
        ...
    }

forwhile も、 中カッコの中(ループ本体)が一度も実行されないこともありえる。

#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」と書いても同じこと。 これらは等式としては正しくないが、 「ii+1 を代入せよ」 「ii-1 を代入せよ」の意味だから問題ない。

(この項、続く)


岩瀬順一