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

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

C++プログラミング入門その14 関数を使用したプログラム

>>この記事には書き直した新しいページがあります。<<


<<前  [TOP]  次>>


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


【KansuuTest1.cpp】

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

void 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型であらわされます。
実は、今まで使用してきたmainも関数であり、mainの前にvoidがついていたのは、「このmain関数は返り値がありません」ということを示していたのです。


コンピュータでサイコロのようなランダムな数を得るのは非常に難しい作業になります。
一般には、このランダムな数を乱数といいますが、コンピュータでは乱数という場合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を超えたら、プログラムが強制終了します。





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


    【KansuuTest2.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    void 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 にキーボードから値を入力できるように改良したプログラムです。





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


    【KansuuTest3.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    void 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までの間の整数をランダムに求め、表示します。





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


    【KansuuTest4.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    void 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までの間の整数をランダムに求めることができます。





    <<前  [TOP]  次>>