簡単なプログラム


簡単なプログラム

まずは、次の簡単なプログラムを見て欲しい。

#include <stdio.h>

int main(void) {
    int price1, price2, sum;

    printf("Please type the price 1: ");
    scanf("%d", &price1);
    printf("Please type the price 2: ");
    scanf("%d", &price2);
    sum = price1 + price2;
    printf("Sum of price is: %d\n", sum);
    return 0;
}
sum.c

2つの数値を入れ、それを足すだけである。

このプログラムを元に、Cのプログラムの一般的な約束事を述べる。

以下、本文の中に出てきた様々なものについて、解説する。

#include <stdio.h>

先頭の
#include <stdio.h>
は、プログラム中に出て来たprintfを使うために必要な ものである。実は、「#include <ファイル名>」 は、システムのどこか(普通のUNIXでは/usr/include)に ある「stdio.h」というファイルのこの部分に読み込め、 という命令である。その中には「printfのプロトタイプ宣言」 と呼ばれるものが書かれているが、この意味はまだ分からなくて良い。

return 0;

最後のreturn 0;は、とりあえずこう書くものと思っていて欲しい。 関数の戻り値を返しているだけだが、誰に返して誰が受け取っているのかなど、 正確な説明はもう少し後で。

変数と代入文

    int price1, price2, sum;
の部分は変数の宣言である。intは整数型(整数が入る変数)であることを 指定し、price1price2sumが変数の名前である。

printf

printfは、文字列を表示する関数である。
printf("Please type the price 1: ");
で、「Please type the price 1: 」と表示する。 文字列は、このように「"」で囲う。

また、

printf("Sum of price is: %d\n", sum);
のように、「%d」があると、その部分は文字列の 後で指定した値で置き換えられる。例えば、
printf("abc%ddef%dghi", 100, 2);
で、「abc100def2ghi」と表示される。 末尾の「\n」は、そこで改行することを示す。

なお、「%d」は表示したい値が整数の場合で、 そうで無い場合は、次の表に従う。

%d 整数を10進数で表示
%c 文字を表示
%s 文字列を表示
%f 浮動小数点数(0.0314のように表示。)
%e 浮動小数点数(3.14e-02のように表示。この表示で、3.14×10-2の意味。)
%g 浮動小数点数(%fと%eのうち短い方で表示)
%% ただの「%」という文字
%.15g %gで有効数字15桁まで表示
(printfのフォーマットは非常に多機能でここに全ては書ききれない。)

scanf

scanf("%d", &price1);
で、キーボードから数値を入力し、その値を price1という変数に代入する。 変数の前に付いている「&」は 「アドレス演算子」と呼ばれるものでポインタと 深い関りがあるが、ここでは触れない。 こう書くものと思って欲しい。

scanfの場合も%の部分は変数の型によって次のように 使い分ける。printfと似ているが少し違うので注意。

%d 整数を10進数で入力
%c 文字
%s 文字列
%f,%e,%g 浮動小数点数(float型)
%lf,%le,%lg 浮動小数点数(double型)

算術演算子と式

算術演算子と変数や定数を組み合わせて、式を構成する。 算術演算子は、

+加算
-減算、符号反転
*乗算
/除算
%剰余

がある。*/%は、+-よりも 優先順位が高く、また括弧()を利用して優先順位を変更することも出来る。

    x = 10 - 2 * 5;
    x = (10 - 2) * 5;
同じ優先順位なら左側の方が強い。例えば、 a - b - c は (a - b) - c と解釈される。 演算子の優先順位は間違えやすいので、少しでも迷ったら括弧を使うべき。

また、省略形として +=-=*=/=%=という 演算子がある。例えば、

    x = x + 10;
    x += 10;
と書くことが出来る。

簡単なプログラム2

次に浮動小数点数を使った例を示す。直角三角形の直角を挟む2辺の長さから、 斜辺の長さを計算し表示する。

#include <stdio.h>
#include <math.h>

int main(void) {
    double a, b, c;

    printf("input length1: ");
    scanf("%lf", &a);
    printf("input length2: ");
    scanf("%lf", &b);
    c = sqrt(a * a + b * b);
    printf("length3 is: %f\n", c);
    return 0;
}
tri.c

scanfprintfの使い方は先に述べた。

ここで出て来た

#include <math.h>
は、数学関数(ここではsqrt)を使うために必要なものである。 また、数学関数を使ったプログラムをコンパイルするときは、
% cc -o tri tri.c -lm
%
のように、-lmを付加する必要がある。なお、これを 付加する位置は重要で、 必ずソースファイル(tri.c)より後に 指定しなければならない。 すなわち、
% cc -o tri -lm tri.c
%
は間違い。

数学関数

主な数学関数は、以下のようなものがある。

floor 切り捨て
ceil 切り上げ
fabs 絶対値
sqrt 平方根
exp 指数関数
log 対数関数(底はe)
log10 対数関数(底は10)
pow(x,y) xのy乗
cos コサイン
sin サイン
tan タンジェント
asin アークサイン
acos アークコサイン
atan アークタンジェント
sinh ハイパボリックサイン
cosh ハイパボリックコサイン
tanh ハイパボリックタンジェント

なお、上の例題 tri.c では、a2pow(a, 2) ではなく a*a と 書いているのに注意。

powは非整数や負のベキ(a1.5とかa-2)に 対応するため、一般にpow(x,y)=exp(y*log(x))のような実装になっている。 そのため計算時間がかかる。 よって、x2やx3などの簡単な計算では、 pow(x,2)やpow(x,3)とは書かずにx*xやx*x*xと書くとよい。


簡単なプログラム