43
第 第第第第第第第第第第第 第第第第第第 第第第第第第 ~2~

第3回 手続き指向のプログラム

Embed Size (px)

DESCRIPTION

第3回 手続き指向のプログラム. ~同じ仕事は2度書かない~. 学習目標. 手続き指向のプログラムを書ける メソッドを使う利点を説明できる Java でのメソッドの使い方を説明できる 引数と返り値の説明ができる メソッドを使って手続き指向のプログラムが書ける. 3.1 同じ意味の 仕事はカタマリに. 3.1.1 同じ仕事が何度も ①前回のプログラムの問題点 ②同じ意味の仕事は2度書かない. 3.1.1 同じ仕事が何度も. ①前回のプログラムの問題点. 例題3-1 ( Example3_1.java).   //商品種類を追加する - PowerPoint PPT Presentation

Citation preview

第3回 手続き指向のプログラム

~同じ仕事は2度書かない~

学習目標 手続き指向のプログラムを書ける

メソッドを使う利点を説明できる Java でのメソッドの使い方を説明できる 引数と返り値の説明ができる メソッドを使って手続き指向のプログラ

ムが書ける

3.1 同じ意味の仕事はカタマリに

3.1.1 同じ仕事が何度も ① 前回のプログラムの問題点 ② 同じ意味の仕事は 2 度書かない

3.1.1 同じ仕事が何度も ① 前回のプログラムの問題点

   //商品種類を追加する int addId = 1001;//コーラを追加する for(int i=0;i<10;i++){//商品種類が… if(itemTypeArray[i] == -1){//入っていない itemTypeArray[i] = addId;//書き込む break; } } addId = 1002;//ソーダを追加する for(int i=0;i<10;i++){//商品種類が… if(itemTypeArray[i] == -1){//入っていない itemTypeArray[i] = addId;//書き込む break; } }

例題 3-1(Example3_1.java

)

問題点 同じ仕事を2度書いてしまっている

追加、削除を100回やるために、100回ほとんど同じことを書かなくてはいけない。

100回書いたはいいが、アルゴリズムを変えるときはどうするのか?

人間の仕事ではない

② 同じ仕事は2度書かない プログラム中で同じ意味の仕事は2度

書いてはいけない 変更が容易にできるプログラムのために 他人が読めるプログラムのために バグの少ないプログラムのために

コピーペーストをしてからちょっとだけ変更

3.2 メソッド 3.2.1 メソッドとは 3.2.2 メソッドを使ったプログラム

① メソッドを定義する ② メソッドを呼び出す ③ 引数を渡す Java の文法-変数のスコープ- ④ 返り値のあるメソッド

3.2.1 メソッドとは? メソッドは、何度も同じ仕事を書かなくてすむよう

に、仕事をまとめて書くことができる仕組みです。 仕事ごとにプログラムを分けると、人間にわかりや

すいプログラムになります。 一つのプログラムは、たくさんのメソッドから成

り立ちます。 main() もメソッドの一つです。

プログラム

メソッドmain メソッド

add メソッド

追加して!

メソッドを使う   //商品種類を追加する int addId = 1001;//コーラを追加する for(int i=0;i<10;i++){//商品種類が… if(itemTypeArray[i] == -1){//入っていない itemTypeArray[i] = addId;//書き込む break; } } addId = 1002;//ソーダを追加する for(int i=0;i<10;i++){//商品種類が… if(itemTypeArray[i] == -1){//入っていない itemTypeArray[i] = addId;//書き込む break; } }

同じ仕事だから // 「追加する」メソッド public static void add(int[] targetArray,int addId){ for(int i=0;i<10;i++){//商品種類が… if(itemTypeArray[i] == -1){//入っていない itemTypeArray[i] = addId;//書き込む break; } } }

同じ仕事を一つにした「追加する」メソッドを作ります

例題 3-2(Example3_2.java

)

例題 3-1(Example3_1.java

)

3.2.2①メソッドを定義する

