学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails

C++プログラミング入門その14 関数を使用したプログラム(2020年3月更新)

<<前  [TOP]  次>>


Visual Studioで新規プロジェクトを作り、次のcppファイルを作成して下さい。


【KansuuTest1.cpp】

#include <iostream>
#include <stdlib.h>

int main() {

	int seed, random;

	seed = 2;
	srand(seed);

	for (; ;) {

		random = rand();

		std::cout << "random の値は " << random << std::endl;

		if(random > 10000) {

			exit(0);
		}
	}
}



このプログラムは乱数を発生させ、その乱数を表示して10000より小さければまたループして乱数を表示します。
乱数が10000を超えたらプログラムが強制終了します。


今まですべての処理を「main{}」 で囲まれるメイン関数の中に書いてきました。
しかしすべての処理をここに書かねばならないとしたら、非常に長いプログラムなどではたちまち解読不可能に陥ってしまいます。
また今まで様々なプログラムを書いてきましたが、その中には共通する部分が非常に多かったことに気づくと思います。
こうした共通部分は将来何度も使いますから、ただコピーして使うのではなく部品として簡単に使えるような仕組みがあればより使いやすくなります。


実はすでに今まで出てきたプログラムでC言語の部品(関数)を使用しています。
すでにあるプログラムの部品、または自分で作ったプログラムの部品を利用するために用意されているものを関数といいます。


C言語の関数は数学で言う関数とは違っていて、ある情報を与えると中で何か仕事をして結果を返すもの(結果がなくても良い)でブラックボックスだと言えます。
関数は自分で作ることも他人が作った関数を利用することもできます。


特に標準的に用意されている関数を標準関数といいます。
標準関数は意識しなくても自動的にコンパイラがプログラムに呼び出します。
標準関数を使うために「#include」という記述が必要だったのです。


最も簡単な関数を使うときの書式は以下の通りです。

関数名 ( 引数, 引数・・・);

引数とは関数に与える変数のことで、引数が複数ある時は「カンマ(,)」で区切らなければなりません。


また関数には返り値があります。
返り値とはある関数が処理を行い最後に返すもののことを言います。
返り値には変数と同じように型があります。
引数にも同じように型があり、例えば整数型を引数に、返り値は実数型などということもできます。


返り値がない関数もありますが、それはvoid型であらわされます。


