第5講 関数(1)
第3話 2人の社員がお互いに仕事を依頼し合うとどうなる?
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f(); //社員f()を採用
void g(); //社員g()を採用
int main() {
  f(); //社員f()に仕事を命じている
}
void f(){
  printf("こんにちは!\n");
  g(); //社員g()に仕事をお願いしている
}
void g(){
  printf("今日は良い天気ですね。\n");
  
f(); //社員f()に仕事をお願いしている
}
とすると、
001
が続いた後、
002とエラーしてしまいます。
このようなときはプログラムの終了を押して下さい。

途中でエラーしてしまった原因は、
このプログラムだと無限ループになってしまうからです。
私の実験によると、
仕事の依頼は4700回程度(正確には覚えていません。)が上限なのです。
その上限回数をこのプログラムだとあっという間に超えてしまします。

なぜ無限ループになってしまうのかと申しますと、
ちょうど鏡を平行に置くと無限に鏡が映し出されるのと同じ状態だからです。
f()→g()→f()→g()→f()→g()→・・・
ですね。仕事の依頼が無限に連鎖してしまいます。
無限ループは、プログラミングにおいては宿痾です。
ただし、すでにアプリやソフトと名付けたプログラムにおいては、
意図的に無限ループを利用していますし、
ゲームプログラミングは基本的に無限ループを使います。
この例外を除いては、無限ループとの戦いがプログラミングであるといっても、
決して大げさとはいえないほど、
うっかりすると無限ループの罠にはまってしまうことがあるのです。

エラーしないようにするには、
回数をカウントする変数を導入します。
プログラムソースを次のように変更して下さい。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f(int k); //社員f()を採用
void g(int k); //社員g()を採用
int main() {
  f(0); //社員f()に仕事を命じている
}
void f(int k){
  k++;
  printf("こんにちは!\n");
  g(k); //社員g()に仕事をお願いしている
}
void g(int k){
  printf("今日は良い天気ですね。\n");
  if(k<5)f(k); //社員f()に仕事をお願いしている
}
実行画面
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。

ちょうど5回表示してプログラムが終わりました。






第2話へ   第4話へ
 
002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

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