プログラムはコンピュータに何らかの計算処理を行わせるために必要な言葉のようなものですから、文法を持っています。しかしそれは、英語のような文法と比較すると、とてもシンプルです。プログラム言語の種類は多く、C言語やC++、C#、JAVA、JAVAスクリプト、FORTRAN、PERLなど、さまざまです。広く言えばHTMLなども含まれるでしょう。でも、プログラムを学ぶ上で難しいと思われるのは、文法そのものではなく、プログラムをどう書けばよいのか、どういう流れにしなければならないか、だと思います。逆に、何らかの処理を行わせたいときに、プログラムの書き方は一通りではあるとは限りません。この自由度がかえって初学者を混乱させるのかもしれません。

 

ではどうすればプログラムを作れるようになるのか、それは「変数(記憶領域)への数値の代入レベル」で処理を考えるようにすることだと思います。また、「どういう流れで変数の値が変わっていくのか」、そこまで考え方を細かくする訓練をすることではないでしょうか。例えば、1から10までの和を求めて出力するプログラムを作成するとしたら、どうしますか。sumという名前の変数を用意して、「sum←1+2+...+10」(←は代入を示す)のように一行で記述しますか。これでも間違いではありませんが、普通はしません。1から1000までの和の場合に、これでは困ってしまいますね。

普通は、最初に「sum←0」とし、次に「sum←sum+1」、また次に「sum←sum+2」...のように考えます。これを日本語的に言うと、最初に「sumという変数に0を代入」しておいて、次に「現在のsumの内容に1を足してsumの内容を更新」し、また次に「現在のsumの内容に2を足してsumの内容を更新する」...のようになります。これを10まで繰り返せば、和が求まります。この「同じような処理を繰り返す」ことが実は重要で、プログラムの流れ方のひとつである「反復処理」という概念にあたります。でも繰り返したら、やっぱりプログラムが長くなってしまうのか、そうではありません。同様な処理なので、変わっているところだけを変えて、一行で書くのです。この例においては、「sum←sum+i」などと書きます。この「i」を1から10まで変化させてこの一行の処理を繰り返させるのです。繰り返しの書き方は、プログラム言語によって異なります。最初に言った、「変数への代入レベルで、どういう流れでその値が変わっていくのか」、それを考えれば、この処理の仕方が理解できるでしょう。「sum←1+2+...+10」の書き方は、人間的というか、数学的な考え方そのものであり、あまりプログラム的ではないのです。

 

もう一つ例を挙げましょう。入力装置から何らかの2つの異なる数値が読み取られ、それぞれ「val1」と「val2」という変数に格納されているとしましょう。このときに、どちらの方が大きいかを判別してその値を出力するとしたら、どうしますか。当然、val1とval2の内容を比較して、それに応じて処理を変えることを考えるべきです。つまり、val1が大きければこの値を出力し、val2が大きければこの値を出力する、というように処理を変えるのです。これは「条件分岐」という考え方に当たります。「もしval1がval2より大きければ」という条件は、たいてい、「if(val1>val2)」などのようにかかれます。そして(条件が満たされていれば)val1を出力します。この次に、今度は「if(val2>val1)]としてこの条件が満たされているならば、あるいは最初の条件が満たされていない場合として(elseなどを使う)、val2を出力させる処理を書けばよいのです。

大きい方の値を格納する変数を用意しても良いです。これをvmaxなどとします。最初に「vmax←val2」と書いておいて、その後で、「if(val1>val2)」ならば「vmax←val1」のような処理を書きます。最後に単にvmaxを出力します。最後のvmaxには必ず大きいほうの値が入っていることに気づいたでしょうか。

 

このような細かいことを考えていかないと、正しいプログラムはなかなか書けないと思います。また、サンプルプログラムを読んで理解できても、いざプログラムを書くとなると、手がとまってしまう、という経験はないでしょうか。この辺は英語などと似ていて、聞き取りはできるけど話せない、という感じなのでしょうか。インプットだけではなくアウトプットする訓練も重要なのです。さらにプログラミングにはデバッグという作業がついてまわります。とりあえずプログラムが書けました。さて、コンパイルしてみよう、すると文法エラーが出てきて。これはまだいいです。文法エラーははっきりしています。コンピュータのエラー表示や文法書を見れば、まもなく間違いに気づくでしょう。

 

文法エラーが消えた、コンパイル成功、さてやっと実行です。おや、実行結果がおかしい。これが困りものです。どこがおかしいか、コンピュータは示してくれません。コンピュータは文法的に正しく記述されたプログラムをその流れに従って実行し、結果を出力したまでのことです。問題は、プログラムの流れが、プログラマが考えているような処理になっていないことでしょう。こうなると、どこがおかしいか、プログラムとにらめっこになります。ここでのポイントは、やはり変数への代入レベルで考えることです。一つ一つの変数が、期待した値を格納しているのか、ところどころで変数の値を出力するなどして、確かめていくことです。また、条件分岐は本当に正しくされているか、繰り返し回数は正しいか、などの流れを確認することも重要です。優秀なプログラマには、プログラムを正しく書くことはもちろん、もし間違っていた場合に、効率的に短時間で問題点を解決することも必要とされるでしょう。