2001 年度「計算機基礎論3B」 2001-11-20

関数を書く練習がまだの人は、それをやりましょう。 教科書 1.9, 1.10 のプログラム例はやや難しすぎると思うので、 それらに深入りすることはお勧めしません。

書いてはいけないプログラムの例

次のプログラムは、教科書の関数 power() を、 配列を使って計算するように書き換えてみたものです。 gcc でコンパイルでき、“正しく”動作しますが、 ANSI C の規格には合っていません。 関数 power() 内の配列 a[ ] の宣言が n のような変数を含んでいるからです。

===============================================================================
#include <stdio.h>

int power(int base, int n);

main()
{
    int i;

    for (i = 0; i < 10; i++) {
        printf("%d %d %d\n", i, power(2,i), power(-3,i));
    }
}


int power(int base, int n)
{
    int i;
    int a[n+1];         /* この宣言が問題 */

    a[0] = 1;
    for (i = 1; i <= n; ++i)
        a[i] = a[i-1] * base;
    return a[n];
}
===============================================================================
int a[101]; と宣言しておけば 100 乗まで OK なので、 このスタイルでプログラムを書きたいならそれがいいでしょう。

演習(の一例)

数の入力

scanf() は標準ライブラリにある関数で、数などの入力に使う。 次のサンプルで使い方を学べ。

== scanf.c ====================================================================
#include <stdio.h>

main()
{
    int n;
    double x;

    printf("整数 n の値を入力してください.\n");
    scanf("%d", &n);
    printf("浮動小数点数 x の値を入力してください.\n");
    scanf("%lf", &x);
    printf("n は %d, x は %f です.\n", n, x);

    printf("整数 n, 浮動小数点数 x の値を、スペースで区切って入力してください.\n");
    scanf("%d %lf", &n, &x);
    printf("n は %d, x は %f です.\n", n, x);
}
===============================================================================
scanf("%d", &n);int 型変数 n に、 scanf("%lf", &x);double 型変数 x に、 キーボードから値を入力できる、と(とりあえずは)覚えてほしい。 変数の前にある & については、いまは説明しない。 double 型変数は printf() では %f だったが scanf() では %lf であることにも注意。

教科書 1.9, 1.10 のアイディアを参考にして、 テストの最高点・最低点を出力するプログラムを書け。 得点は 0 点以上 100 点以下とし、 マイナスの数が入力されたら終わるようにせよ。 たとえば次のように動けばよい。

次の生徒の得点を入力してください。
36
いままでの最高点は 36 点、最低点は 36 点です。
次の生徒の得点を入力してください。
72
いままでの最高点は 72 点、最低点は 36 点です。
次の生徒の得点を入力してください。
50
いままでの最高点は 72 点、最低点は 36 点です。
次の生徒の得点を入力してください。
-1
これはあくまでも一例なので、細部は自分で考えて設計せよ。

数学(に出てくる)関数

教科書 205 ページ、315 ページに、数学(に出てくる)関数がまとめられている。 これらを使うには #include <math.h> が必要である。 また、授業で使っている gcc の約束として、 「gcc sqrt.c -lm」のように -lm (マイナス、エル、エム) をつけてコンパイルする必要がある。

== sqrt.c =====================================================================
#include <stdio.h>
#include <math.h>

main()
{
    double x;

    x = 2;
    printf("%f\n", sqrt(x));
}
===============================================================================
円周率πの値が必要なら、
#define PI 3.14159265358979323846
をコピーして利用するとよい。

ここまで準備をすると、数学に関連したプログラムが (書こうと思えば)かなり書ける。


岩瀬順一