プログラミング入門1

Similar documents
プログラミング入門1

メソッドのまとめ

プログラミング入門1

プログラミング入門1

プログラミング入門1

メソッドのまとめ

プログラミング入門1

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

gengo1-11

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

Microsoft PowerPoint - 10.ppt [互換モード]

プログラミング基礎I(再)

Javaプログラムの実行手順

Microsoft PowerPoint - prog03.ppt

PowerPoint プレゼンテーション

プログラミング入門1

プログラミング実習I

Prog1_6th

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

デジタル表現論・第4回

JavaプログラミングⅠ

GEC-Java

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Microsoft PowerPoint - prog07.ppt

ガイダンス

Microsoft Word - 03

Microsoft PowerPoint - prog09.ppt

プログラミングA

Microsoft PowerPoint - prog09.ppt

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Microsoft Word - no11.docx

Java言語 第1回

デジタル表現論・第6回

Microsoft PowerPoint - chap10_OOP.ppt

Microsoft PowerPoint - 09.pptx

スライド 1

PowerPoint プレゼンテーション

JavaプログラミングⅠ

Java講座

2

Program Design (プログラム設計)

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Microsoft PowerPoint - prog04.ppt

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint ppt

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

PowerPoint Presentation

Microsoft PowerPoint - 計算機言語 第7回.ppt

Prog1_3rd

JavaプログラミングⅠ

JAVA入門

JavaプログラミングⅠ

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Prog1_15th

プログラミングA

Prog1_2nd

プログラムの基本構成

PowerPoint プレゼンテーション

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

PowerPoint プレゼンテーション

Prog2_9th

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

memo

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

論理と計算(2)

基本情報STEP UP演習Java対策

基礎計算機演習 実習課題No6

Microsoft PowerPoint - prog08.ppt

GEC-Java

プログラミングA

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

JavaプログラミングⅠ

Microsoft PowerPoint ppt

プログラミング入門1

人工知能入門

PowerPoint プレゼンテーション

Prog1_10th

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

スライド 1

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

Cプログラミング1(再) 第2回

Javaによるアルゴリズムとデータ構造

プログラミング入門1

Microsoft Word - keisankigairon.ch doc

情報実習Ⅱ

情報処理Ⅰ演習

文字列操作と正規表現

論理と計算(2)

Microsoft PowerPoint - CproNt02.ppt [互換モード]

PowerPoint プレゼンテーション

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

memo

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Transcription:

プログラミング入門 1 第 9 回 メソッド (3)

授業の前に自己点検 以下の質問に答えられますか? メソッドの宣言とは 起動とは何ですか メソッドの宣言はどのように書きますか メソッドの宣言はどこに置きますか メソッドの起動はどのようにしますか メソッドの仮引数 実引数 戻り値とは何ですか メソッドの起動にあたって実引数はどのようにして仮引数に渡されますか 戻り値はどのように利用しますか 変数のスコープとは何ですか Java 1 第 9 回 2