コンピュータでサイコロのようなランダムな数を得るのは非常に難しい作業になります。
一般にはこのランダムな数を乱数といいますが、コンピュータでは乱数という場合2つの意味があります。
一つは先ほどのサイコロを振って得られるような値のことで、もう一つは一連の数を出したときに全く規則性のない数のことです。
このことはゲームを作る場合などにも非常に重要になります。
通常コンピュータ上で乱数という場合、相互に全く関連性のない不規則な一連の数を示しています。
C言語の標準ライブラリには、乱数を発生させる関数が用意されています。
乱数の最初の値を決めるために用いられる「srand()」と、それに基づいて具体的な乱数を得ることができる「rand()」があります。


  • int seed;       /* 整数変数、srandの引数として使う */
  • int srand(seed);   /* 関数 srand() の引数は整数、返り値も整数 */
  • int rand;       /* 関数 rand() の引数はなし、返り値は整数 */


    例えば整数変数seedに日時から計算した整数を代入し、srandを呼び出して最初の値を決めてやれば後は繰り返しrand() を実行することで相互に無関係な乱数を得ることができます。


    srand(), rand() 関数を使いたい場合にはプログラムの冒頭に「#include」を書かなければなりません。


    前に整数同士の割り算の余りを計算するプログラムを書きましたが、C言語には簡単にこれを行う演算子が用意されています。
    これをモジュロ演算子と呼び、%を用いて表します。

    int a, b, amari;
    
    a = 10;
    b = 3;
    
    amari = a % b;
    

    この例では整数変数amari に10/3 の余り1が代入されます。


    プログラムの途中でプログラムの実行を止めたいときの関数が用意されています。
    これには「exit()関数」を用います。
    exit()関数は引数に終了値をとります。
    この終了値はプログラムを呼び出した側に通知されますが、0は正常に終了したと解釈されます。
    なので引数には通常0を用います。
    この関数を用いるにはプログラムの冒頭に「#include」が必要です。


    以上のことをふまえればこのプログラムが読めると思います。
    exit(0)関数を使わなくても「break;」で同じ結果になります。
    ループが何重にもなっていて直ちにプログラムの実行を終わらせたい場合はexit()が重宝します。


    サンプルプログラムをビルドして実行してみましょう。
    乱数を発生させその乱数を表示し、10000より小さければまたループし乱数を表示します。
    乱数が10000を超えたらプログラムが強制終了します。


    KansuuTest1.cpp実行結果
    KansuuTest1.cpp実行結果


    Visual Studioで新規プロジェクトを作り、次のcppファイルを作成して下さい。


    【KansuuTest2.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    int main() {
    
    	int seed, random;
    
    	std::cout << "seed を自然数で入力してください。 seed = " << std::endl;
    
            for (std::cin >> seed ; !std::cin ; std::cin >> seed){
    
    			std::cin.clear();
    			std::cin.ignore();
    			std::cout << "入力が間違ってます。" << std::endl << "seed を自然数で入力してください。seed = ";
    
            }
    
    	srand(seed);
    
    	for (; ;) {
    
    		random = rand();
    
    		std::cout << "random is " << random << std::endl;
    
    		if(random > 10000) {
    
    			exit(0);
    		}
    	}
    }
    



    srand()関数の引数seedにキーボードから値を入力できるように改良したプログラムです。


    KansuuTest2.cpp実行結果
    KansuuTest2.cpp実行結果


    Visual Studioで新規プロジェクトを作り、次のcppファイルを作成して下さい。


    【KansuuTest3.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    int main() {
    
    	int seed, random;
    
    	std::cout << "seed を自然数で入力してください。 seed = " << std::endl;
    
            for (std::cin >> seed ; !std::cin ; std::cin >> seed){
    
    			std::cin.clear();
    			std::cin.ignore();
    			std::cout << "入力が間違ってます。" << std::endl << "seed を自然数で入力してください。seed = ";
    
            }
    
    	srand(seed);
    
    	random = rand()%10;
    
    	std::cout << "random is " << random << std::endl;
    }
    



    rand()関数によって得られた乱数を10で割り、その余りを表示するプログラムです。
    余りを求めるのにモジュロ演算子%を用いています。
    これにより0〜9までの間の整数をランダムに求めることができます。


    サンプルプログラムをビルドして実行してみましょう。
    キーボードからsrand()関数の引数 seedを入力し、0〜9までの間の整数をランダムに求めて表示します。


    KansuuTest3.cpp実行結果
    KansuuTest3.cpp実行結果


    Visual Studioで新規プロジェクトを作り、次のcppファイルを作成して下さい。


    【KansuuTest4.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    int main() {
    
    	int seed, random;
    
    	std::cout << "seed を自然数で入力してください。 seed = " << std::endl;
    
            for (std::cin >> seed ; !std::cin ; std::cin >> seed){
    
    			std::cin.clear();
    			std::cin.ignore();
    			std::cout << "入力が間違ってます。" << std::endl << "seed を自然数で入力してください。seed = ";
    
            }
    
    	srand(seed);
    
    	random = rand()%3-1;
    
    	std::cout << "random is " << random << std::endl;
    
    }
    



    「KansuuTest3.cpp」を少し改良したプログラムです。
    これにより-1から1までの間の整数をランダムに求めることができます。


    KansuuTest4.cpp実行結果
    KansuuTest4.cpp実行結果


    <<前  [TOP]  次>>