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