第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… 今回は考えなくてよいが、実際にはきちんと考 えなければならないことがあります。
© Copyright 2024 ExpyDoc