PR

11月3日 ほのちゃん,3才のバースデイである。こうしろうの妹ほのちゃんは3年前の11月3日午前3時3分に生まれたのである(いや,ほんと)。明日は,いよいよ七五三だ。

 さて,C言語のポインタの勉強で悩んでいるこうしろうにピッタリな記事が日経ソフトウエア2001年12月号に載っていた。丸山竜也さんの連載『C/C++基礎の基礎』第6回「ポインタと配列の深い関係」である。前回の連載『ゼロから学ぶC/C++言語』よりも,もっとわかりやすくポインタについて解説されている。こうしろうは,その記事を1時間かけてじっくりと読んだ。だから,この日はこれでおしまい(ちなみに,同号の特集2第4部には,私の記事も載っている。読んでいただけるとうれしい)。

11月4日 昨晩からの雨も上がり,絶好の七五三日和!美容院で頭をセットしてもらい,妻に着物を着せてもらったほのちゃんはニコニコ。私の母は近所の家にまで,ほのちゃんの着物姿を披露しに行く始末。やっぱり女の子となると妻や母の真剣さが違う(こうしろうやかずの時はもっと適当だったような気がする)。でも,神社で受付を済ませ,順番を待っているうちに,ほのちゃんは眠たくなってしまった。http://www.exe.ne.jp/~kousirou/hono1.htmlに七五三の写真もアップしてあるのだが,不機嫌な顔とワヤワヤになってしまった様子だけである。

 止め処もない親バカ話にピリオドを打って本題に入ろう。まず,サンプルプログラムをこうしろうが打ち込み,動作を確認する。
―――――――――――――――――――――――――――――――――
#include<stdio.h>
#define DATANUM 5
int sumarray(int array[],int num)
{
 int i,s = 0;
 for(i = 0; i < num; i++)
  s += array[i];
 return s;
}
int main()
{
 int a[DATANUM],i,sum;
 for(i = 0; i < DATANUM; i++) {
  printf("%d 番目の数値を入力してください: ",i + 1);
  scanf("%d",&a[i]);
 }
 sum = sumarray(a,DATANUM);
 printf("合計は %d です。\n",sum);
 return 0;
}
―――――――――――――――――――――――――――――――――
 main関数で配列aに数値を入力していき,sumarray関数でその合計を取り,表示するプログラムであるsumarray関数に配列名と配列の要素数を渡している。配列名は配列の先頭アドレスを表すので,先頭から順に配列の要素数分累積していくことで合計が求まる。

 サンプルプログラムをそのまんま打ち込み,コンパイル,実行しているだけでは芸がないので(入力ミスをしない限り,正しく動くに決まっている),「ポインタ変数で受け取って,合計してごらん」と課題を出した。
―――――――――――――――――――――――――――――――――
#include<stdio.h>
#define DATANUM 5
int sumarray(int *a,int num)
{
 int i,s = 0;
 for(i = 0; i < num; i++)
  s += *(a + i);
 return s;
}
int main()
{
 int a[DATANUM],i,sum;
 for(i = 0; i < DATANUM; i++) {
  printf("%d 番目の数値を入力してください: ",i + 1);
  scanf("%d",&a[i]);
 }
 sum = sumarray(a,DATANUM);
 printf("合計は %d です。\n",sum);
 return 0;
}
―――――――――――――――――――――――――――――――――
 こんどは,配列名をポインタ変数*aで受け取り,s += *(a + i)でポインタの位置をずらしながら合計を計算している。
 
 こうしろうがプログラムをテストする様子を眺めていた。このプログラムは5回,数値の入力を求める。あまり経験のない初心者はテストデータとして適当な値(23とか19とか)を打ち込むか,1,2,3…などと連番を入力することが多い。この方法だと,プログラムの実行結果を検証するために暗算を行うか電卓を取り出す必要がある。こうしろうは,1,10,100…と入力しだした。このようにテストデータを入力すると,結果が1並びになれば,それだけでテストOKと判断できる。「お前,センスあるなあ」と肩越しに感心すると,以前私がそうやってテストしていたからだと言う。「へー,そう」と他人事のように相づちを打つ。最近,自分の言ったことや,やったことをすぐ忘れてしまう。