int a,b,c,d,....
int tensu[100];
ここで、tensuは配列の名前で、もちろん何にしてもかまいません。これで整数を100個いれるいれものができたことになります。実際のいれものは、 tensu[0]、tensu[1]、tensu[2]、...、tensu[99]
//hairetu_sample.cpp
//10人の学生の点数を入力し、その平均値を計算するプログラム
#include <iostream>
using namespace std;
int tensu[10];
int main()
{
int sum = 0; //sumは合計点、ただし、ここではじめは0と置いておく。説明参照。
cout << "10人の学生の点数を順番に入力してください。"
<< endl;
for(int i = 0; i < 10; i++){
cin >> tensu[i];
}
cout << "それでは平均を計算します。"
<< endl;
for(int i = 0; i < 10; i++){
sum += tensu[i];
}
cout << "平均点は" << sum/10
<< "です。" <<endl;
//上のように出力の文に計算式を書いてもかまいません。
}
cin >> tensu[0];
cin >> tensu[1];
cin >> tensu[2];
...
...
cin >> tensu[9];
sum += tensu[i];
class Gakusei
{
int sansu; //算数の点
public:
Gakusei(int x) : sansu(x){}
void set_sansu(int x){ sansu = x; }
int get_sansu() const{ return sansu; }
};
そもそも、点数というものは学生の「持ち物」であるので、クラス「学生」をつくり、点数はそのデータメンバにしました。上の例では、算数のみをデータにしましたが、それは、私の担当教科が、今のところ、算数だけだからです。もし、来年、国語も採点する必要がでたら、そのようにプログラムを改造するつもりです。
上の例は、とても単純ですが、実際に使っていて、次のような問題がでたとします。(うああ。^^;)
「私は、いつもゲタ付きの点数を学生に与えている。
そのため、処理次第で100点を越える場合もある。しかし、このプログラムは教務課提出用
の最終成績を処理するので、100点を越えた学生の点はゲタをとって100点にしたい。」
まあ、とってつけたような例ですが、要するに、入力値に上限をつけたいということで、よくあることです。この場合は、プログラム(ができているとします)の別の部分はいじらずに、クラスを次のように変えることも考えられます。
class Gakusei
{
int sansu; //算数の点
public:
//コンストラクタの中でメンバ関数を使っても問題ない。
Gakusei(int x){ set_sansu(x); }
void set_sansu(int x); //定義を外に出した。
int get_sansu() const{ return sansu; }
};
void Gakusei::set_sansu(int x){
if(x >= 100){
//xが100以上の時は、100を代入してしまう。
x = 100;
}
sansu = x;
}
Gakusei mine[10];
のようにすればよいのです。ところが、実際、前の定義ではうまくいきません。それは、コンストラクタが整数値の引数を必要としているからです。引数が与えられなければ、オブジェクトはつくられないのです。配列の定義には引数はつけられないですよね。そのため、上のようなコードはエラーになってしまうのです。
これを避けるためのもっとも基本的な方法は、引数を持たないコンストラクタを別に用意するという方法です。この場合コンストラクタは引数ありと引数なしの二つになってしまうのです。それでいいのです!!!C++はそのようにつくられた言語です。
このようにコンストラクタを2つ作ると、
Gakusei one(72);
のように、学生の点数(上の例では72点)を設定しながら、オブジェクトをつくるときは、はじめに書いた引数のあるコンストラクタが使われ、配列に使うような場合には、引数なしのコンストラクタが使われることになるのです。
ところで、引数なしのコンストラクタは何をすればよいのでしょう。それは、ケースバイケースですが、点数はどうせ後から入力されるのですから、引数なしのコンストラクタでは、何もしないでもよいでしょう。そうすると、何もしないコンストラクタの誕生です。ただ、本当に何もしていないのかと言うと、配列の定義などでとても役に立っているコンストラクタであることは忘れないでください。
以上をまとめた例を作ります。
//gakusei_sample.cpp
#include <iostream>
using namespace std;
class Gakusei
{
int sansu; //算数の点
public:
//引数なしのコンストラクタ(これがないとプログラムはエラー)
Gakusei(){} //何もしないので、中カッコ内は空
//引数ありのコンストラクタ
Gakusei(int x){ set_sansu(x); }
void set_sansu(int x);
int get_sansu() const{ return sansu; }
void input(); //入力のために新しく付けた
};
void Gakusei::set_sansu(int x){
if(x >= 100){
//xが100以上の時は、100を代入してしまう。
x = 100;
}
sansu = x;
}
void Gakusei::input()
{
int temp;
cout << "算数の点を入力してください:";
cin >> temp;
set_sansu(temp);
}
Gakusei mine[10];
int main()
{
int sum = 0;
cout << "10人の学生の点数を入力してください。"
<< endl;
for(int i = 0; i < 10; i++){
mine[i].input();
}
cout << "それでは平均を計算します。"
<< endl;
for(int i=0; i < 10; i++){
sum += mine[i].get_sansu();
}
cout << "平均点は" << sum/10
<< "です。" << endl;
}