オブジェクトプログラミング

オブジェクトプログラミング
第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」としてください。
• 前回の授業でやった形式でコメントがつい
ていないものは大幅減点いたします。
• 添付でも可。