計算機(パソコン)のプログラムは計算機が理解できる言語(マシン語)で記述されているが、 それは 0 と 1 の羅列であり、それを人間が理解することは難しい。 もちろん、人間がそれを作らなければならない訳であるが、それも困難な作業となる。 そこで普通は、人間の理解できる形のプログラムとマシン語の橋渡しの役目をするものが用意されている。 これには大きく分けて2種類のものがある。
ここでは C 言語を学ぶが、細かいことはその開発環境に依存する。 ここでは適当なエディタでプログラムを書き、unix 系の OS (例えば Linux)でコマンドラインからコンパイルをし、 出来たプログラムをコマンドラインから実行することを想定している。 MS Windows などを用いる場合には状況が違うと思うが、適宜読み替えて欲しい。
早速、一つのプログラムを作成してみよう。 以下の内容のファイルを作成し、"hello.c" というファイル名で保存する。 説明のために行番号を付けてあるが、実際には行番号はいらない。
1 /* hello.c */ 2 #include <stdio.h> 3 4 int main(int argc, char *argv[]) 5 { 6 printf("hello, world\n"); 7 8 return 0; 9 }これを C 言語のソースという。 C 言語のソースは *.c という名前にする。 コマンドラインから
home$ gcc hello.cとすると、プログラムに誤りがなければ何の出力もなく終了し、新しく "a.out" というファイルが出来ている。 これがマシン語に翻訳されたプログラムである。また gcc というのが C コンパイラである。
home$ ls hello.c a.outここで "./a.out" とすればプログラムが実行される。
home$ ./a.out hello, worldこのプログラムは "hello, world" と出力するだけものである。 コンパイル時に何かメッセージが表示された場合にはプログラムに入力ミスがあると思われる。 初めのうちはエラーメッセージをきちんと理解することは難しいが、何が間違えているかを推測してプログラムを修正しよう。
さて、プログラムの解説に入る。このプログラムの本質的な部分は 6 行目の printf("hello, world\n"); だけである。 printf は予め用意されている何かを表示するための基本的な関数である。 C 言語では多くの関数を用いてプログラムを記述する。 printf のように予め用意されている関数(組み込み関数)と自分で書く関数(ユーザー定義関数)があり、 プログラム自身さえも main 関数と呼ばれる一つの関数である。 関数はいくつかの値を受け取って、それによって何かを行う。 この値を引数といい、この例では printf の後のカッコの中身である。 組み込み関数を利用するにはいくつかの準備が必要で、 1 行目の #include <stdio.h> というのは printf を含む標準入出力関数を利用するということを宣言しているのである。 "\n" はエスケープシーケンスと呼ばれるもので、特別な文字を表示するために用いられる。 この場合は改行を表している。 1 行目の /* と */ で囲まれた部分はコメントとしてコンパイル時に無視される。 何をするプログラムなのかなど、必要なことを書いておくと良い。途中で改行が含まれていても構わない。 その他の説明していない部分は、今のところおまじないと思っておけば良い。
課題 01.01
自分の名前を出力するプログラムを書け。また途中に "\n" をいくつか入れて、改行される様子を確認せよ。
次のプログラムを "hello2.c" とする。
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 char name[100]; 6 7 printf("What is your name ?\n"); 8 scanf("%s", name); 9 printf("hello, world, %s\n", name); 10 11 return 0; 12 }これを実行してみよう。
home$ gcc hello2.c home$ ./a.out What is your name ?ここで自分の名前を入力してリターンキーを押す。すると
home$ ./a.out What is your name ? Taro hello, world, Taroとなる。すなわち、入力した名前が出力に含まれている。プログラムを解説しよう。 C 言語では何らかの値を保持するものを変数といい、 変数を使う場合には前もって宣言をしなければならない。 また変数にはどのような内容の値を用いるかによって型を指定する。 これを行っているのが 5 行目である。"char" というのが文字を表す型で、 この場合には 100 文字からなる name という名前の文字列を利用するための箱を用意したことになる。 日本語などは 2 バイト文字と呼ばれ、一つの文字で 2 文字分の場所を使うので注意が必要である。 7 行目は単にメッセージを表示して、ユーザーへメッセージの入力を促している。 8 行目で関数 scanf を用いて、入力された文字列を予め用意した name に入れている。 ここで "%s" というのは入力されるデータが文字列であるということをプログラムに教えている。 9 行目で printf を用いて文字列を出力しているが、ここでは name に収められている文字列を出力したいので、 その部分に文字列を意味する %s を書き、それが name に収められているものであることを指示している。
printf や scanf は複数の出力や入力を同時に行うことも出来る。 次の例は、入力された二つの整数に対して、その和と積を出力する。
#include <stdio.h> int main(int argc, char *argv[]) { int a, b; printf("Input two integers \n"); scanf("%d %d", &a, &b); printf("%d + %d = %d\n", a, b, a+b); printf("%d * %d = %d\n", a, b, a*b); return 0; }整数を表す型は int であり、整数を入力、または出力するための書式指定は %d である。 またこの時には scanf の引数で a, b を指定する際に &a, &b となっていることに注意する。 これは後できちんと学ぶ。 C 言語では積は * で表されることにも注意しておく。
課題 01.02
上のプログラムを試せ。
課題 01.03
実数を表す型は float であり、書式指定は %f である。二つの実数に対してその和と積を表示するプログラムを書け。
課題 01.04
C 言語で利用できる型にはどのようなものがあるかを調べよ。また書式指定についても調べよ。
これまでに見たような、何らかのメッセージを表示してユーザーへの入力を促すようなプログラム を対話型プログラムという。 数学で何らかの計算やシミュレーションをする場合には、対話型はあまり使いやすくはないので、 不必要に用いないようにする。 特に scanf は、整数を期待しているのに文字列が入力される等、 予期せぬ事態にうまく処理をすることが出来ないので、 実際の実用的なプログラムではあまり用いられない。