第2回 配列の利用

第2回 配列を使ったプログラム
~データをまとめて扱う方法~
学習目標

配列を使ったプログラムが書ける




配列を使う利点を説明できる
Javaでの配列の使い方を説明できる
配列と繰り返し文を使って賢いプログラムが書ける
情報を管理する簡単なアルゴリズムを考え、実
装できる



情報の追加アルゴリズムを考え、実装できる
情報の削除アルゴリズムを考え、実装できる
情報の検索アルゴリズムを考え、実装できる
2.1 配列とfor文

2.1.1 コンピュータに得意な仕事をさせる



①前回のプログラムの問題点
Javaの文法⑤-for文-
2.1.1 配列を使う





①for文だけでは問題解決しない
②同じ意味のデータはまとめて扱う
Javaの文法⑥-配列ー
③配列を利用したプログラム
④配列を利用する利点
2.1.1 コンピュータに
得意な仕事をさせる

前回までのプログラム


商品種類を追加する
取り扱っている商品種類を表示する
何が問題だったか?
前回のプログラムの問題点

変数を一つ一つ扱うのは大変


100個の商品種類を扱いたいときは、100個
の変数を宣言しなければならない。
初期化や条件分岐も100個になってしまう。
人間の仕事ではない
解決するには

コンピュータは同じことを繰り返すのが得
意。

繰り返し文(for文)を使おう!
Javaの文法⑤ーfor文ー

10回仕事を
繰り返す時
for(int i=0;i<10;i++){
仕事;
}
i=0
i<10
yes
仕事
i++
no
①for文だけでは問題解決しない

for文を使って、初期化することを考えま
しょう。
//商品種類を保存するための変数を定義する
int itemType01;
int itemType02;
int itemType03;
//初期化する。-1を入ってないとする
for(int i=0;i<3;i++){
ここになんて書けばいいの??
itemType+i = -1;とは書けないし。
}
②同じ意味の
データはまとめて扱う(1)

今までは、商品種類をたくさん入れるため
に一つ一つの変数として扱っていました。
-1
-1
-1
itemType02
-1 itemType04
itemType01
itemType03
②同じ意味の
データはまとめて扱う(2)

同じ目的の変数が入る一つ一つの変数を
まとめて扱いたいときに配列が使えます。

1まとめで名前をつけ、そこからは番号でたど
ります。
あの人のうちは、
3丁目の左から4番目だよ!
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
itemTypeArray(配列全体の名前)
[9]
配列と繰り返し

配列と繰り返しを使うことによって、同じこ
とを何度も書く必要がなくなります。
//商品種類を保存するための変数を定義する
int[] itemTypeArray = new int[10];
//初期化する。 -1を入ってないとする
for(int i=0;i<10;i++){
itemTypeArray[i] = -1;
}
Javaの文法⑥-配列-
103
0
22
0
51
0
0
0
0
0
0
0
0
[0]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[1]
int[] itemTypeArray = new int[10];//大きさが10の配列を
作る
//配列が作られた時点で、すべての要素には0が入る。
//配列の各要素の指定にはブラケット“[]”を用いる。
itemTypeArray[0] = 103;//0番地に103を挿入
itemTypeArray[1] = 22; //1番地に22を挿入
itemTypeArray[2] = 51; //2番地に51を挿入
③配列を利用したプログラム
例題2-1
(Example2_1.java)
//追加と表示部分を抜粋
//商品種類を追加する
itemTypeArray[0] = 1001;//コーラ
itemTypeArray[1] = 1002;//ソーダ
itemTypeArray[2] = 1003;//お茶
//保存されている商品種類を表示する
for(int i=0;i<10;i++){
if(itemTypeArray[i] != -1){//商品が入っている
System.out.println(itemTypeArray[i]+"は販売中です");
}
}
④配列を利用する利点・欠点

議論しよう
2.2 商品種類の管理

2.2.1 商品種類を管理するとは


2.2.2 商品種類の管理プログラム




①目的の階層構造を考える
①商品種類の追加
②商品種類の検索
③商品種類の削除
2.2.3 今回のプログラムの問題点
2.2.1 商品種類を管理するとは


今までは、提示するだけでしたが、配列を使って
管理することを考えます。
商品種類を管理するとは、



