第4講 if文(もしもボックスの世界)
第4話 100以下のランダムなデータを発生させて40人の合否を判定するソフト
実行画面が
各教科の点数をキーボードから入力して下さい。
出席番号=1
国語=42
社会=68
数学=35
理科=1
英語=70
合計点=216
出席番号1番は不合格
出席番号=2
国語=25
社会=79
数学=59
理科=63
英語=65
合計点=291
出席番号2番は不合格
・
・
・
出席番号=39
国語=29
社会=94
数学=49
理科=84
英語=8
合計点=264
出席番号39番は不合格
出席番号=40
国語=22
社会=11
数学=18
理科=14
英語=15
合計点=80
出席番号40番は不合格
となるソフトのコード例
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
int main() {
int a, b, c, d, e, g; //a:国語 b:社会 c:数学 d:理科 e:英語 の得点 g:5教科合計得点
int s; //出席番号
for (s = 1; s < 41; s++) {
cout << "各教科の点数をキーボードから入力して下さい。" << endl;
cout << "出席番号=" << s << endl; //出席番号表示
//以下各教科得点ランダム発生
a = 1 + rand() % 100;
cout << "国語=" << a << endl;
b = 1 + rand() % 100;
cout << "社会=" << b << endl;
c = 1 + rand() % 100;
cout << "数学=" << c << endl;
d = 1 + rand() % 100;
cout << "理科=" << d << endl;
e = 1 + rand() % 100;
cout << "英語=" << e << endl;
//以下各教科得点ランダム発生
g = a + b + c + d + e; //合計点算出
cout << "合計点=" << g << endl; //合計点表示
cout << "出席番号" << s <<"は";
if (g >= 300)cout << "合格" << endl; else cout
<< "不合格" << endl; //合否結果の表示
cout << endl; //改行
}
}
皆さん、コンソール画面を上から下まで見て下さい。
ほとんどが不合格であることがわかります。
ランダムにデータを発生させる場合300点以上合格は厳しいということがわかります。
いったい合格倍率はどのぐらいでしょうか。
ソフトを改良して合格倍率=受験者数÷合格者数を出すソフトにしましょう。
・
・
・
出席番号39番は不合格
出席番号=40
国語=22
社会=11
数学=18
理科=14
英語=15
合計点=80
出席番号40番は不合格
合格倍率は*.*倍です。
答えがわかってしまうと面白くないですから、
*.*
と伏せてありますが、小数第1位まで求めて下さい。
合格者数をカウントする整数型の変数
int cn = 0; //合格者をカウントする変数
を宣言すると同時に0に初期化しておくとよいでしょう。
ただし、40/cnは整数になってしまいます。
整数型同士の計算結果は整数に丸められてしまうからです。
これを強制的にfloat型に変更するには、
(float)40/cnとします。
強制的に型を変更することをキャストといいます。
小数第一位まで表示させるには
#include <iomanip> //setprecisionを使えるように組み込む
によってiomanipをインクルードして、
cout<< "合格倍率は"<< fixed << setprecision(1) << (float)40 / cn << "です。"<<endl;
とする必要があります。
いったい何倍程度になるのでしょうか。
楽しみですね。
尚、
if (g >= 300)cout << "合格" << endl; else cout
<< "不合格" << endl; //合否結果の表示
は合格の場合に2つの命令文を実行しなければなりませんから、
if (g >= 300){
cout << "合格" << endl;
・・・
}
else {
cout << "不合格" << endl;
}
としておきましょう。
基本命令文が1つしかないときは、1文でも良いですが、
肯定部分でも否定部分でも命令文が複数になるときには、
上のようにすることをおすすめします。
ただし、
if(*){A;B;C;} else {P;Q;}
のような書き方は認められています。
つまり、命令文が複数でも1文で書くことも出来ます。
ですが、わかりやすさを優先するなら、
if(*){
A;
B;
C;
}
else {
P;
Q;
}
の方が断然良いと思います。