第4講 if文の学習
第3話 乱数を使ってデータを自動発生させる
r
を実現するコード例
k
#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;

}

これで確かにデータを手で入れなくても、
自動的にデータが入ってくれます。
ですが、何度実行しても結果は
r
と同じです。
乱数といっても発生する順番が決まっているからです。
乱数系列を変更するときには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;
 

}

とすると、
h
また、srand(2);と変更すると、
g
ですが、これも毎回同じ結果になります。
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教科の最高点(最大値)を見いだして、
f
(時間毎に違いますから、
皆さんのデータとは一致しません。)
のようにするには、

#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;

}
とすれば良いのです。
どうしてこれで最高点が求められるのでしょうか。
データが
f
の場合でトレースしてみましょう。

      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のままです。
f
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回は書き換えられるような値で、
初期化しておけば良いのです。
ではこれを参考にして、
m
最低点も算出できるように改良して下さい。



第2話へ 第4話へ

a

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