取り扱う商品種類が増えたら、商品種類リストに商品
種類を追加する。
その商品種類を取りあつかっているかチェックするた
めに、商品種類リストから、商品種類の商品番号を探
す。
その商品種類を取り扱うのをやめたら、商品種類リス
トから、商品種類を削除する。
今回プログラムすること



商品種類を追加すること
商品種類を検索すること
商品種類を削除すること
目的の階層構造で考える

自動販売機のプログラム

商品種類を管理する




商品種類を追加する
商品種類を検索する
商品種類を削除する
商品種類リストを提示する(前回やりました)
①商品種類の追加

追加をさらに小さい目的に

1.
2.
“追加する”とはプログラムでどういう
手順で実現できるか?
まだ商品番号の入っていない箱を探す。
(-1が入っている箱を探す。)
見つけたら、そこに商品番号を書き込む。
追加アルゴリズム
1001
0 1002
0 1003
0 1004
-1 -1
-1
-1
-1
-1
-1
[0]
[5]
[6]
[7]
[8]
[9]
[1]
[2]
[3]
[4]
//-----商品番号1004(DDレモン)を追加する-----0123
int addId = 1004;
//商品番号の入っていない箱を探す
for(int i=0;i <10;i++){
i
if(itemTypeArray[i] == -1){//見つけた
itemTypeArray[i] = addId;//商品番号を書き込む
break;
}
例題2-2
(Example2_2.java)
}
1004
addId
②商品種類の検索

検索のアルゴリズムを考えてみよう

ただし検索とは商品番号を指定し、


見つかったときに「見つかりました」と表示し、
見つからなかったときに「見つかりませんでした」と
表示する
ということとする。
検索アルゴリズム(一例)
検索する商品番号を指定する。
配列を順番にたどり、検索する商品番号と、配
列に格納された商品番号の値が同じかどうか
調べる。
見つかったら、繰り返しを中止する。
配列を辿った回数を保存しておき、
1.
2.
3.
4.
1.
2.
配列を最後までたどった場合は、「見つかりません
でした」と表示する
配列を最後までたどらなかった場合は、「見つかりま
した」と表示する
検索プログラムA
例題2-3
(Example2_3.java)
//----------------検索する-------------------int searchId = 1002;//ソーダを検索する
int i;//配列を辿った回数を保存する
for(i=0;i<10;i++){
if(itemTypeArray[i] == searchId){//見つかった
break;
}
}
if(i == 10){//最後まで辿ったが見つからなかった
System.out.println("見つかりませんでした");
}else{
System.out.println("見つかりました");
}
検索プログラムB
例題2-4
(Example2_4.java)
//----------------検索する-------------------int searchId = 1002;//ソーダを検索する
for(int i=0;i<10;i++){
if(itemTypeArray[i] == searchId){//見つかった
System.out.println("見つかりました");
break;
}
if(i == 9){//最後まで辿ったが見つからなかった
System.out.println("見つかりませんでした");
}
}
③商品種類の削除

削除のアルゴリズムを考えてみよう!
削除アルゴリズム(一例)



まず、削除するものが何処にあるか、検索
する。
見つかったら、要素に-1を書き込む。
穴がないように、残りの要素をシフトする。
34を削除する例
103
0 22
0
51
0
34
-1
80
380
[0]
[2]
[3]
[4]
[1]
345
30 187
345
0 187
-1
0
-1
0
-1
[5]
[8]
[9]
[6]
[7]
削除のプログラム
例題2-5
(Example2_5.java)
//--------------------削除する-------------------------int deleteId = 1002;//ソーダを削除する
int i=0;//ループの回数を保存する
for(i=0;i<10;i++){
if(itemTypeArray[i] == deleteId){//見つかった
itemTypeArray[i] = -1;//見つかったら、削除する(実は不要)
break;
}
}
//残りの要素をシフトする
for(;i<9;i++){
itemTypeArray[i] = itemTypeArray[i+1];
}
穴がないようにするといいこと

検索するときに、全部調べなくてすみます。


-1があったら、その先を調べる必要がありま
せんよね!
全部調べなくてすむアルゴリズムを考えて
みましょう。
2.2.3 今回の
プログラムの問題点




挿入のとき、配列が一杯だったらどうする
か?
削除のとき、みつからなかったらどうする
か?
データの重複をどうするか?
etc…

今回は考えなくてよいが、実際にはきちんと考
えなければならないことがあります。