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

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

C++ | 12 | 関数

↓↓クリックして頂けると励みになります。



11 | 文字変数】 << 【ホーム】 >> 【13 | 関数の定義


関数を使用したプログラム
関数を使用したプログラム



C++の関数(functions)は、プログラム内で特定のタスクや操作を実行するための再利用可能なコードブロックです。
関数は、特定の処理を1つの単位としてまとめ、必要な場所で呼び出すことができます。
これにより、コードの再利用性や保守性が向上し、プログラムの構造化が容易になります。

C++の関数は、次のような要素で構成されます:

  • 関数名:

関数を識別するための名前です。関数名は、識別子のルールに従って命名されます。

  • 引数リスト:

関数に渡される値のリストです。引数は、関数の宣言時に指定され、関数の処理中に使用されるローカル変数として扱われます。

  • 戻り値の型:

関数が実行を完了した後に返される値の型です。C++では、関数が値を返さない場合は戻り値の型としてvoidを指定します。

  • 関数本体:

関数の処理が記述されるブロックです。このブロック内には、関数が実行される際に実行されるコードが含まれます。


関数はプログラム内のどこからでも呼び出すことができ、同じ処理を繰り返し実行する必要がある場合に便利です。
関数を適切に使用することで、コードの再利用性、可読性、保守性を向上させることができます。