前回の例で復習 public class Combination { public static void main(string[] args) { //combinationメソッドを呼び出す System.out.println("10 人から2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); // ncr = n! / ((n-r)! * r!) を計算するメソッド public static int combination(int n, int r) { // 階乗の計算でfactメソッドを呼び出す return fact(n) / (fact(n-r) * fact(r)); //nの階乗を計算するメソッド public static int fact(int n) { int total = 1; for (int i = n; i >= 1; i--) { total *= i; return total; Java 1 第 9 回 3

メソッドの宣言を置く場所クラスブロック内 メソッド同士 (main メソッドも ) は入れ子にならない public class Combination { main メソッドの前でもよい public static void main(string[] args) { //combination メソッドを呼び出す System.out.println("10 人から 2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); main メソッドの後でもよい Java 1 第 9 回 4

メソッドの宣言の書き方 public class Combination { public static void main(string[] args) { System.out.println("10 人から 2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); public static int combination(int n, int r) { // 階乗の計算で fact メソッドを呼び出す return fact(n) / (fact(n-r) * fact(r)); public static int fact(int n) { int total = 1; for (int i = n; i >= 1; i--) { total *= i; return total; 戻り値の型値を返す命令 仮引数の宣言 Java 1 第 9 回 5

メソッドの起動 : 戻り値があるときは式の中で起動できる public class Combination { public static void main(string[] args) { System.out.println("10 人から 2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); public static int combination(int n, int r) { // 階乗の計算で fact メソッドを呼び出す return fact(n) / (fact(n-r) * fact(r)); public static int fact(int n) { int total = 1; for (int i = n; i >= 1; i--) { total *= i; return total; println 命令の引数になる式 int 型の戻り値は文字列に変換されて 式の一部になる Java 1 第 9 回 6

メソッドの起動 : 戻り値があるときは式の中で起動できる public class Combination { public static void main(string[] args) { System.out.println("10 人から 2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); public static int combination(int n, int r) { // 階乗の計算で fact メソッドを呼び出す return fact(n) / (fact(n-r) * fact(r)); public static int fact(int n) { int total = 1; for (int i = n; i >= 1; i--) { total *= i; return total; return 文の式 int 型の戻り値はreturn 文の式の一部になっている Java 1 第 9 回 7

実引数と仮引数の対応 public class Combination { public static void main(string[] args) { System.out.println("10 人から 2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); public static int combination(int n, int r) { // 階乗の計算で fact メソッドを呼び出す return fact(n) / (fact(n-r) * fact(r)); public static int fact(int n) { int total = 1; for (int i = n; i >= 1; i--) { total *= i; return total; Java 1 第 9 回 8

変数のスコープ public class Combination { public static void main(string[] args) { System.out.println("10 人から 2 人選ぶ組み合わせは " + combination(10, 2) + " 通り "); public static int combination(int n, int r) { // 階乗の計算で fact メソッドを呼び出す return fact(n) / (fact(n-r) * fact(r)); public static int fact(int n) { int total = 1; for (int i = n; i >= 1; i--) { total *= i; return total; スコープが重ならないから無関係 Java 1 第 9 回 9

今回のテーマ クラスフィールド ( クラス変数 ) スコープ クラスフィールドはどのメソッドからも参照できる変数 ローカル変数は宣言されたブロック内 寿命 自動変数との違い 今まで使ってきたローカル変数は自動変数 再帰関数 Java 1 第 9 回 10

public class Count { static int count; クラスフィールドの宣言 public static void main(string[] args) { count = 0; countup(); countup(); countup(); countdown(); countdown(); countdown(); static キーワードが必要 すべてのメソッドの外で宣言 public static void countup() { count++; System.out.println("1 増やしたカウンタの値は " + count); public static void countdown() { count--; System.out.println("1 減らしたカウンタの値は " + count); Java 1 第 9 回 11

public class Count { static int count; クラスフィールドのスコープ public static void main(string[] args) { count = 0; countup(); countup(); 参照や値の変更が可能 countup(); countdown(); countdown(); countdown(); public static void countup() { count++; System.out.println("1 増やしたカウンタの値は " + count); public static void countdown() { count--; System.out.println("1 減らしたカウンタの値は " + count); Java 1 第 9 回 12

実行すると public class Count{ static int count; public static void main(...){ count = 0; countup(); countup(); countup(); countdown(); countdown(); countdown();... 1 増やしたカウンタの値は 1 1 増やしたカウンタの値は 2 1 増やしたカウンタの値は 3 1 減らしたカウンタの値は 2 1 減らしたカウンタの値は 1 1 減らしたカウンタの値は 0 Java 1 第 9 回 13

ローカル変数 クラスフィールドのスコープ メソッドの中で宣言 ( 定義ともいう ) されている変数 ( ローカル変数と呼ぶ ) は それを宣言したブロックの内部でのみ有効 ブロックとはプログラムの中で { で示される範囲を言う ブロックは幾重にもネスティング ( 入れ子の形になる ) されることがある あるブロックで定義された変数は その内部のブロックに同じ名前の定義がない限りこの内部で有効 同じ名前が内部にあるとその内部では外側の名前は使えない クラスフィールドはどのメソッドからも参照 値の変更が可能 Java 1 第 9 回 14

ローカル変数 クラスフィールドの寿命 ローカル変数は それを定義しているブロックを実行し始めたとき用意され ( メモリ上にその箱が作られ ) ブロックを終了したとき消失する このような変数を自動変数という 必要なときに ( ブロックに入ったときに ) 自動的に作られ 必要がなくなったときに ( ブロックをぬけたときに ) 自動的に消失するという意味 クラスフィールドはローカル変数と違って 消失することは無い 最後に書き込んだ値を参照することができる Java 1 第 9 回 15

階乗を再帰的 (recursive) に定義する 考え方 factorial(n) = 1 N = 0 のとき factorial(n) = N * factorial(n-1) それ以外のとき public static int factorial(int n) { // factorial(n) = 1 (N = 0 のとき ) if (n == 0) { return 1; // factorial(n) = n * factorial(n-1) ( それ以外のとき ) else { return n * factorial(n - 1); Java 1 第 9 回 16

factorial(3) として起動すると factorial(0) が実行されているときは 4 つの実行中あるいは再帰呼び出しからの帰り待ちの状態のメソッド起動がある factorialメソッドの仮引数である自動変数 nはfactorial の呼び出しの度に独立して自動的に作られ 消されるので ソースプログラム上で同じ変数 nであっても実行中の異なるメソッド起動では実体が異なる Java 1 第 9 回 17

行きがけの処理課題 0804 の再帰的な書き換え public class PrimeFactorsRecursiveLeft { public static void main(string[] args) { printleft(210); public static void printleft(int n) { if (n == 1) return; int mpf = minimumprimefactorof(n); System.out.print(mpf + " "); printleft(n / mpf); public static int minimumprimefactorof(int n) { if (n == 1) return 1; else for (int i = 2; i <= n / 2; i++) if (n % i == 0) return i; return n; Java 1 第 9 回 18

行きがけの処理実行結果 : 2 3 5 7 public class PrimeFactorsRecursiveLeft { public static void main(string[] args) { printleft(210); public static void printleft(int n) { if (n == 1) return; int mpf = minimumprimefactorof(n); System.out.print(mpf + " "); printleft(n / mpf);... 再帰呼び出し Java 1 第 9 回 19

行きがけ の処理 Java 1 第 9 回 20

帰りがけの処理課題 0804 のもうひとつの再帰的な書き換え public class PrimeFactorsRecursiveRight { public static void main(string[] args) { printright(210); public static void printright(int n) { if (n == 1) return; int mpf = minimumprimefactorof(n); printright(n / mpf); System.out.print(mpf + " "); public static int minimumprimefactorof(int n) { if (n == 1) return 1; else for (int i = 2; i <= n / 2; i++) if (n % i == 0) return i; return n; Java 1 第 9 回 21

帰りがけの処理実行結果 : 7 5 3 2 public class PrimeFactorsRecursiveRight { public static void main(string[] args) { printright(210); public static void printright(int n) { if (n == 1) return; int mpf = minimumprimefactorof(n); printright(n / mpf); System.out.print(mpf + " ");... 再帰呼び出し Java 1 第 9 回 22

帰りがけ の処理 Java 1 第 9 回 23

行きがけの処理と帰りがけの処理 printleft と printright では自分自身を再帰的に呼び出すタイミングが異なる printleft は先に表示してから自分自身を呼び出すのに対し printright は自分自身を呼び出してから後に表示を行っている この差異により 結果が表示される順番が変わってくる 再帰メソッドは呼び出すタイミングを調整するだけで 処理の流れを大きく変えることができる Java 1 第 9 回 24

非再帰化と効率 一般に メソッドの起動は時間や計算機リソースを多く消費する 再帰メソッドはプログラムが簡潔で読みやすいものになっているが プログラムの効率を考えた場合余り良い選択とはいえない 性能を求められるプログラムを作成する場合は 再帰的な表現をやめて for 文や while 文を用いて非再帰的な表現に変換することがある 演習で行うフィボナッチ数列のプログラムなどは 非再帰化した表現を探すのは難しい 再帰メソッドの末尾で一度だけ自己呼び出しをするような再帰メソッドは 大抵は for 文などのループ構造で簡単に表現することができる Java 1 第 9 回 25

非再帰化の例 public static int factorial(int n) { if (n == 0) { return 1; int result = 1; for (int i = 1; i <= n; i++) { result *= i; return result; Java 1 第 9 回 26

一緒にやってみよう 今回の演習で使うテストドライバをいつものように指示通り正確にインストールする テストドライバの導入に成功すると プロジェクト java20xx の中の test というフォルダに j1.lesson09.xml という名前のファイルが作成される このファイルには今週使用するテスト一式が記述されている j1.lesson09 というパッケージを作成する 講義資料にある Factorial, Fibonacci というプログラムを このパッケージに作成する 講義資料にある手順でテスト 実行までやること Java 1 第 9 回 27

Fibonacci の解説 public class Fibonacci { static int count; public static void main(string[] args) { for (int i = 0; i <= 10; i++) { count = 0; System.out.println("fibonacci(" + i + ") = " + fibonacci(i)); System.out.println(" 起動回数は " + count + " 回 "); // フィボナッチ数列の第 k 項を計算するメソッド public static int fibonacci(int k) { count++; if (k == 0) return 0; else if (k == 1) return 1; else return fibonacci(k - 1) + fibonacci(k - 2); Java 1 第 9 回 28

fibonacci(i) を起動したときに再帰的に呼び出された回数を数えるためのクラスフィールド public class Fibonacci { static int count; public static void main(string[] args) { for (int i = 0; i <= 10; i++) { count = 0; System.out.println("fibonacci(" + i + ") = " + fibonacci(i)); System.out.println(" 起動回数は " + count + " 回 "); // フィボナッチ数列の第 k 項を計算するメソッド public static int fibonacci(int k) { count++; if (k == 0) return 0; else if (k == 1) return 1; else return fibonacci(k - 1) + fibonacci(k - 2); Java 1 第 9 回 29

クラスフィールドの値を変更 public class Fibonacci { static int count; public static void main(string[] args) { for (int i = 0; i <= 10; i++) { count = 0; System.out.println("fibonacci(" + i + ") = " + fibonacci(i)); System.out.println(" 起動回数は " + count + " 回 "); // フィボナッチ数列の第 k 項を計算するメソッド public static int fibonacci(int k) { count++; if (k == 0) return 0; else if (k == 1) return 1; else return fibonacci(k - 1) + fibonacci(k - 2); Java 1 第 9 回 30

i が 3 のときの再帰呼び出しの連鎖と クラスフィールド count の値の変化 fibonacci(3),1 fibonacci(2),2 fibonacci(1),5 fibonacci(1),3 fibonacci(0),4 赤の数字はクラスフィールド count の値... fibonacci(3) = 2 起動回数は 5 回... Java 1 第 9 回 31

fibonacci(4),1 i が 4 のときの再帰呼び出しの連鎖とクラスフィールド count の値の変化 fibonacci(3),2 fibonacci(2),3 fibonacci(1),6... fibonacci(4) = 3 起動回数は 9 回... fibonacci(1),4 fibonacci(0),5 fibonacci(2),7 fibonacci(1),8 fibonacci(0),9 Java 1 第 9 回 32

i が 0 から 10 まで走ると fibonacci(0) = 0 起動回数は 1 回 fibonacci(1) = 1 起動回数は 1 回 fibonacci(2) = 1 起動回数は 3 回 fibonacci(3) = 2 起動回数は 5 回 fibonacci(4) = 3 起動回数は 9 回... 起動回数は 67 回 fibonacci(9) = 34 起動回数は 109 回 fibonacci(10) = 55 起動回数は 177 回 Java 1 第 9 回 33

課題 各自のペースで 第 09 週目の課題 をやってみよう Java 1 第 9 回 34

課題 0902 のヒント main m と n の入力 gcd(m,n) の結果を表示 gcd(m,n) if n=0 return m else return gcd(n,m を n で割った余り ) Java 1 第 9 回 35

Pascal の三角形 main n, r への入力の処理 combination を n,r を引数として呼び出し 結果を表示する combination(n,r) r=0 または r=n なら 1 を返すそうでなければ combination(n-1, r-1) と combination(n-1,r) の和を返す Java 1 第 9 回 36

Lowest Term main 分子を n に入力分子 <1 なら警告を出力して return 分母を d に入力分母 <1 なら警告を出力して return printwithreduce を n と d を引数として呼び出す printwithreduce(n,d) gcd を n と d を引数として呼び出し 戻り値を受け取る約分を実行し 結果を表示する gcd(m,n) もし n=0 なら m を返すそうでなければ gcd(n, m を n で割った余り ) を返す Java 1 第 9 回 37