第4講 if文の学習
第3話 乱数を使ってデータを自動発生させる
を実現するコード例
#include<iostream>
using namespace std;
void main(){
int k,sy,sg,r,e,g;
//kは国語、syは社会、sgは数学、rは理科、eは英語の点数を入れる整数型変数
k=rand()%101;
sy=rand()%101;
sg=rand()%101;
r=rand()%101;
e=rand()%101;
cout<<"国語="<<k<<endl;
cout<<"社会="<<sy<<endl;
cout<<"数学="<<sg<<endl;
cout<<"理科="<<r<<endl;
cout<<"英語="<<e<<endl;
g=k+sy+sg+r+e;
cout<<"5教科の合計="<<g<<endl;
cout<<"5教科の平均="<<(float)g/5<<endl;
if(g>=300)cout<<"合格"<<endl;
if(g<300)cout<<"不合格"<<endl;
}
これで確かにデータを手で入れなくても、
自動的にデータが入ってくれます。
ですが、何度実行しても結果は
と同じです。
乱数といっても発生する順番が決まっているからです。
乱数系列を変更するときにはsrand(・)を使います。
・のところに例えば1と入れて、
#include<iostream>
using namespace std;
void main(){
srand(1); int k,sy,sg,r,e,g; //kは国語、syは社会、sgは数学、rは理科、eは英語の点数を入れる整数型変数 k=rand()%101; sy=rand()%101; sg=rand()%101; r=rand()%101; e=rand()%101; cout<<"国語="<<k<<endl; cout<<"社会="<<sy<<endl; cout<<"数学="<<sg<<endl; cout<<"理科="<<r<<endl; cout<<"英語="<<e<<endl; g=k+sy+sg+r+e; cout<<"5教科の合計="<<g<<endl; cout<<"5教科の平均="<<(float)g/5<<endl; if(g>=300)cout<<"合格"<<endl; if(g<300)cout<<"不合格"<<endl; |
}
とすると、
また、srand(2);と変更すると、
ですが、これも毎回同じ結果になります。
srand(・)の・をシード値といいますが、
このシード値を時間毎に自動的に取得させるには、
srand(time(NULL));
とします。
time(NULL)はグリニッチ標準時である1970年1月1日の00:00:00
から現在までの経過時間を秒単位で表したものです。
ただし、timeを使うときには、
冒頭に
#include <time.h>
を入れておく必要があります。
#include<iostream>
#include <time.h>
using namespace std;
void main(){
srand(time(NULL)); int k,sy,sg,r,e,g; //kは国語、syは社会、sgは数学、rは理科、eは英語の点数を入れる整数型変数 k=rand()%101; sy=rand()%101; sg=rand()%101; r=rand()%101; e=rand()%101; cout<<"国語="<<k<<endl; cout<<"社会="<<sy<<endl; cout<<"数学="<<sg<<endl; cout<<"理科="<<r<<endl; cout<<"英語="<<e<<endl; g=k+sy+sg+r+e; cout<<"5教科の合計="<<g<<endl; cout<<"5教科の平均="<<(float)g/5<<endl; if(g>=300)cout<<"合格"<<endl; if(g<300)cout<<"不合格"<<endl; |
}
これで実行する度に違う結果を得ることができます。
では、上のコードをさらに変更して、
5教科の最高点(最大値)を見いだして、
(時間毎に違いますから、
皆さんのデータとは一致しません。)
のようにするには、
#include<iostream>
#include <time.h>
using namespace std;
void main(){
srand(time(NULL)); int k,sy,sg,r,e,g; //kは国語、syは社会、sgは数学、rは理科、eは英語の点数を入れる整数型変数 k=rand()%101; sy=rand()%101; sg=rand()%101; r=rand()%101; e=rand()%101; cout<<"国語="<<k<<endl; cout<<"社会="<<sy<<endl; cout<<"数学="<<sg<<endl; cout<<"理科="<<r<<endl; cout<<"英語="<<e<<endl; g=k+sy+sg+r+e; cout<<"5教科の合計="<<g<<endl; cout<<"5教科の平均="<<(float)g/5<<endl; if(g>=300)cout<<"合格"<<endl; if(g<300)cout<<"不合格"<<endl; int w; w=0; if(w<k)w=k; if(w<sy)w=sy; if(w<sg)w=sg; if(w<r)w=r; if(w<e)w=e; cout<<"5教科の最高点は"<<w<<endl; |
}
とすれば良いのです。
どうしてこれで最高点が求められるのでしょうか。
データが
の場合でトレースしてみましょう。
int w; w=0; if(w<k)w=k; if(w<sy)w=sy; if(w<sg)w=sg; if(w<r)w=r; if(w<e)w=e; cout<<"5教科の最高点は"<<w<<endl; |
まず、
w=0;
でwは0となっています。
次ぎに、
if(w<k)w=k;
によって、wの0とkの45が比較されます。
45の方が0より大きいですから、
if文のw=k;が実行されて、wは45に置き換わります。
次ぎにwの45とsyの20が比較されますが、
20は45より大きくありませんから、
if文if(w<sy)w=sy;のw=sy;は実行されず、
wは45のままです。
3番目にwの45とsgの38が比較されますが、
38も45よりは大きくなく、
if文if(w<sg)w=sg;のw=sg;は実行されず、
wは45のままです。
4番目にwの45とrの79が比較されますが、
79は45よりも大きくて、
if文if(w<r)w=r;のw=r;は実行されて、
wは79となります。
最後にwの79とeの25が比較されますが、
25は79より大きくなく、
if文if(w<e)w=e;のw=e;は実行されず、
wが79のままです。
そして、
cout<<"5教科の最高点は"<<w<<endl;
によって、最高点79が表示されます。
ポイントはwをできるだけ小さな値で初期化しておくことです。
教科の得点は0から100ですから、
最も小さな値は0です。
ですから
w=0;
としているわけです。
もちろん、0より小さな値で、例えば
w=-100;
などと初期化しておいてもかまいません。
if(w<k)w=k; if(w<sy)w=sy; if(w<sg)w=sg; if(w<r)w=r; if(w<e)w=e; |
の5行の少なくても1回は書き換えられるような値で、
初期化しておけば良いのです。
ではこれを参考にして、
最低点も算出できるように改良して下さい。
第2話へ 第4話へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