public static void add(int[] targetArray,int addId){  // 商品種類が入っていない箱を探す for(int i=0;i<10;i++){ if(targetArray[i] == -1){//入っていない targetArray[i] = addId;//書き込む break; } }}

メソッドの名前

引数

仕事

メソッドを置く位置 Javaでは、クラスの中にメソッドを書きます。

(メソッドの中にはメソッドは書けません。 )

public class Example3_1{ public static void main(String args[]){ … }

public static void add(int[] targetArray,int addId){ … }}

メソッドには必ずコメントをつける

メソッドには、必ずどのような目的を持った仕事をするのか、コメントで書いておきます。public class Example3_1{

/** * プログラム・メイン */ public static void main(String args[]){ … }

/** * 商品種類を追加する */ public static void add(int[] targetArray,int addId){ … }}

例題 3-1(Example3_1.java

)

② メソッドを呼び出す

add メソッド

メソッドは作っただけでは意味がない 実行して、自動的に呼ばれるのは、 main メソッド

だけ

プログラム

main メソッドmain メソッドmain メソッド

メソッドを呼び出す メソッドは、メソッドから呼び出され

て仕事をします。 仕事が終わると、呼び出し側が仕事の続き

をします。

追加して!

add メソッド

プログラム

main メソッドmain メソッドmain メソッド add メソッドmain メソッド add メソッドmain メソッド

メソッドを呼び出す方法

public class Example3_2{ /** * メインメソッド */ public static void main(String args[]){ … //追加する (メソッドを呼び出す ) add(itemTypeArray,1001); }

/** * 追加するメソッド */ public static void add(int[] targetArray,int addId){ … }}

メソッドの名前と引数を渡してメソッドを呼び出します。

例題 3-2(Example3_2.java

)

メソッドの呼び出し練習問題

次のプログラムの出力はどうなります?

public class Practice3_1 {

public static void main(String args[]){ System.out.println("A"); method1(); System.out.println("B"); method2(); System.out.println("C"); }

public static void method1(){ System.out.println("D"); method2(); System.out.println("E"); }

public static void method2(){ System.out.println("F"); }

public static void method3(){ System.out.println("G"); }}

テキスト練習問題 3-1

答え

ADFEBFC

③ 引数を渡す 仕事をするときに、材料が必要な場合

があります 「追加する」という仕事をするためには、

どんな材料が必要ですか?

add メソッド

addId1001

追加する商品種類

[5][4][3][2][1][0]-1 -1 -1 -1 -1 -1

追加する配列

引数 メソッドを作るときは、仕事をするた

めに必要な材料を明らかにします。それを引数(ひきすう)といいます。

add メソッド

addId1001

追加する商品種類

[5][4][3][2][1][0]-1 -1 -1 -1 -1 -1

追加する配列

仕事の材料=引数

材料の受け渡し方

add メソッドmain メソッド

addId1001

[5][4][3][2][1][0]-1 -1 -1 -1 -1 -1

引数

実引数として渡す

仮引数として受け取る

仮引数として受け取るためには

public static void add(int[] targetArray,int addId){ …} 仮引数を宣言する

メソッドを作るときに仮引数を宣言します。 通常の変数の宣言と同じ形にします。 複数ある場合は「 , 」で区切ります。

実引数として受け渡すには

メソッドを呼び出すときに、実引数を渡します。 宣言ではありません。実際の値を渡します。 仮引数に代入する感じで。

public static void main(String args[]){ int[] itemTypeArray = new int[10]; … add(itemTypeArray,1001); }

実引数を渡す

実引数と仮引数の結合

add(itemTypeArray,1001);

public static void add(int[] targetArray,int addId)

呼び出し側

呼び出され側

メソッドが呼ばれると、実引数が仮引数に自動的に代入されるので、材料が渡せます。

int[] targetArray = itemTypeArrayint addId = 1001

実引数と仮引数の結合

Java の文法-変数のスコープー メソッド内で宣言した変数はメソッド

内でのみ有効public class A{

public static void main(String args[]){int i;

i = 3;//これは OK } public static void methodA(int x){

i = 3;//コンパイルエラー }}

i の有効範囲

変数のスコープ(2) メソッドの仮引数の有効範囲もそのメ

ソッド内のみpublic class A{

public static void main(String args[]){x = 3;//コンパイルエラー

   }     public static void methodA(int x){

x = 3;//OK}

}

仮引数 target の有効範囲

変数のスコープ(3) 実は、クラス内で有効な変数も作るこ

とができます。来週やります。(今日は使いません)

public class A{ static int i;

public static void main(String args[]){i = 3;

}}

なぜ引数が必要なのか (1) スコープで説明したように、 add メ

ソッドは main メソッドでのみ有効な「 itemTypeArray 」を知ることができません。public class Example{

public static void main(String args[]){int[] itemTypeArray = new int[10];System.out.println(itemTypeArray[3]);//OK

} public static void add(){

System.out.println(itemTypeArray[3]);//コンパイルエラー}

}

public class Example{

public static void main(String args[]){ int[] itemTypeArray = new int[10]; System.out.println(itemTypeArray[3]);

} public static void add(int[] targetArray){

System.out.println(targetArray[3]); //OK}

}

なぜ引数が必要なのか (2) add メソッドが itemTypeArray を知

るためには、教えてもらう必要があります。そこで仮引数を利用するのです。

public class Example{

public static void main(String args[]){int[] itemTypeArray = new int[10];add(itemTypeArray);

} public static void add(int[] targetArray){

System.out.println(targetArray[3]);}

}

なぜ引数が必要なのか (3) main メソッドは実引数として値itemTypeArray を与えます。

public class Example{

public static void main(String args[]){int[] itemTypeArray = new itemTypeArray[10];add(itemTypeArray);

} public static void add(int[] targetArray){

System.out.println(targetArray[3]);}

}

なぜ引数が必要なのか (4) 与えられた実引数 itemTypeArray が

仮引数 targetArray に代入され、 addメソッドで追加するために使えるようになります。

代入される

④ 返り値のあるメソッド 検索メソッドを作ろう!

追加メソッドを参考にしながら、検索メソッド「 search 」を作っていきましょう!

引数には何が必要ですか?

引数に必要なもの

main メソッド search メソッド

検索して!

検索対象の配列 itemTypeArray と検索する商品番号 searchId が必要

検索結果を返してほしい main メソッドは検索してもらったら、

結果(あった、なかった)を知りたいですね!

main メソッド search メソッド

検索して!

あったよ! / なかったよ!

返り値 メソッドは、仕事の結果を「返り値」

として返すことができます

main メソッド search メソッド

あったよ! / なかったよ!

返り値

Java で返り値のあるメソッドを書く

まず、返り値をどの型で返すのかを決めます 今回の場合、「あった、なかった」なので、

真偽値型の boolean を使うことにしましょう

true  = あったfalse  = なかった

返り値の型を宣言する メソッド宣言の返り値を boolean にし

ます  public static boolean search(int[] targetArray,int searchId){    …  }

追加メソッドの時は、「 void 」でした。void とは、「返り値がない」という意味なのでした

適切な値を返す

public static boolean search(int[] targetArray,int searchId){ //一つ一つ商品種類を探す for(int i=0;i<10;i++){ if(targetArray[i] == searchId){//見つかった return true; } }

//見つからなかった return false; }

return [ 値 ] で返り値を返します

例題 3-2(Example3_2.java

)

このプログラム間違ってない?

public static boolean search(int[] targetArray,int searchId){ //一つ一つ商品種類を探す for(int i=0;i<10;i++){ if(targetArray[i] == searchId){//見つかった return true; } }

//見つからなかった return false; }

見つかって、 true を返した後、for 文を抜けたら、 false も返してしまわないですか?

例題 3-2(Example3_2.java

)

まちがってないです 値を返した時点で、メソッドは終了し、main に戻るので、見つかったときもうまく動きます。 メソッドは返り値を2つ返すことはでき

ません。

3.2 プログラムの意味とメソッド

3.3.1 プログラムを意味ごとにまとめる

3.3.1  プログラムを意味ごとにまとめる

メソッドを使って、仕事を意味ごとにまとめていくのが、手続き指向の基本です 「商品種類の管理」プログラムにおける、

目的の階層構造をもう一度考えてみましょう

目的の階層構造 自動販売機のプログラム

商品種類を管理する 商品種類を追加する 商品種類を検索する 商品種類を削除する 商品種類を提示する

目的の階層構造とメソッド 自動販売機のプログラム

商品種類を管理する -main() 商品種類を追加する -add() 商品種類を検索する -search() 商品種類を削除する -remove() 商品種類を提示する -display()