少し聞き慣れない単語が出てきたので説明しておく。これらは全て、英語である。関数も、 元は function を日本語に直した。元の英語の意味を知っておくことは、その機能の理解 に役立つ。それらの意味は、以下の通りである。
通常のプログラムは、サブルーチンとメインルー チンから構成される。諸君が今まで作成してきたプログラムの最初の方にint main()と書いてきたはずである。それがメイン関数であり、メインルーチンと呼ばれる 者である。その範囲は、括弧{から}までである。知らないうちに、メイン関数を 使ってきているのである。これ以外の関数の作り方を学習する。
#include <stdio.h> /*==============================================================*/ /* main function */ /*==============================================================*/ int main(void){ int i, test, amari; char temp; /* ---------- キーボードからデータ入力 ------------------*/ do{ printf("\n調べたい整数を入力してください(2以上)\n"); scanf("%d%c",&test,&temp); printf("素数の判定をする整数は、%dです。\n",test); }while(test<2); /* ---------- 素数判定(割り切れる最小) -----------------*/ amari = 0; i=1; do{ i++; /* iのインクリメント(1増加) */ amari = test % i; /* test/i の余りの計算 */ }while(amari != 0 && i <= test); /* ---------- 結果表示 --------------------------------*/ if(test == i){ printf("\n%dは素数です !!\n\n",test); }else{ printf("\n%dは素数ではありません !!\n",test); printf("割り切れる最小の整数(>2)は、%dです。\n\n",i); } return 0; }
#include <stdio.h> int key_in(void); int check_prime(int number); int print_result(int number, int result); /*==============================================================*/ /* main function */ /*==============================================================*/ int main(void){ int test, kekka; test = key_in(); /* キーボードからデータ入力 */ kekka = check_prime(test); /* 判定(割り切れる最小) */ print_result(test,kekka); /* 結果表示 */ return 0; } /* <<<<<<<<<< これ以降は、サブルーチン >>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ /*==============================================================*/ /* キーボードから整数を読み込む関数 */ /*==============================================================*/ int key_in(void){ int n; char temp; do{ printf("\n調べたい整数を入力してください(2以上)\n"); scanf("%d%c",&n,&temp); printf("素数の判定をする整数は、%dです。\n",n); }while(n<2); return n; } /*==============================================================*/ /* 素数の判定 */ /*==============================================================*/ int check_prime(int number){ int i,amari; amari = 0; i=1; do{ i++; /* iのインクリメント(1増加) */ amari = number % i; /* number/i の余りの計算 */ }while(amari != 0 && i <= number); return i; } /*==============================================================*/ /* 結果の表示 */ /*==============================================================*/ int print_result(int number, int result){ if(number == result){ printf("\n%dは素数です !!\n\n",number); }else{ printf("\n%dは素数ではありません !!\n",number); printf("割り切れる最小の整数(>2)は、%dです。\n\n",result); } return 0; }
長いプログラムの書き方の説明に入る前に、アナロジー(analogy 類似)として、自動車を 作ることを考がえる。自動車も製品で、プログラマーにとってプログラムがそれに当たる。 自動車は、非常に多くの部品から出来上がっている。たとえば、ピストン、シリンダー、 ボルト、プラグ、タイヤ、ハンドル、ばね、電線、電球、集積回路、コンデンサー、火薬、 磁石など、それこそ大変な数の部品から作られている。そして、これを組み合わ せて自動車が出来上がる。これを、一人で設計することは到底不可能なことは想像できる。 それでは、どうやって設計するかと言うと、多くのエンジニアーで寄ってたかって設計す るのである。エンジン、トランスミッション、ブレーキ、居住空間、タイヤ、オーディオ 機器、空調機器、操作パネル、サスペンション他のように、部品ごとに設計を担当するの である。重要なことは、部品単位、はっきりと区分けをして設計をすることです。
部品ごと設計を行うが、それぞれの接続に関しては、予め決めておく必要がある。 たとえば、エンジンとトランスミッションでは、その接続方法を決めてから、各々設計に かかる。そうしないと、最後に組み合わせるときに、それぞれの部品が接続できないとい うことになりかねない。
部品ごと設計が終われば、すべてを組み合わせて、自動車の全体の設計が完了である。予めそれぞ れの部品の接続方法が決められているので、ちゃんとした自動車が出来上がる。大雑 把に言うと、自動車の設計は、このようにして行われる。製造もほとんどこれに似ている。 部品をつくり、最後に組み立てて完成である。この方法は、大規模なものを作るとき に行われる一般的な方法で、重要なことは、
ここでは、自動車をエンジンやトランスミッション等、1段階に分けましたが、実際には、 更に細かく分ける。エンジンであれば、ピストンやバルブ、シリンダーと分ける。部品に よっては、更に細かく機能ごとに分けることもある。機能ごとに細かく分けると、一つの 部品がかなり単純になることが分かるでしょう。
プログラムでは、この特定の機能ごとの集まりをサブルーチンという。メインルーチ ンは、プログラム全体を統括しているもの、自動車のフレームみたいなものと考えれば良 いでしょう(ちょっと強引か)。
自動車みたいな複雑な機械も、単純な機能の部品に分解できるのである。単純な部品の設 計は簡単で、誰でもできるようになる。その代わり、その機能だけ分かる人が寄って集っ て設計をするのである。大規模プログラムも一緒で、それは機能毎に分割され、大人数で 寄って集って、コーディングするのである。これで、プログラムを単純な機能に分割する ことが分かったと思う。
実際に仕事をする場合でも、細かい分かりやすい作業に分割することはきわめて重要であ る。アポロ計画が象徴的で、この辺については、授業で話す。
プログラムも一緒である。それを構成する機能の集まりで理解した方が簡単である。 Windowsの4千万行もあるプログラムの各行を説明されても全く分からない。
このことから、機能毎に分けるとプログラムが容易になるとともに、その内容が分かりや すくなることが理解できるであろう。その違いを、図1と 2に示す。このように、機能別に分けることにより、プログラ ムは分かりやすくなる。そして、機能がはっきりすれば分担してプログラムを書くこ ともできる。ただ、自動車では部品間の接続方法を決める必要があったのと同じように、 プログラムでは処理するデータの受け渡しを決めなくてはならない。
自動車の部品にはどれも優劣な無いが、プログラムの場合、1つだけ特別な機能のルーチ ンがある。メインルーチン(メイン関数)と呼ばれるものである。これは、最初に実行され るプログラムである。プログラムの場合、1行毎順番に実行されるため、どれから実行す るか決める必要がある。自動車の部品の場合、それぞれが同時に動き機能するため、メイ ンルーチンに対応するものがない。