オブジェクトプログラミング 第3回 配列 本日の目標 • 配列を使う利点を説明できるようになる。 • 配列を使ったプログラミングができるように なる。 • メソッドを使う利点を説明できるようになる。 • メソッドを使ったプログラミングができるよう になる。(1bcでやった人は、復習) どんなときに配列が必要? • 要求:少年野球チーム選手の出欠を管理したい。 – 現在グラウンドにいる選手を記録するためのデータ構 造に、グラウンドにやってきた選手を登録する。 – ある選手が練習にきているかどうかをチェックするた めに、そのデータ構造の中に彼の番号を探す。 – 選手が帰宅したら、その選手をデータ構造から削除す る。 – 教科書p.27,28 今日考える問題 • 要求:自動販売機で扱う商品を管理したい。 – 取り扱い商品が増えたら、取扱商品リストに取 扱商品を登録する。 – その商品を取りあつかっているかチェックする ために、取扱商品リストから、その商品の商品 番号を探す。 – その商品を取り扱うのをやめたら、取扱商品リ ストから、その商品を削除する。 ポイント • 登録 • 検索 • 削除 配列なしでプログラミング する場合 //商品番号の定義 //と登録 103 int itemNo1 = 103; itemNo1 int itemNo2 = 22; itemNo2 int itemNo3 = 51; … int itemNo10 = 0 ; 要素の数だけ宣言が必要! 商品番号 0はなしとする。 itemNo3 22 0 51 itemNo4 0 itemNo10 登録ってどういうこと? • 1.まだ商品番号の入っていない箱を探す。 (0が入っている箱を探す。) • 2.見つけたら、そこに商品番号を書き込 む。 103 85を登録する例 itemNo1 51 0 85 itemNo5 0 22 itemNo3 itemNo4 itemNo2 登録プログラムのスケッチ // //商品85を登録する。 //一部を抜粋 int registerNum = 85;//登録する数 //未登録(中身が0だったら)の箱に商品を登録する if(itemNo1 == 0){ itemNo1 = registerNum;//未登録だったら、書き込む }else if(itemNo2 == 0){ itemNo2 = registerNum; } … else if(itemNo10 == 0){ !!要素の数だけif文が必要 itemNo10 = registerNum; 取り扱う商品が増えると大変!! } そこで、配列 • あの人のうちは、3丁目の左から4番目だ よ! [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] itemNo(配列全体の名前) 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[] itemNo = new int[10];//大きさが10の配列を作る //配列が作られた時点で、すべての要素には0が入る。 //配列の各要素には(ブラケット)“[]”でアクセスする。 itemNo[0] = 103;//0番地に103を挿入 itemNo[1] = 22; //1番地に22を挿入 itemNo[2] = 51; //2番地に51を挿入 配列を使った登録のプログラム 103 0 22 0 51 0 85 0 0 0 0 0 0 0 [0] [2] [3] [4] [5] [6] [7] [8] [9] [1] //商品番号85を登録 0123 85 int registerNum = 85; for(int i=0;i <10;i++){ i registerNum if(itemNo[i] == 0){ itemNo[i] = registerNum; break; これなら取り扱う商品が増えても } ほとんどプログラムは変わらない。 } 検索の手順を考えてみよう • 配列を順番にたどっていき、見つかったと ころで、「見つかりました」と表示。 • 配列を最後までたどっても、見つからない 場合は、「見つかりませんでした」と表示。 演習1 • 前回の自動販売機の商品管理の例で、検 索をするプログラムを書いてみよう。 答え //商品番号で在庫を検索するプログラム //一部を抜粋 int[] itemNo = new int[10];//大きさが10の配列を作る itemNo[0] = 103;itemNo[1] = 22; itemNo[2] = 51; //0-2番地に商品番号を挿入 int searchKey = 22; //検索する対象を決める //検索対象を見つける int i;//なぜfor文の外で宣言するのか考えよ for(i=0;i<10;i++){ if(itemNo[i] == searchKey){ break;//見つかったら、ループを抜ける。 } } //在庫の有無を表示する。 if(i == 10){ System.out.println(“見つかりませんでした”); }else{ System.out.println(“見つかりました。”); } 教科書p.36 演習2 • 削除の手順を考えてみよう 答え • まず、削除するものが何処にあるか、検索 する。 • 見つかったら、要素に0を書き込む。 • 穴がないように、残りの要素をシフトする。 34を削除する例 103 0 22 0 51 0 34 08 380 [0] [2] [3] [4] [1] 345 30 187 345 0 187 0 [5] [6] [7] 0 0 [8] [9] 穴がないようにする理由 • 穴があるのを認めると、各セルの値を調べ る前に、そのセルが空かどうか調べる必要 があるので、アルゴリズムが複雑になる。 – 今は0が入っているので気にしなくてよいが、 あとで必要になる。 • 将来的に、空の欄も調べるのは無駄であ り、アルゴリズムの効率も劣化する。 – 教科書p.31 削除のプログラム //商品番号で在庫を削除するプログラム //一部を抜粋 int deleteKey = 34; //削除する対象を決める //削除対象を検索する int i; for(i=0;i<10;i++){ if(itemNo[i] == searchKey){ itemNo[i] = 0;//見つかったら、0を代入する(実は不要) break;//ループを抜ける。 } } //残りの要素をシフトする。 for(int j=i;j<10;j++){ itemNo[j] = itemNo[j+1]; } 教科書p.36 今日のプログラムの問題点 • 挿入のとき、配列が一杯だったらどうする か? • 削除のとき、みつからなかったらどうする か? • データの重複をどうするか? • etc… – 今回は考えなくてよいが、実際にはきちんと考 えなければならない。 どんなときにメソッドが必要か //このプログラムは、一回22を検索して、見つかることを確認した後、22を削除して、もう一度22を検索して、きちんと削除されているかを確認する //プログラムです。コメントは割愛してます。 int[] itemNo = new int[10]; itemNo[0] = 103;itemNo[1] = 22; itemNo[2] = 51; //22を検索する int searchKey = 22; int i; for(i=0;i<10;i++){ if(itemNo[i] == searchKey){ break; } } if(i == 10){ System.out.println(“見つかりませんでした”); }else{ System.out.println(“見つかりました。”); } //22を削除する int deleteKey = 34; int i; for(i=0;i<10;i++){ …途中省略 //22を検索する int i; for(i=0;i<10;i++){ if(itemNo[i] == searchKey){ break; } } if(i == 10){ System.out.println(“見つかりませんでした”); }else{ System.out.println(“見つかりました。”); } 同じ仕事を何度も 書くのは面倒だ。 一つにまとまらないかな? そこでメソッド //このプログラムは、一回22を検索して、見つかることを確認した後、22を削除して、もう一度22を検索し //て、きちんと削除されているかを確認するプログラムです。コメントは割愛してます。 int[] itemNo = new int[10]; itemNo[0] = 103;itemNo[1] = 22; itemNo[2] = 51; //22を検索する find(); //22を削除する int deleteKey = 34; int i; for(i=0;i<10;i++){ …途中省略 //22を検索する find(); わかりやすくなったね! findメソッド public static void find(){ int searchKey = 22; int i; for(i=0;i<10;i++){ if(itemNo[i] == searchKey){ break; } } if(i == 10){ System.out.println(“見つかりませんでした”); }else{ System.out.println(“見つかりました。”); } } メソッド • メソッドは、何度も同じ仕事を書かなくてすむよう に、仕事をまとめて書くことができる仕組みです。 • 仕事ごとにプログラムを分けると、人間にわかり やすいプログラムになります。 • 一つのプログラムは、たくさんのメソッドから成り 立ちます。 – main()もメソッドの一つです。 検索して! メソッド mainメソッド 見つかったよ! findメソッド プログラム Javaでのメソッドの書き方(宣言) public static void main(String args[]) ④ ⑤ ③ ① ② ①この仕事の名前です。任意の名前を付けることができます。 ただし、mainなど、決まっている名前もあります。省略できません。 ②名前の後の括弧内に書いてあるものを「引数」(ひきすう)といい ます。仕事の材料を渡す必要があるときに使います。 必要がない場合も省略できません。()は必ずつけます。 ③そのメソッドが仕事をした結果を返すものである場合に、返す 結果がどの型なのかを示します。何も結果を返さないものはvoidと 書きます。省略できません。 ④誰からアクセス可能なのかを書きます。 ⑤クラスメソッドだと言う意味になります。 メソッドの例 (今日作ってもらいます。) • 「表示」メソッド public static void display(int[] target) ☆配列の中身を表示するために使います。 このメソッドは、配列の中身をすべてSystem.out.printlnする 仕事をします。 仕事をするためには、表示すべき配列を引数で渡す必要が あります。 仕事が終わっても結果はなにも返しません。 メソッドの位置 • Javaでは、クラスの中にメソッドを書きます。 (メソッドの中にはメソッドは書けません。) public class MyClass1{ public static void main(String args[]){ … } public static void display(int[] target){ //配列の中身を表示するプログラムを書く。 } } メソッドの呼び出し • しかし、宣言しただけでは、メソッドは実行されま せん。誰か(他のメソッド)が呼び出す必要があり ます。 – ただし、main()だけは、システムが一番初めに自動的に呼び出し てくれます。 public class MyClass1{ public static void main(String args[]){ int[] itemNo = new int[10]; display(itemNo); } public static void display(int[] target){ //配列の中身を表示するプログラムを書く。 } } 実引数と仮引数 呼び出し側: display(itemNo); 実引数 呼び出され側 public static void display(int[] target) 仮引数 実引数 31 10 64 itemNo mainメソッド この型でお願いします。 OK! 仕事をはじめよう =仮引数 31 10 64 target displayメソッド 今日の課題 • 自動販売機の商品管理プログラムの簡易 版を作ります。(実はただの数字当てです) – 商品番号を整数型(int)の配列としなさい。 – 授業で扱った「挿入」「検索」と「削除」を行なう プログラムを作りなさい。 – 「表示」メソッドを完成させなさい。 – 「表示」メソッドを用いて配列の中身を確認しな さい。 public class MyClass1{ public static void main(String args[]){ int[] itemNo = new int[10]; //配列を作る //挿入する itemNo[0] = 77; itemNo[1] = 99; //この後77,99,44,55,22,88,11,00,66,33,10の順番で挿入しなさい。 display(itemNo); //検索する //ここに66があるかどうか検索するプログラムを書きなさい。 display(itemNo); //削除する //ここに55を削除するプログラムを書きなさい。 display(itemNo); } public static void display(int[] target){ //配列の中身を表示するプログラムを書きなさい。 } } 課題の提出 • 前回と同じです。 • [email protected]宛てにメール で。 • Subjectを「objprog03」としてください。 • 前回の授業でやった形式でコメントがつい ていないものは大幅減点いたします。 • 添付でも可。
© Copyright 2024 ExpyDoc