応用理工学情報処理 1回目~4回目の復習

最小のプログラムの構成

実行プログラムのもとになるテキストファイルはソースプログラムまたはソースコードと呼ばれます。C言語のソースプログラムは拡張子を.cとします。以下のプログラムは、Hello world!と表示するプログラムです。

#include  <stdio.h>
 
int main(void)
{
    printf("Hello world!\n");

    return (0);
}

(a) 翻訳=コンパイル

ソースプログラムから実行プログラムを作成する場合には、以下の3つのプログラムが順に作用します。

(1)プリプロセッサ
 #で始まる命令を処理します。#include <stdio.h>は、stdio.hというC言語に用意されたファイルをこの位置に読み込みます。このほかに、#define PI 3.14 のような文字の置換命令をこれまでに学習しました。これらのプリプロセッサ命令文では末尾にセミコロン; が付かないことに注意して下さい。

(2)コンパイラ
 ソースプログラムの文字を構文解析して、コンピュータが理解できる機械語のオブジェクトファイルに変換します。

(3)リンカー
 C言語に標準で用意されたprintfのような関数はすべてコンパイル済のものがライブラリとして別のファイル(ライブラリファイル)に用意されています。リンカーによって、ソースプログラムのオブジェクトファイルとライブラリファイルとをリンクして実行プログラムを作成します。

(b)関数

 sin(3.14)のように特定の処理(この場合にはsinの計算)を行うために呼び出すプログラムを関数と呼びます。3.14と書いた部分をsin関数の実引数、その結果の値0を返り値と呼びます。変数xの値を2乗してyに代入する式は、y = x * x; ですが、この2乗する部分の関数を作成する場合には、引数はx、返り値はx * x となります。このような関数を利用するためには、実際に用いる前にどのような処理を行う関数なのかをmain関数の前で以下のように定義しておく必要があります。この定義部分の引数double x をこの関数の仮引数と呼びます。C言語ではmain関数の内部に他の関数の定義を書くことはできません。

double square(double x)
{
    return (x * x);
}
main関数はプログラムを実行したときにオペレーティングシステムから呼ばれる特殊な関数です。プログラムはmain関数から始まり、main関数が終了するとプログラム自体が終了します。main関数が返り値として0を持つのは、オペレーティングシステムにプログラムが正常に終了したことを知らせる意味があります。

(c)変数と型

 変数は使用する前に型を指定して宣言しておく必要があります。

 int型 整数型(integer):int n; printf(" %d\n", n); scanf( "%d", &n);
 double型 倍精度浮動小数点型(double precision floating point): double a; printf("%f\n", a); scanf("%lf", &a); //"エル"を忘れないように

(d)代入式と条件式

 イコール(=)は代入であって等しいという意味ではありません。式は値を持ちます。代入式は右から評価され、a = b = 5;はb = 5が5という値を持ち、それがaに代入されます。

 条件式は、関係演算子( <, >, <=, >=, ==, !=)と論理演算子( ||, &&)で構成された式で真の場合は1(ほとんどの場合)、偽の場合には0の値を持ちます。条件式は左から評価され、1 < 5 > 3 のような式の場合にはまず 1 < 5が真なので値が1となり、次に1 > 3が偽と評価されるため値が0となります。(C言語としては真は0以外の値であり1で無ければならないと決められているわけでは無い。)

(e)if文とfor文

 if文  if (条件式) 文; //条件式が真(0以外)であれば文;を実行します。複数の文を実行したい場合にはそれら全体を中括弧 { } で囲って複合文(ブロック)とします。

 for文 for (文1; 条件式; 文2) 文3; // まず文1を実行して、条件式が真ならば文3を実行した後に文2を実行します。条件式が真の間、(文3ー>文2)を繰り返します。

(f)インデント

最初に示したプログラムは、以下のように書いても問題無くコンパイルして実行することが可能です。

#include  <stdio.h>
int main(void){printf("Hello world!\n");return (0);}
しかし、このようにプログラムを記述すると内容が非常に読み取りにくくなります。理解しやすいプログラムを書くために、適切な改行やインデント(字下げ)は必要不可欠です。ソースプログラムを書くエディターにはかならず適切なインデントを行う機能が備わっています。ブロック{ }の内部やif文などの条件に応じて実行される部分は、一定の幅(半角4文字の場合が多い)だけインデントします。以下のプログラムは、今後の課題提出において必ず守って頂きたいインデントについて説明しています。
#include  <stdio.h> //#から始まるプリプロセッサ命令やmain関数外部の変数や関数宣言はインデントしない。
 
int main(void) // main関数やその他の関数のブロックはこのように改行して始めることが多いが、main(void) { という形もまれに見かけるのでこれもOKとする。
{
	int n = 1; // ブロック内部は必ず1段(通常は幅として小文字4字、2~8文字であればOKとする)インデントする。インデントの幅は全体で統一すること。通常はタブキーで設定する。
	
	if (n > 0){
		printf("n > 0\n");
	} else if (n  < 0) {
		printf("n  < 0\n");
	} else
		printf("n = 0\n"); //ブロックとしない場合も条件に応じて実行される部分は1段インデントする。
	if (n % 2) // ifやfor文のブロック始まりの中括弧をこのように改行することも良くありますが、1つのプログラム内でどちらかに統一して下さい。
	{
		printf("nは奇数です。\n");
	} // if文やfor文のブロック末尾の } は必ずifやforの最初の文字i, fの位置にあわせて下さい。

    return (0);
} // main関数やその他の関数のブロック末尾の } は必ず関数の始まる位置(この場合 int main...の最初の i の位置)にあわせて下さい。