3 Windows フォーム・アプリケーション
4.1 式と計算
いろいろな計算を行うには、変数と呼ばれるデータの記憶場所に数値を保存させる。変数は名前
(変数名)を付けて区別する。変数名はアルファベット、数字、_(アンダーバー)からなる文字 列で、先頭の文字には数字は使えない。大文字と小文字は区別するのでabc ABC Abc AbCはす べて異なる変数を表す。次の識別子(名前)はキーワード(予約語)として使われるので、別の用 途に使えない。予約語は文字がゴチックになるので、すぐわかります。
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
asm _cs _ds _es _ss cdecl far huge
interrupt near pascal
C++では更に次の識別子もキーワードです。
class inline overload public friend new virtual operator this delete
次は三つの数を入力し、その和と平均を出力するCのプログラムです。
Microsoft Visual Studio 2010で、 Cのプログラムを作るには次のようにします。基本的には C++のプログラミングと同じですが、Microsoft Visual Studio 2010を起ち上げます。
のような画面になることもあります。上でやったように、「表示」のメニューで「スタートページ」
をクリックし、新しいプロジェクト・・・をクリックしても良いですが、次のようにすることも出来 ます。「ファイル(F)」メニューの「新規作成(N)」の「プロジェクト(P)」をクリックします。
Win32コンソール アプリケーションをクリックし、名前(N):のエディットボックスに例えば heikin3と入力し、
OK ボタンをクリックする。
次へのボタンをクリックし、空のプロジェクトをチェックする。
完了ボタンをクリックする。
クラスビューになってなければ、クラスビューをクリックし、一段目の左から二つ目のアイコ ン(新しい項目の追加)をクリックし、C++ファイルをクリックし、名前の欄にheikin.cと打ち 込む。
追加のボタンをクリックする。
heikin.c のファイルが作られ、開いている。
#include <stdio.h>
int main() {
double a, b, c, wa, heikin;
printf("a b c = ");
scanf("%lf %lf %lf", &a, &b, &c);
wa = a + b + c;
heikin = wa / 3;
printf("和 = %lf\n", wa);
printf("平均 = %lf\n", heikin);
getchar();
return 0;
}
と入力する。
CのプログラムもC++のプログラムもmain()関数から実行する。
int main(int argc, char *argv[]) {
}
になっていたり、
int main() {
}
となっているが、あまり気にしなくて良い。上の場合は、実行プログラムに引数を与えて、引数に 応じて、プログラムの実行を変化したいときに使うが、上のようにして、引数を与えなくても良い。
#include <stdio.h>
は、
printf("a b c = ");
scanf("%lf %lf %lf", &a, &b, &c);
printf("和 = %lf\n", wa);
printf("平均 = %lf\n", heikin);
getchar();
で使われているライブラリ関数printf(), scanf(), getchar()を使うために必要なインクルードファイ ルです。ライブラリ関数とは、メーカーが作って、ライブラリに納められている関数です。printf(), scanf(), getchar()のプロトタイプ(どのような引数を取り、どのような値を戻すか)がstdio.hに 書かれています。これをinclude命令で取り込んでいます。関数は使う前にプロトタイプ(どのよ うな引数を取り、どのような値を戻すか)を書いておかなくてはなりません。
double a, b, c, wa, heikin;
は、使用する変数の宣言です。プログラムで使用する変数は記憶するための場所を確保するために、
前もって宣言する必要がある。Cでは変数の宣言は関数定義の先頭で行う。double は基本データ 型の一つ倍精度浮動小数点数型を示す。
double a, b, c, wa, heikin;
は変数 a, b, c, wa, heikinは倍精度浮動小数点数のための変数であると宣言している。double は 4Byte で +- 2.225073858507201e-308 から+-1.797693134862316e+308の範囲の実数を記憶する ことができます。よく使う他の基本データ型にはcharとintとfloatがある。
printf("a b c = ");
の printf(”a b c = ”)は、コンソール(画面)にa b c =と表示します。printf()関数は”と” で 囲われた文字列を一部の例外を除いてそのまま表示します。
scanf("%lf %lf %lf", &a, &b, &c);
の scanf()は標準ライブラリ関数で書式付きでキーボードからデータを入力します。scanf()関数 の最初の引数が書式用の文字列です。%lfがキーボードから入力された数値(文字列)を倍精度浮 動小数点数に変換することを示します。したがって、この場合はスペースで区切られた数値を倍精 度浮動小数点数として三個入力することを指示しています。scanf()関数はキーボードから文字を 読み込み、書式で指定された形式に従ってそれを解釈し、残りの引数へ結果を格納する。二番目以 降の引数は、それに対応する変換入力を格納できるようにポインタでなければならない。ポインタ にするためには変数名の前に&を付ければよい。今の場合、変数a, b, cにこの順で倍精度浮動小 数点数が入力される。ポインタは説明するのがやっかいなので、気になって仕方がなければ、自分 でインターネットで調べるか、CまたはC++の入門書を読んで下さい。ここでは、scanf()では 変数の頭に &を付ければよいと覚えておけばいいです。C++では、以下で見るようにもっと簡単 です。
wa = a + b + c;
は代入文です。代入文は 変数=式; の形式で式の値を計算し、その値を変数に代入します。もと 在った変数の値はなくなり新しい値で置き換わります。今の場合、変数a, b, cの値の和を取りそ れを変数waの値とします。
heikin = wa / 3;
は変数waの値を3で割り変数heikinに代入します。+と/ は算術演算子です。よく使う算術演
算子には+, -, *, /, % があります。+は加法を、-は単項のマイナス演算子と減法を、 * は
乗法を、/は除法(a/bはaをbで割った値になります。ただし、整数の除法は小数点以下切り 捨てて整数値にします)を、また%は整数の余り(a %bはa をbで割った余りですが、aが負の 数のときには、負の余りが計算されます)を求めるのに使われる。+ - を加法演算子* / %を乗法 演算子といい、乗法演算子の方が加法演算子より先に計算される。乗法演算子、加法演算子同士の 場合は左から右に順に計算される。
最後に
printf("和 = %lf\n", wa);
printf("平均 = %lf\n", heikin);
のprintf()関数でwaとheikinの値が出力される。printf()も最初の引数が書式で %lfの所にwa および heikin の値が代入されて出力される。 waおよび heikin が倍精度浮動小数点数型なので
%lfが使われます。%\nは改行を指示します。
getchar();
は、これがなければ、Microsoft Visual Studio 2010の統合開発環境では、直ちにコンソール画面 が閉じますから、これを実行して、何か文字が入力されるまで待ちます。例えば、エンターキーを 押すとプログラムが終了します。
return 0;
は
int main()
と main()関数がint(整数値)を戻す関数と定義されているので、正常に終了した事を示す値 0
を返しています。
C++では、次のようにプログラミングする事もできます。
#include <iostream.h>
using namespace std;
int main() {
double a, b, c, wa, heikin;
cout << "a b c = ";
cin >> a >> b >>c;
wa = a + b + c;
heikin = wa / 3;
cout << "和 = " << wa << "\n";
cout << "平均 = " << heikin << endl;
getchar(); getchar();
return 0;
}
このプラグムの
#include <iostream.h>
は
cout << "a b c = ";
cin >> a >> b >>c;
cout << "和 = " << wa << "\n";
cout << "平均 = " << heikin << endl;
getchar(); getchar();
の cout, cin, getchar()のために必要なインクルードファイルです。
using namespace std;
は、cout, cinなどがstdというnamespaceで宣言、定義されているので、stdというnamespace を使いますという宣言です。即ち、cinとcoutは名前が重複しないように、namespaceのstdと いうところで宣言されているので、
using namespace std;
とするか、std::cin とstd::coutの形で使う必要があります。std::cin とstd::coutとするのはめん どくさいので、
using namespace std;
としています。
C++ではいつでも
#include <iostream.h>
using namespace std;
または
#include <iostream>
using namespace std;
を最初に書くものだと思って下さい。
cout << "a b c = ";
で、コンソールに”a b c = ”と表示します。
cin >> a >> b >>c;
で、キーボードから入力されたスペースで区切られた3つの数字をa, b, cにセットします。a, b, c 1つづつに>>を使います。入力の時、アドレスを渡す(ポインタを使う)必要がありません。
書式の指定も必要ありません。
cout << "和 = " << wa << "\n";
cout << "平均 = " << heikin << endl;
で、 文字列”和= ”とwaの値と"\n"(改行)と 文字列”平均= ”とheikinの値とendl(改 行)を表示します。改行はこのように endlでも可能です。このように数値の桁数の指定が必要に ないときは、C++の方が楽です。
次は三桁の整数を入力して百、十、一の位の数を表示するCのプログラムです。
#include <stdio.h>
void main() {
int n, hyaku, juu, iti;
printf("三桁の数 ");
scanf("%d", &n);
hyaku = n / 100;
n %= 100;
juu = n / 10;
iti = n % 10;
printf("百の位 = %d\n", hyaku);
printf("十の位 = %d\n", juu);
printf("一の位 = %d\n", iti);
}
int n, hyaku, juu, iti;
は変数 n, hyaku, juu, itiを整数のための変数であると宣言している。intは 2Byte で -32768 か
ら 32767 までの整数値を記憶する事ができます。これの値はコンパイラに依ります。4Byte で
-2147483648から2147483647までの整数値であることもあります。もっと大きい整数値を記憶し たければlong intを使います。long intは4Byte で-2147483648から2147483647までの整数値 を記憶できます。これより大きな整数値を使いたければ、後で出てくる配列を使います。
scanf()およびprintf() の書式中の%dは整数値に変換することを指示している。
hyaku = n / 100;
は n および100 が整数値であるから、n の値を100 で割った商(小数点以下切り捨て)を変数
hyakuに代入することを指示している。
n %= 100;
は n = n % 100; の省略形でn の値を 100 で割った余りをn の新しい値とするよう指示してい
る。このような省略形は任意の算術演算子に適用できる。たとえば、
a += 10; b -= c; n *= a+b; n /= s;
はそれぞれ
a = a + 10; b = b - c; n = n * (a+b); n = n / s;
と同じである。
C++のプログラムは次のようになります。
#include <iostream>
using namespace std;
void main() {
int n, hyaku, juu, iti;
cout << "三桁の数 ";
cin >> n;
hyaku = n / 100;
n %= 100;
juu = n / 10;
iti = n % 10;
cout << "百の位 = " << hyaku << endl;
cout << "十の位 = " << juu << endl;
cout << "一の位 = " << iti << endl;
}
次のプログラムはatan()関数を用いて円周率をもとめる Cのプログラムである。
#include <stdio.h>
#include <math.h>
void main() {
printf("円周率=%20.15f\n", 4 * atan(1));
getchar();
}
ここでは void main() {
}
と main()関数の戻り値をvoid(値を戻さない)と宣言しているが、このようにしても良いです。
この場合はreturn文は必要ありません。
atan()は倍精度浮動小数点数の引数を取り、そのarctangentを倍精度浮動小数点数として返す 関数である。数学関数を用いるためには
#include <math.h>
のインクルード文が必要である。以下にあげるのはよく使われる数学関数である。いずれも一つま たは二つのdoubleの引数をとり、double の値を返す。
sin(x) xのsine,単位はラジアン cos(x) xのcosine,単位はラジアン tan(x) xのtangent,単位はラジアン exp(x) 指数関数ex
log(x) xの自然対数(基数はe)(x >0) log10(x) xの常用対数(基数は10)(x >0) pow(x, y) xy
sqrt(x) xの平方根(x≥0) fabs(x) xの絶対値
floor(x) xを越えない最大の整数 ceil(x) x以上の最小の整数
printf()関数の書式の%20.15fはdoubleの値を20桁取り小数点以下15桁表示せよとの指示 である。
C++のプログラムは次のようになります。
#include <iostream>
#include <math.h>
using namespace std;
void main() {
cout << "円周率=" << 4 * atan(1) << endl;
getchar();
}
C++で、値を20桁取り小数点以下15桁表示せよと言った指示はめんどくさいのでここでは示 さない。気になるなら、自分でインターネットで調べなさい。私のホームページにも載せてあり ます。
例題:球の半径r の値を入力し、表面積と体積を求める C++ のプログラムを作れ。
解答例 次のようなプログラムを作ればいいです。
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main(int argc, char* argv[]) {
double PI = 4 * atan(1.0);
double r, V, S;