Visual Studio Codeで以下の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を超えたらプログラムが強制終了します。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ KansuuTest1.cpp -o KansuuTest1 && "/Users/**/Desktop/Programming/CPP/"KansuuTest1
    
    random の値は 33614
    



    Visual Studio Codeで以下の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にキーボードから値を入力できるように改良したプログラムです。
    作成したプログラムを実行して結果を確認します。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile 
    && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile
    
    seed を自然数で入力してください。 seed = 
    5
    random is 84035
    



    Visual Studio Codeで以下の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までの間の整数をランダムに求めて表示します。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ KansuuTest3.cpp -o KansuuTest3 && "/Users/**/Desktop/Programming/CPP/"KansuuTest3
    
    seed を自然数で入力してください。 seed = 
    5
    random is 5
    



    Visual Studio Codeで以下の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までの間の整数をランダムに求めることができます。
    作成したプログラムを実行して結果を確認します。

    ~/Desktop/**/CPP $ cd "/Users/heyjude/Desktop/Programming/CPP/" && g++ KansuuTest4.cpp -o KansuuTest4 && "/Users/**/Desktop/Programming/CPP/"KansuuTest4
    
    seed を自然数で入力してください。 seed = 
    4
    random is 0
    


    Visual Studio Codeで以下のcppファイルを作成して下さい。


    新規作成 【KansuuTest5.cpp】

    #include <iostream>
    #include <stdlib.h>
    
    int main() {
    
    	int teki_kyori, teki_course, laser_course, round, sokudo=0;
    	char rader='R';
    
    	int seed, houkou;
    
    	std::cout << "自然数で適当な数を入力してください。--> " << std::endl;
    
            for (std::cin >> seed ; !std::cin ; std::cin >> seed){
    
    			std::cin.clear();
    			std::cin.ignore();
    			std::cout << "入力が間違ってます。" << std::endl << "自然数で適当な数を入力してください。--> ";
            }
    
    	srand(seed);
    
    	for(round=1; round<6; round++) {
    
    		std::cout << "第 " << round << "ラウンド" << std::endl << std::endl;
    		teki_course = rand()%6;
    		sokudo ++;
    
    		for(teki_kyori=10; ; teki_kyori-=sokudo) {
    			if (teki_kyori<=0) {
    
    				std::cout << "あなたの負けです" << std::endl;
    				exit(0);
    			}
    			houkou = rand()%3-1;
    
    			if ( teki_course == 0 ) {
    				teki_course = rand()%2;
    			}
    			else if ( teki_course == 5 ) {
    				teki_course = rand()%2+4;
    			}
    			else {
    				teki_course += houkou;
    			}
    			std::cout << "敵との距離は" << teki_kyori << "です。" << std::endl;
    
    			std::cout << "あなたはレーザーを撃ちますか?" << std::endl;
    			std::cout << "それともレーダーを使いますか?" << std::endl;
    			std::cout << "レーザー(F) or レーダー(R)" << std::endl;
    
    			for (std::cin >> rader ; !std::cin ; std::cin >> rader){
    				std::cin.clear();
    				std::cin.ignore();
    				std::cout << "入力が間違ってます。" << std::endl << "レーザー(F) or レーダー(R)";
    		        }
    			if ( rader == 'R' || rader == 'r') {
    				std::cout << "敵のコースは" << teki_course << "です。" << std::endl;
    
    			}
    			else {
    				std::cout << "撃つ方向を決めてください。" << std::endl;
    				std::cout << "0~5のどれかを入力してください" << std::endl;
    
    				for (std::cin >> laser_course ; !std::cin ; std::cin >> laser_course){
    
    					std::cin.clear();
    					std::cin.ignore();
    					std::cout << "入力が間違ってます。" << std::endl << "0~5のどれかを入力してください";
           				}
    
    				if (teki_course == laser_course) {
    
    					std::cout << "あなたの勝ちです!" << std::endl;
    					break;
    				}
    				else {
    
    					std::cout << "外れました" << std::endl;
    				}
    			}
    		}
    	}
    }
    



    今までに説明したことを使って作った簡単なゲームです。


    敵の機体はあなたの所から10 離れたところから1つずつ進んできて、あなたのいるところ、すなわち0の所まで来たらあなたの負けです。
    あなたの武器はレーザーガンで、相手が1つずつ進むごとに1回だけ打てます。
    敵は6コース(方角)のどれかにいますから、適当な方角を選んでレーザーを撃ってください。
    また敵の位置をレーダーで索敵することも出来ますが、レーダーとレーザーは同時に使えません。


    敵は1つ進むごとにコースを変えることが出来ますが、必ず隣り合うコースにしか移動しません。
    従って3のコースにいたら、次は2、3または4のコースに必ずいます。(コースを変えないこともあります)。
    例えば端のコース(0)にいる場合、次は0または1にいます。
    敵の破壊に成功したらそのメッセージを出します。
    外れたら敵との距離を表示してレーザーの方向入力を待つようにし、距離が0になったらプレーヤーの負けを表示します。
    ゲームは5回戦まであり、敵のスピードはだんだんと速くなっていきます。
    乱数の種(seed)はキーボードから適当な数字を入力してもらうようにします。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ KansuuTest5.cpp -o KansuuTest5 && "/Users/**/Desktop/Programming/CPP/"KansuuTest5
    
    自然数で適当な数を入力してください。--> 
    11ラウンド
    
    敵との距離は10です。
    あなたはレーザーを撃ちますか?
    それともレーダーを使いますか?
    レーザー(F) or レーダー(R)
    r
    敵のコースは1です。
    敵との距離は9です。
    あなたはレーザーを撃ちますか?
    それともレーダーを使いますか?
    レーザー(F) or レーダー(R)
    f
    撃つ方向を決めてください。
    0~5のどれかを入力してください
    1
    外れました
    敵との距離は8です。
    あなたはレーザーを撃ちますか?
    それともレーダーを使いますか?
    レーザー(F) or レーダー(R)
    r
    敵のコースは3です。
    敵との距離は7です。
    あなたはレーザーを撃ちますか?
    それともレーダーを使いますか?
    レーザー(F) or レーダー(R)
    f
    撃つ方向を決めてください。
    0~5のどれかを入力してください
    3
    あなたの勝ちです!
    第 2ラウンド
    
    敵との距離は10です。
    あなたはレーザーを撃ちますか?
    それともレーダーを使いますか?
    レーザー(F) or レーダー(R)
    ・・・
    ・・・
    



    11 | 文字変数】 << 【ホーム】 >> 【13 | 関数の定義





    ↓↓クリックして頂けると励みになります。