• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

シェア "第3回 手続き指向のプログ ラム"

Copied!
43
0
0

読み込み中.... (全文を見る)

全文

(1)

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

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

(2)

学習目標

 手続き指向のプログラムを書ける

メソッドを使う利点を説明できる

Java でのメソッドの使い方を説明できる

引数と返り値の説明ができる

メソッドを使って手続き指向のプログラム

が書ける

(3)

3.1 同じ意味の

仕事はカタマリに

 3.1.1 同じ仕事が何度も

① 前回のプログラムの問題点

② 同じ意味の仕事は 2 度書かない

(4)

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)

(5)

問題点

 同じ仕事を2度書いてしまっている

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

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

人間の仕事ではない

(6)

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

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

変更が容易にできるプログラムのために

他人が読めるプログラムのために

バグの少ないプログラムのために

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

(7)

3.2 メソッド

 3.2.1 メソッドとは

 3.2.2 メソッドを使ったプログラム

① メソッドを定義する

② メソッドを呼び出す

③ 引数を渡す

Java の文法-変数のスコープ-

④ 返り値のあるメソッド

(8)

3.2.1 メソッドとは?

メソッドは、何度も同じ仕事を書かなくてすむよう に、仕事をまとめて書くことができる仕組みです。

仕事ごとにプログラムを分けると、人間にわかりや すいプログラムになります。

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

main()

もメソッドの一つです。

プログラム メソッド

main

メソッド

add

メソッド

追加して!

(9)

メソッドを使う

   // 商品種類を追加する

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)

(10)

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;

} } }

メソッドの名前

引数

仕事

(11)

メソッドを置く位置

Java

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

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

) public class Example3_1{

public static void main(String args[]){

… }

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

}

}

(12)

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

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

public class Example3_1{

/**

* プログラム・メイン */

public static void main(String args[]){

… } /**

* 商品種類を追加する */

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

}}

例題3-1

(Example3_1.java)

(13)

② メソッドを呼び出す

add

メソッド

 メソッドは作っただけでは意味がない

実行して、自動的に呼ばれるのは、

main

メソッドだけ

プログラム

main

メソッド

main

メソッド

main

メソッド

(14)

メソッドを呼び出す

 メソッドは、メソッドから呼び出され て仕事をします。

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

追加して!

add

メソッド

プログラム

main

メソッド

main

メソッド

main

メソッド

add

メソッド

main

メソッド

add

メソッド

main

メソッド

(15)

メソッドを呼び出す方法

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)

(16)

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

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

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

(17)

答え

A

D

F

E

B

F

C

(18)

③ 引数を渡す

 仕事をするときに、材料が必要な場合 があります

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

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

add

メソッド

addId 1001

追加する商品種類

[5]

[4]

[3]

[2]

[1]

[0] -1 -1 -1 -1 -1 -1

追加する配列

(19)

引数

 メソッドを作るときは、仕事をするた めに必要な材料を明らかにします。そ れを引数(ひきすう)といいます。

add

メソッド

addId 1001

追加する商品種類

[5]

[4]

[3]

[2]

[1]

[0] -1 -1 -1 -1 -1 -1

追加する配列

仕事の材料=引数

(20)

材料の受け渡し方

add

メソッド

main

メソッド

addId 1001

[5]

[4]

[3]

[2]

[1]

[0] -1 -1 -1 -1 -1 -1

引数

実引数として渡す

仮引数として受け取る

(21)

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

public static void add(int[]

targetArray,int addId){

}

仮引数を宣言する

メソッドを作るときに仮引数を宣言します。

通常の変数の宣言と同じ形にします。

複数ある場合は「

,

」で区切ります。

(22)

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

 メソッドを呼び出すときに、実引数を渡 します。

宣言ではありません。実際の値を渡します。

仮引数に代入する感じで。

public static void main(String args[]){

int[] itemTypeArray = new int[10];

add(itemTypeArray,1001);

}

実引数を渡す

(23)

