430 likes | 494 Vues
第3回 手続き指向のプログラム. ~同じ仕事は2度書かない~. 学習目標. 手続き指向のプログラムを書ける メソッドを使う利点を説明できる Java でのメソッドの使い方を説明できる 引数と返り値の説明ができる メソッドを使って手続き指向のプログラムが書ける. 3.1 同じ意味の 仕事はカタマリに. 3.1.1 同じ仕事が何度も ①前回のプログラムの問題点 ②同じ意味の仕事は2度書かない. 3.1.1 同じ仕事が何度も. ①前回のプログラムの問題点. 例題3-1 ( Example3_1.java). //商品種類を追加する
E N D
第3回 手続き指向のプログラム ~同じ仕事は2度書かない~
学習目標 • 手続き指向のプログラムを書ける • メソッドを使う利点を説明できる • Javaでのメソッドの使い方を説明できる • 引数と返り値の説明ができる • メソッドを使って手続き指向のプログラムが書ける
3.1 同じ意味の仕事はカタマリに • 3.1.1 同じ仕事が何度も • ①前回のプログラムの問題点 • ②同じ意味の仕事は2度書かない
3.1.1 同じ仕事が何度も • ①前回のプログラムの問題点 例題3-1 (Example3_1.java) //商品種類を追加する 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; } }
人間の仕事ではない 問題点 • 同じ仕事を2度書いてしまっている • 追加、削除を100回やるために、100回ほとんど同じことを書かなくてはいけない。 • 100回書いたはいいが、アルゴリズムを変えるときはどうするのか?
コピーペーストをしてからちょっとだけ変更 ②同じ仕事は2度書かない • プログラム中で同じ意味の仕事は2度書いてはいけない • 変更が容易にできるプログラムのために • 他人が読めるプログラムのために • バグの少ないプログラムのために
3.2 メソッド • 3.2.1 メソッドとは • 3.2.2 メソッドを使ったプログラム • ①メソッドを定義する • ②メソッドを呼び出す • ③引数を渡す • Javaの文法-変数のスコープ- • ④返り値のあるメソッド
追加して! 3.2.1 メソッドとは? • メソッドは、何度も同じ仕事を書かなくてすむように、仕事をまとめて書くことができる仕組みです。 • 仕事ごとにプログラムを分けると、人間にわかりやすいプログラムになります。 • 一つのプログラムは、たくさんのメソッドから成り立ちます。 • main()もメソッドの一つです。 mainメソッド メソッド addメソッド プログラム
メソッドを使う 例題3-1 (Example3_1.java) //商品種類を追加する 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.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){ … } }
メソッドには必ずコメントをつける • メソッドには、必ずどのような目的を持った仕事をするのか、コメントで書いておきます。 例題3-1 (Example3_1.java) public class Example3_1{ /** * プログラム・メイン */ public static void main(String args[]){ … } /** * 商品種類を追加する */ public static void add(int[] targetArray,int addId){ … } }
②メソッドを呼び出す • メソッドは作っただけでは意味がない • 実行して、自動的に呼ばれるのは、mainメソッドだけ addメソッド mainメソッド mainメソッド mainメソッド プログラム
追加して! addメソッド addメソッド mainメソッド mainメソッド メソッドを呼び出す • メソッドは、メソッドから呼び出されて仕事をします。 • 仕事が終わると、呼び出し側が仕事の続きをします。 addメソッド mainメソッド mainメソッド mainメソッド プログラム
メソッドを呼び出す方法 例題3-2 (Example3_2.java) public class Example3_2{ /** * メインメソッド */ public static void main(String args[]){ … //追加する(メソッドを呼び出す) add(itemTypeArray,1001); } /** * 追加するメソッド */ public static void add(int[] targetArray,int addId){ … } } メソッドの名前と引数を渡して メソッドを呼び出します。
メソッドの呼び出し練習問題 • 次のプログラムの出力はどうなります? 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
答え A D F E B F C
1001 addId 追加する商品種類 -1 -1 -1 -1 -1 -1 [0] [1] [2] [3] [4] [5] 追加する配列 ③引数を渡す • 仕事をするときに、材料が必要な場合があります • 「追加する」という仕事をするためには、どんな材料が必要ですか? addメソッド
仕事の材料=引数 1001 addId 追加する商品種類 -1 -1 -1 -1 -1 -1 [0] [1] [2] [3] [4] [5] 追加する配列 引数 • メソッドを作るときは、仕事をするために必要な材料を明らかにします。それを引数(ひきすう)といいます。 addメソッド
[0] [1] [2] [3] [4] [5] 材料の受け渡し方 仮引数 として受け取る 実引数 として渡す 1001 addId -1 -1 -1 -1 -1 -1 mainメソッド addメソッド 引数
仮引数として受け取るためには • メソッドを作るときに仮引数を宣言します。 • 通常の変数の宣言と同じ形にします。 • 複数ある場合は「,」で区切ります。 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 = itemTypeArray int 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]);//コンパイルエラー } }
なぜ引数が必要なのか(2) • addメソッドがitemTypeArrayを知るためには、教えてもらう必要があります。そこで仮引数を利用するのです。 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 } }
なぜ引数が必要なのか(3) • mainメソッドは実引数として値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]); } }
なぜ引数が必要なのか(4) • 与えられた実引数itemTypeArrayが仮引数targetArrayに代入され、addメソッドで追加するために使えるようになります。 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]); } } 代入される
④返り値のあるメソッド • 検索メソッドを作ろう! • 追加メソッドを参考にしながら、検索メソッド「search」を作っていきましょう! • 引数には何が必要ですか?
引数に必要なもの 検索対象の配列itemTypeArrayと 検索する商品番号searchIdが必要 検索して! mainメソッド searchメソッド
あったよ! / なかったよ! 検索結果を返してほしい • mainメソッドは検索してもらったら、結果(あった、なかった)を知りたいですね! 検索して! mainメソッド searchメソッド
あったよ! / なかったよ! 返り値 • メソッドは、仕事の結果を「返り値」として返すことができます mainメソッド searchメソッド 返り値
Javaで返り値のあるメソッドを書く • まず、返り値をどの型で返すのかを決めます • 今回の場合、「あった、なかった」なので、真偽値型のbooleanを使うことにしましょう true = あった false = なかった
返り値の型を宣言する • メソッド宣言の返り値をbooleanにします public static boolean search(int[] targetArray,int searchId){ … } 追加メソッドの時は、「void」でした。 voidとは、「返り値がない」という意味なのでした
適切な値を返す 例題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; } 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も返して しまわないですか?
まちがってないです • 値を返した時点で、メソッドは終了し、mainに戻るので、見つかったときもうまく動きます。 • メソッドは返り値を2つ返すことはできません。
3.2 プログラムの意味とメソッド • 3.3.1 プログラムを意味ごとにまとめる
3.3.1 プログラムを意味ごとにまとめる • メソッドを使って、仕事を意味ごとにまとめていくのが、手続き指向の基本です • 「商品種類の管理」プログラムにおける、目的の階層構造をもう一度考えてみましょう
目的の階層構造 • 自動販売機のプログラム • 商品種類を管理する • 商品種類を追加する • 商品種類を検索する • 商品種類を削除する • 商品種類を提示する
目的の階層構造とメソッド • 自動販売機のプログラム • 商品種類を管理する-main() • 商品種類を追加する-add() • 商品種類を検索する-search() • 商品種類を削除する-remove() • 商品種類を提示する-display()