● 簡単な計算

■ プログラム作成の手順

プログラム作成の手順の概略を紹介します。具体的な手順は環境に 大きく依るので、あなたの身近の詳しい人に尋ねて下さい。

  1. editorを使って、プログラムのsourceをC++言語で打ち込む。 UNIXではeditorには mule を使うのが良いです。
    MS-Windowsでは統合開発環境を利用するのが良いでしょう。
  2. そのsourceをファイルにして保存(save)する。ファイルの名前は ある程度自由ですが、例えばUNIXなら sample1.cc のように拡張子が .cc でなければならず、MS-Windowsなら sample1.cpp のように拡張子が .cpp でなければなりません。これはコンパイラに対して、このファイルが C++言語のsourceファイルであることを指示するためです。
  3. sourceファイルをcompile(翻訳)する。compileはcompiler と呼ばれるコマンドを実行することで行われます。うまくいけば実行可能な 実行ファイルができあがります。 UNIXでは gcc コマンドが標準で利用できるC++ compilerです。例えば 次のようにしてcompileします。
    gcc sample0.cc -o sample0
    うまくいけば実行ファイルとして sample0 が出来上がります。 gccコマンドでは「-o」の直後に指定した単語が実行ファイルの名前と なります。この名前には慣例としてソースファイルの名前から拡張子を 省いた名前を指定します。
    MS-Windowsでは統合開発環境でそれなりのボタンを押せばcompileされます。

■ 画面に文字列を表示するプログラム(sample01.cc)

▲ sourceの打ち込み

画面に「 Computer in Physics 」という文字列をコンピュータに 表示させるプログラムを作ってみましょう。 以下のとおりにプログラムのsourceをeditorに書いてください。

// sample01.cc
#include <stdio.h>

main(void)
{
  printf("Computer in Physics\n");
}
このプログラムのsourceには、意味不明の記号がたくさんありますが まだ気にしないで下さい。

▲ sourceのsaveとcomplieと実行

これをファイルにsaveしてcompileします。 UNIXでは例えば sample01.cc のファイル名でsaveしましょう。そして shell(ktermなど)で
gcc sample01.cc -o sample01
と打ち込むことでcompileされます。他のOSの人は身近な詳しい人に 尋ねて下さい。
compilerが何か文句を言って終ったら大抵compileが失敗しています。 身近な詳しい人に尋ねて下さい。何も文句を言われずに終ったら compileが成功して実行ファイル sample01 が生成されているはずです。 この実行ファイルを実行するには同じく shell(ktermなど)で
./sample01
と打ち込むことで実行されます。

ここでの「./」は実行ファイルが「ここ」にあることを示しています。 もし、環境変数の PATH か pathに「.」が含まれていればこの「./」の 指定は要りません。この話はわからなくても構いません。


▲ sample01.cc の解説

プログラム冒頭の // sample01.cc はコメント、つまりプログラムの補注 です。読者に対する補注であってコンピュータに対する命令ではありません。 C++言語では //から行末までがコメントになります。

このプログラムの下から2行目にあるprintfという文字は、プリントエフ またはプリントフォーマットと呼ばれる、要するに文字を画面に出す命令で す。画面に出したい文字を(" ")で包んでprintfのすぐ後ろに書きます。
この例では文字列の最後に\nという謎の文字があります。この文字には 特殊な意味があり、この文字を画面に出力するとその文字が表れるのでは なく改行が行われるのです。改行が起こると次に表示される文字列は前に 表示した文のすぐ下の行に表示されます。試しにこの\nをprintf(" ")の 中に入れないで実行してみてください。\nの効果が良くわかることでしょ う。
printf(" ")のすぐ後ろに ;(セミコロン)がありますが、これは命令と 命令との間の区切りのマークなのです。このセミコロンがないとコンパイラ は命令がどこで終わるのか判らないのでエラーを出してしまいます。 セミコロンは命令の終わりには必ず付けるようにしましょう。
printf文以外の #include や main(void)や{ }は今のところはまだ わからなくても全然かまいません。呪文のように覚えておいてください。


■ 整数の足し算をして結果を表示するプログラム(sample02.cc)

▲ sourceの打ち込み

次にもう少しコンピュータらしく計算をするプログラムを作ります。

// 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
と画面にでます。


▲ sample02.cc の解説

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;のようなことはできません。また変数には もともとなにかしらの値が入っているのですが、代入をすることによって その値を書き換えられます。極端な例を上げると

a = 1;
a = 2;
a = a + 1;
2行目まではaは1なのですがここで2に強制的に変更されます。そして 3行目で代入演算子の定義にしたがってaは3になります。=マークは 数学のように「等しい」という意味は全然ありません。


■ 2次方程式の解を計算をして結果を表示するプログラム(sample03.cc)

▲ sourceの打ち込み

今度は整数ではなく実数の値の計算です。平方根も登場します。

// 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 );
}
このプログラムは sqrt()の数学関数を使っているため UNIXでこれをcompileするには次のようにして、数学関数ライブラリ をリンクすることを指定します。
gcc sample03.cc -o sample03 -lm
これを実行すると
The solutions are 3.414214 and 0.585786
と画面にでます。


▲ sample03.cc の解説

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 と置いて しまうととんでもない値が表示されてしまいます。


  • 次へ
  • 目次
    Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
    This page was modified on Aug 3rd, 1998.
    渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp