みなさん,山はお好きですか? 筆者は山を眺めているのは好きなのですが,高いところが苦手なので,めったに登ることはありません。でも登山の好きな人の会話を聞いていると「あの山は途中までなだらかで突然,険しくなるんだ。この山はあのルートから登ると頂上付近まで,なだらかなままなんだ」などと,山にも個性があることがわかります。

 プログラミング言語はどうでしょう。Web系のシステムを比較的容易に作成できるPerlやPHPなどのスクリプト言語や,大規模なWebアプリ作成に向くJava,業務アプリケーション開発にはVisual Basicが効率的…と目移りしてしまいますね。しかし山登りと違って,プログラム言語の学習には目的がある場合が多いはずです。「そこに山があるからの登るのだ」というケースはまずないでしょう。登山経験のない人がいきなり険しい山や冬山に登れるわけではないように,プログラミング経験のない人が,新しい言語を付け焼き刃で勉強しても,実用に耐えるプログラムを作成するのは困難です。どんなプログラミング言語にも共通する基礎を身に付けておかなくてはいけません。

 では,最初に勉強するプログラミング言語としては何が良いのでしょうか? まず思いつくのは「結果が出やすいもの」です。ExcelのVBA*1やJavaScriptなどは,少ない学習時間でも成果を出しやすい言語でしょう。しかし,そこから応用が利くか,これからいろいろな言語でプログラムを作っていくためのベースとなりうるかというと,VBAやJavaScriptは実行環境に依存しているという理由で疑問符を付けざるを得ません。

 筆者は,どんなプログラミング言語にも共通する基礎知識を身につけるためにもっとも向いている言語はC言語だと思っています。C言語は,高級言語でありながら低級言語に近い仕様を備えているからです。プログラムがコンピュータの中でどのように動作しているのか,データが実際にどう処理されていくのかイメージすることは決して容易なことではありません。でもC言語は,他のプログラミング言語に比べて,これらをイメージしやすい言語といえます。C言語を通して,値が実際にメモリーに記憶されている様子などを確かめながら,プログラミングの基礎を身につけていけば,多くのプログラミング言語に共通する基礎を理解できるでしょう。

同じ性質,同じ型の複数の値をひとまとめにして扱える配列

 さて,前回までの本連載では,変数を定義して,演算子で計算や比較を行い,制御文で処理をコントロールすれば,プログラムが作れることを説明しました。特に第4回ではforやwhileなどの制御文による繰り返しと,if文やswitch文による条件分岐を組み合わせて,アルゴリズムを実装していくことを解説しました。

 なぜ,プログラムで繰り返し処理を行うかというと,処理すべきデータで同じ性質のデータが繰り返し発生することがよくあるからです。たとえば,5人の生徒にテストを行ったとします。5人の生徒の点数から,平均点を計算したり,最高点を求めたくなったとしましょう。これまでに説明した方法だと,

 int a = 80;
 int b = 90;
 int c = 68;
 int d = 95;
 int e = 100;

のように,a君の点数,b君の点数と,int型の変数を生徒の数だけ定義することになります。一つひとつ変数を定義するのは面倒ですし,計算するときも扱いにくいでしょう。このようななときには,複数の変数をまとめて扱える「配列」を利用すると便利です。

 int tensu[5];

と,「型 配列名[要素数]」のように定義すると,int型の値を5個記憶できる配列が作成されます。

 配列への値の代入は

 tensu[0]=80;

図1●配列のイメージ
図1●配列のイメージ

のように行います。「int tensu[5];」はtensu[0]からtensu[4]までの五つのint型の値を入れる箱を用意するのです(図1)。

 注意してほしい点は,C言語では配列の要素を示すインデックス(添え字)が0から始まるということです。他の言語だと,1から始まる場合もあるので,気をつけてくださいね。

 5人の点数をキーボードから入力し,平均点と最高点を求めて表示するプログラムを作ってみましょう(リスト1)。まずscanf関数の引数にアドレス演算子「&」を使って配列の各要素のアドレスを指定し,キーボードから入力された値を記憶しています(1)。入力が終わると変数goukeiに5人の点数を合計してから(2),5で割り平均を求めています(3)。小数点以下も求めるためにgoukeiをdouble型(倍精度浮動小数点型)で定義しました。printf関数での表示では,変換仕様*2に「%f」を指定して小数が表示されるようにしています。

リスト1●5人の生徒の点数を入力して,平均点と最高点を求めるプログラム
リスト1●5人の生徒の点数を入力して,平均点と最高点を求めるプログラム
[画像のクリックで拡大表示]

 最高点を示すmaxは0で初期化してあります。(4)でtensu[0]に0より大きい値が記憶されていれば,それがまずmaxに代入されます。さらに現在のmaxの値より大きい値があればmaxを上書きします。(5)で最高点を表示します。

 変数が宣言時に初期化できるように,配列も初期化できます。配列の初期化は

 int tensu[5] = {80,90,68,95,100};

というように,「{」と「}」で配列要素を囲って指定します。

 int tensu[5] = {80,90,68};

のように三つまでしか値を指定しなかったときは,tensu[3]とtensu[4]に0が入ります。

 また,配列の宣言で初期化を行う場合は,

 int tensu[] = {80,90,68,95,100};

と,要素数を省略することもできます。