プログラム作成の手順の概略を紹介します。具体的な手順は環境に
大きく依るので、あなたの身近の詳しい人に尋ねて下さい。
gcc sample0.cc -o sample0うまくいけば実行ファイルとして sample0 が出来上がります。 gccコマンドでは「-o」の直後に指定した単語が実行ファイルの名前と なります。この名前には慣例としてソースファイルの名前から拡張子を 省いた名前を指定します。
画面に「 Computer in Physics 」という文字列をコンピュータに 表示させるプログラムを作ってみましょう。 以下のとおりにプログラムのsourceをeditorに書いてください。
このプログラムのsourceには、意味不明の記号がたくさんありますが まだ気にしないで下さい。// sample01.cc #include <stdio.h> main(void) { printf("Computer in Physics\n"); }
gcc sample01.cc -o sample01と打ち込むことでcompileされます。他のOSの人は身近な詳しい人に 尋ねて下さい。
./sample01と打ち込むことで実行されます。
ここでの「./」は実行ファイルが「ここ」にあることを示しています。 もし、環境変数の PATH か pathに「.」が含まれていればこの「./」の 指定は要りません。この話はわからなくても構いません。
プログラム冒頭の // sample01.cc はコメント、つまりプログラムの補注 です。読者に対する補注であってコンピュータに対する命令ではありません。 C++言語では //から行末までがコメントになります。
このプログラムの下から2行目にあるprintfという文字は、プリントエフ
またはプリントフォーマットと呼ばれる、要するに文字を画面に出す命令で
す。画面に出したい文字を(" ")で包んでprintfのすぐ後ろに書きます。
この例では文字列の最後に\nという謎の文字があります。この文字には
特殊な意味があり、この文字を画面に出力するとその文字が表れるのでは
なく改行が行われるのです。改行が起こると次に表示される文字列は前に
表示した文のすぐ下の行に表示されます。試しにこの\nをprintf(" ")の
中に入れないで実行してみてください。\nの効果が良くわかることでしょ
う。
printf(" ")のすぐ後ろに ;(セミコロン)がありますが、これは命令と
命令との間の区切りのマークなのです。このセミコロンがないとコンパイラ
は命令がどこで終わるのか判らないのでエラーを出してしまいます。
セミコロンは命令の終わりには必ず付けるようにしましょう。
printf文以外の #include や main(void)や{ }は今のところはまだ
わからなくても全然かまいません。呪文のように覚えておいてください。
次にもう少しコンピュータらしく計算をするプログラムを作ります。
これを実行すると// sample02.cc #include <stdio.h> main(void) { int a, b, c; a=1; b=2; c=a+b; printf(" %d + %d = %d \n", a, b, c ); }
1+2=3と画面にでます。
int a,b,c;の文は変数宣言文とも呼ばれ、この例では、a b cの三文字を
整数の値を記憶しておく変数として使いますよとcompilerに宣言することに
なります。この場合、変数の宣言と同時に、変数が値を記憶することが
できるようにメモリが確保されます。このようにメモリの確保を伴う宣言を
定義つきの宣言とも呼びますが、単に宣言と呼ぶことが普通です。
(定義なしの宣言というのもありますがまだ気にしなくて構いません。)
次の a=1; で aに 1が代入され b=2; で bに 2が代入されます。そして
c=a+b; で 1+2 が計算されてその結果の 3が cに代入されます。
最後のprintf文の様子が前のプログラムのものとだいぶ違います。実は
printf文というのは" "で包まれた部分のみを画面に表示するのですが、
%dという変な文字はそのまま画面にでるのではなく" "の後ろにある変数
の値がその%dのある場所に置換されて画面に出力されるのです。%dが
複数ある場合は" "の後ろの変数がその並んだ順に置換されて
表示されます。よってこの例では1+2=3と画面にでるわけです。
このようにprintf文は変数の値の表示の仕方を書式で制御することが
できます。それゆえプリントフォーマットなのです。
ここで代入について少し補足しておきます。=マークは代入演算子と呼
ばれていて、=マークの右側の式を計算した結果を左の変数に代入する
演算子です。したがってa+b=c;のようなことはできません。また変数には
もともとなにかしらの値が入っているのですが、代入をすることによって
その値を書き換えられます。極端な例を上げると
2行目まではaは1なのですがここで2に強制的に変更されます。そして 3行目で代入演算子の定義にしたがってaは3になります。=マークは 数学のように「等しい」という意味は全然ありません。a = 1; a = 2; a = a + 1;
今度は整数ではなく実数の値の計算です。平方根も登場します。
このプログラムは sqrt()の数学関数を使っているため UNIXでこれをcompileするには次のようにして、数学関数ライブラリ をリンクすることを指定します。// sample03.cc #include <stdio.h> #include <math.h> main(void) { double a, b, c; double xp, xm; a = 1.0; b = -4.0; c = 2.0; xp = (-b + sqrt(b*b-4.0*a*c))/(2.0*a); xm = (-b - sqrt(b*b-4.0*a*c))/(2.0*a); printf("The solutions are %lf and %lf\n", xp, xm ); }
gcc sample03.cc -o sample03 -lmこれを実行すると
The solutions are 3.414214 and 0.585786と画面にでます。
double a,b,c;の文と続く double xp, xm;の宣言文により
これらの文字は実数の値を記憶しておく変数になります。
a,b,cは2次方程式の係数の値を表すことにして適当な値を代入します。
xp,xmは解の複合のplusのとminusのを表すことにして、解の公式通りに
計算式を立ててxp,xmに代入します。
sqrt()が平方根を計算する関数です。プログラム冒頭に
#include <math.h>の呪文が加わっています。sqrt()などの数学関数を
利用する場合にはこの呪文を加えておきます。
sqrt()関数は当然ながら負の値の平方根は計算できません。不幸にして
この関数に与える値が負であると、sqrt()関数を実行したとたんに
内部エラーが起ってプログラムは異常終了します。また、割る数 a が
0であっても内部エラーでプログラムは異常終了します。
printfでdoubleで宣言した変数の値を表示させるには、この通り
表示したいところに %lf を置きます。ここで間違って %d と置いて
しまうととんでもない値が表示されてしまいます。