第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
答え
A
D
F
E
B
F
C
③ 引数を渡す
仕事をするときに、材料が必要な場合 があります
「追加する」という仕事をするためには、
どんな材料が必要ですか?
add
メソッドaddId 1001
追加する商品種類
[5]
[4]
[3]
[2]
[1]
[0] -1 -1 -1 -1 -1 -1
追加する配列引数
メソッドを作るときは、仕事をするた めに必要な材料を明らかにします。そ れを引数(ひきすう)といいます。
add
メソッドaddId 1001
追加する商品種類
[5]
[4]
[3]
[2]
[1]
[0] -1 -1 -1 -1 -1 -1
追加する配列仕事の材料=引数
材料の受け渡し方
add
メソッドmain
メソッドaddId 1001
[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 = 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]);//
コンパイルエ ラー}
}
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()
商品種類を提示する