Kさんの住む町では,毎年秋に町内会が防災訓練を開いている。町は四つの地区に分かれており,町内会は地区ごとに参加者の目標人数を決めて,回覧板や掲示板で参加を呼びかけている。今年の訓練で受付係を手伝ったKさんは,受付の記録をもとに,目標に届かなかった地区や参加の少なかった年代を調べて,来年の呼びかけに役立てることにした。
受付では,参加者一人ごとに受付番号を割り当て,住んでいる地区を表す地区コード(1〜4)と,年齢層を表す年代コードを記録した。年代コードは,1が19歳以下,2が20〜39歳,3が40〜64歳,4が65歳以上を表す。今年の目標人数は,地区1から地区4の順に4人,3人,3人,4人である。Kさんは,地区ごとの集計を次の規則1・規則2で行うことにした。
表1は,今年の受付の記録である。
| 受付番号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 地区コード | 2 | 1 | 3 | 4 | 2 | 1 | 2 | 3 | 1 | 4 | 2 | 3 |
| 年代コード | 3 | 4 | 2 | 1 | 2 | 4 | 3 | 2 | 3 | 2 | 1 | 3 |
規則1により,地区2の人数は4人,地区3の人数は3人である。また,地区1の人数はア人である。地区4は目標に届かない地区であり,その不足人数はイ人である。一方,地区3は人数と目標人数が等しいので,目標に届かない地区ではない。
Kさんは,規則2の「人数が目標人数より少ない」という条件が,「目標人数から人数を引いた値がウ」という条件と同じであることに気づいた。
Kさんは,規則1・規則2に従って,目標に届かない地区とその不足人数,および目標に届かない地区の数を表示するプログラムを作成した(図1)。
配列 Chiku には表1の地区コードを受付番号の順に格納する。配列 Mokuhyou には地区1から地区4の目標人数を地区の番号の順に格納する。配列の添字は1から始まり,Chiku では受付番号を,Mokuhyou では地区の番号を表す。例えば,Chiku[4] の値は受付番号4の参加者の地区コード4であり,Mokuhyou[2] の値は地区2の目標人数3である。(03)行目と(04)行目では,関数「要素数」を用いて,受付の記録の件数を変数 n に,地区の数を変数 m にそれぞれ代入する。
Z が [5, 2, 7] のとき,要素数(Z)は3となる。配列 Ninzu は地区ごとの人数を表し,添字は地区の番号である。(05)行目で全ての地区の人数を0にしておき,(06)〜(08)行目の繰り返しで規則1を行う。受付番号 i の参加者の地区コードを(07)行目で変数 c に入れ,(08)行目で地区 c の人数を1だけ増やす。(09)〜(13)行目では規則2を行う。変数 tarinai は目標に届かない地区の数を表す。地区 k が目標に届かない地区であれば,(12)行目でその地区の番号と不足人数を表示し,(13)行目で tarinai を更新する。最後に(14)行目で tarinai の値を表示する。
図1のプログラムを実行したところ,表示された地区と不足人数は,問1の規則1・規則2で求めた結果と一致した。
Kさんは,図1の結果を町内会長に報告した。
会長:地区1と地区4には,来年はもっと呼びかけが必要ですね。地区ごとに,どの年代の参加が少なかったかもわかりますか。
会長:最も少ない年代が二つ以上あるときは,どうしますか。
Kさんは,地区ごとに年代別の人数を数え,その人数が最も少ない年代を表示するプログラムを作成した(図2)。配列 Nendai には表1の年代コードを受付番号の順に格納する。配列 Nensu は,いま調べている地区の年代別の人数を表し,添字は年代コードである。(04)行目からの繰り返しで地区 k を1から4まで変え,(05)〜(08)行目で地区 k の参加者だけについて年代別の人数を数える。(09)〜(12)行目では,年代1から順に人数を比べ,それまでに調べた中で人数が最も少ない年代の年代コードを変数 sukunai に記録する。なお,(06)行目のエには,図1のエと同じものが入る。
(図2中の⓪〜③は,文を挿入する位置の候補を表す。⓪は(04)行目の直前,①は(04)行目の繰り返しの中で(05)行目の直前,②は(05)行目の繰り返しの中で(06)行目の直前,③は(04)行目の繰り返しの中で(09)行目の直前の位置である。)
図2には,配列 Nensu に最初の値を代入する処理が抜けている。そこでKさんは,「Nensu = [0, 0, 0, 0]」という1行を,図2のシの位置に挿入した。このプログラムを実行すると,図3のように表示された。
図3から,地区1と地区3では19歳以下の参加者が一人もいなかったことがわかった。
翌年の訓練の受付の記録は10件であった。Kさんは,1行を挿入した後の図2の(01)行目と(02)行目を,翌年の記録に合わせて次のように変更して実行した。このとき,(12)行目の代入 sukunai = j は,地区1から地区4までを通して全部でス回行われた。