実引数と仮引数の結合

add(itemTypeArray,1001);

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

呼び出し側

呼び出され側

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

int[] targetArray = itemTypeArray int addId = 1001

実引数と仮引数の結合

(24)

Java の文法-変数のスコー プー

 メソッド内で宣言した変数はメソッド 内でのみ有効

public class A{

public static void main(String args[]){

int i;

i = 3;//

これは

OK }

public static void methodA(int x){

i = 3;//

コンパイルエラー

}

}

i

の有効範囲

(25)

変数のスコープ(2)

 メソッドの仮引数の有効範囲もそのメ ソッド内のみ

public class A{

public static void main(String args[]){

x = 3;//

コンパイルエラー

   }   

   public static void methodA(int x){

x = 3;//OK }

}

仮引数

target

の有効範囲

(26)

変数のスコープ(3)

 実は、クラス内で有効な変数も作るこ とができます。来週やります。(今日 は使いません)

public class A{

static int i;

public static void main(String args[]){

i = 3;

}

}

(27)

なぜ引数が必要なのか (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]);//

コンパイルエ ラー

}

}

(28)

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 を知るた めには、教えてもらう必要があります。

そこで仮引数を利用するのです。

(29)

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 を与えます。

(30)

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 メ ソッドで追加するために使えるように なります。

代入される

(31)

④ 返り値のあるメソッド

 検索メソッドを作ろう!

追加メソッドを参考にしながら、検索メ

ソッド「 search 」を作っていきましょ

う!

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

(32)

引数に必要なもの

main

メソッド

search

メソッド

検索して!

検索対象の配列

itemTypeArray

と 検索する商品番号

searchId

が必要

(33)

検索結果を返してほしい

 main メソッドは検索してもらったら、

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

main

メソッド

search

メソッド

検索して!

あったよ!

/

なかったよ!

(34)

返り値

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

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

main

メソッド

search

メソッド

あったよ!

/

なかったよ!

返り値

(35)

Java で返り値

のあるメソッドを書く

 まず、返り値をどの型で返すのかを決 めます

今回の場合、「あった、なかった」なので

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

true =  

あった

false =  

なかった

(36)

返り値の型を宣言する

 メソッド宣言の返り値を boolean にし

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

    … }

追加メソッドの時は、「

void

」でした。

void

とは、「返り値がない」という意味なのでした

(37)

適切な値を返す

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)

(38)

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

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)

(39)

まちがってないです

 値を返した時点で、メソッドは終了し

、 main に戻るので、見つかったときも うまく動きます。

メソッドは返り値を2つ返すことはできま

せん。

(40)

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

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

(41)

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

 メソッドを使って、仕事を意味ごとに まとめていくのが、手続き指向の基本 です

「商品種類の管理」プログラムにおける、

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

(42)

目的の階層構造

 自動販売機のプログラム

商品種類を管理する

商品種類を追加する

商品種類を検索する

商品種類を削除する

商品種類を提示する

(43)

目的の階層構造とメソッド

 自動販売機のプログラム

商品種類を管理する -main()

商品種類を追加する

-add()

商品種類を検索する

-search()

商品種類を削除する

-remove()

商品種類を提示する

-display()

参照

関連したドキュメント

int (*add)(int,int) = (void *)p; printf(&#34;add(1, 2): %d\n&#34;, add(1, 2)); VirtualFree(p, 0, MEM_RELEASE); } } 図 3 実行フラグ付きのヒープ領域を確保して

AdCallback インターフェース void didFailToReceiveAdWithError () 機能 広告受信に失敗した場合に呼び出されます。 パラメータ なし 戻り値 なし

②出力制御ユニット等

定義(D)仕様書:内部プロシージャー呼び出し ・呼び出される側にインターフェイスを定義する ・インターフェイスには、外部から呼び出される情報を定義

void bf_search(int start)

void bf_search(int start)

public class ItemTypeList extends ObjectList{. public void

チャットコマンド pyramid