配列の基本的な考え方

次の仕様とプログラミングを示します。

仕様実行例

1、2、3 の商品番号がつけられる商品がある。

商品番号とその販売個数を、
ENDの入力があるまで繰り返して入力し、
ENDの入力後に、各商品の販売個数合計を表示する。

右実行結果で、が入力。
1行で商品番号とその販売個数の入力をしている。

2 3                         
1 2
3 2
2 1
3 1
1 1
3 2
1 3
END
商品1販売個数 :6
商品2販売個数 :4
商品3販売個数 :5
#include <stdio.h>
main()
{
	int goods[4] = {0,0,0,0};/* 商品販売個数 */
	
	
	
	int id, suu;/* 商品番号と販売個数 入力用 */

	/* 入力の繰り返し */
	while(fscanf(stdin, "%d %d", &id, &suu) == 2){

		goods[id] += suu;

	}

	/* 各商品の販売個数合計を表示 */
	for(id = 1; id < 4; id++){
		fprintf(stdout, "商品%d販売個数 :%d\n", id, goods[id]);
	}
}

この例の実行で、入力の繰り返しが終わった時の配列goodsの記憶内容は、次のようになります。

そしてこれを、1から3の商品をの順番に表示しているわけです。 つまり『商品番号を配列の添え字する』と、決めて使っているわけです。

さてこの場合、先頭要素のgoods[0]が使われていないことに気が付いたでしょうか?
使わないのはもったいない! 商品が3つしかないのであれば、
int goods[3] = {0,0,0};の配列宣言で足りるはずというわけです。 この宣言の場合、商品番号1を、0の添え字に記憶する詰めた次のイメージで記憶しなければなりません。

このように記憶する場合、商品番号が3なら1引いた2の添え字で、goods[2]をアクセスすればよいわけです。 つまり商品番号がidに記憶されるならgoods[id - 1]で販売個数を数えればよいことになります。
 逆に goods[i] の記憶内容は、   (i + 1) の商品番号の販売数になります。

この考えを拡張して、商品番号が、1001 、1002、1003 と、3種類存在して、 1001の商品を、先頭要素goods[0]で数え、 1002の商品をgoods[1]1003の商品をgoods[2]で数えると決めた場合、
  商品番号をidに記憶すると、
 idを使った販売個数が記憶される要素の表現は、   goods[ id - 1001 ] になり、
 goods[i]に記憶される商品番号を  iで表現すると、   i + 1001  になります。

では商品番号が から まであるとして、 その販売個数が次のように記憶されるファイルがあるとします。

このファイルからデータを読み取り、商品番号ごとの販売個数を集計して次のように表示させたい場合を考えてみましょう。


まず、各商品の販売個数記憶集計用に、goodsの配列を用意します。必要最小限の要素数を次の テキストボックス入力ください。
int goods[ ];
この時、の商品番号をsuuの変数内容で増やす処理を行う次の空欄を埋めてください。
goods[ ]+=suu;
また、 goods[ ]++; の表現で増やしている商品番号を次のテキストボックス入力ください。⇒

←入力後に クリックください。(連続して2回正解するとクリアです。)
このクリックで、答えを表示します。