3. 絶対値の合計を計算するプログラム
Test06a.java
public class Test06a {
public static void main( String[] args ){
int a, b, c, d, e, f;
int abs_a, abs_b, abs_c, abs_d, abs_e, abs_f;
int sum;
a = 3; b = -1; c = 5; d = -4; e = -7; f = 6;
なが~い
}
if ( a >= 0 ){
abs_a = a;
} else {
変数 a の値の絶対値を プログラムになった
abs_a = -a; 変数 abs_a に代入
}
if ( b >= 0 ){ 同じような文が多い
}
abs_b = b;
} else {
abs_b = -b; } 変数 b の値の絶対値を
変数 abs_b に代入
abs_c, abs_d, abs_e, abs_f も同様に計算する;
もっと簡潔に
sum = abs_a+abs_b+abs_c+ abs_d+abs_e+abs_f; 書けないか?
System.out.println(“sum=“+sum);
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 3
4. メソッドを使って簡潔なプログラムに
Test06b.java
public class Test06b {
public static void main( String[] args ){
変数 a の値の絶対値を
int a, b, c, d, e, f; 変数 abs_a に代入
int abs_a, abs_b, abs_c, abs_d, abs_e, abs_f;
int sum;
a = 3; b = -1; c = 5; d = -4; e = -7; f = 6;
変数 b の値の絶対値を
変数 abs_b に代入
abs_a = abs(a); abs_b = abs(b); abs_c = abs(c);
abs_d = abs(d); abs_e = abs(e); abs_f = abs(f);
sum = abs_a+abs_b+abs_c+ abs_d+abs_e+abs_f;
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
} else {
}
ret = n;
ret = -n;
return ret;
} 絶対値を計算する
メソッド
メソッドを使うと
同様なコードを
}
} 一つにまとめられる
2008年8月,データ解析の基礎,加藤,瀬々,金子. 4
5. メソッド,戻り値,引数
Test06b.java
public class Test06b {
public static void main( String[] args ){
変数 a の値の絶対値を
int a, b; 変数 abs_a に代入
int abs_a, abs_b;
int sum;
a = 3; b = -1;
変数 b の値の絶対値を
変数 abs_b に代入
abs_a = abs(a);
abs_b = abs(b);
sum = abs_a+abs_b;
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; 戻り値の型 メソッド名 引数
} else {
ret = -n;
}
}
return ret; メソッドabsは変数retの値を呼び出し元に返す
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 5
6. メソッドの一般形式
Test06b.java public static 戻り値の型 メソッド名(引数){
public class Test06b { 変数宣言;
public static void main(
int a, b;
文;
String[] args ){
int abs_a, abs_b; return 式;
int sum;
a = 3; b = -1; }
abs_a = abs(a);
abs_b = abs(b);
sum = abs_a+abs_b;
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; 戻り値の型 メソッド名 引数
} else {
ret = -n;
}
}
return ret; メソッドabsは変数retの値を呼び出し元に返す
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 6
7. 練習6-b.
Test06b.java プロジェクト名: test06
public class Test06b {
public static void main( String[] args ){
左のプログラムを
int a, b; 実行せよ
int abs_a, abs_b;
int sum;
a = 3; b = -1;
abs_a = abs(a); 後でデバッガを
abs_b = abs(b);
sum = abs_a+abs_b; 使って動作を
}
System.out.println(“sum=“+sum);
確認します
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 7
8. どのように計算しているのか?
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
正確には,フレームは,局所変数配列のほかに,オペランドスタック
if ( n >= 0 ){ も保持する
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 8
9. どのように計算しているのか?
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 9
10. メソッドabs(a)を呼び出す
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 10
11. メソッド呼び出しにより新たなフレームが積まれる
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=3 ret
return ret;
} 引数を含む変数が作られる
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 11
12. 制御がメソッド内に移る
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=3 ret
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 12
13. Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=3 ret=3
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 13
14. 変数 ret の値を呼び出し元に返す
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=3 ret=3
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 14
15. 現在のフレームを破棄して,
制御を呼び出し元に戻す
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 15
16. メソッドabs(b)を呼び出す
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 16
17. メソッド呼び出しにより新たなフレームが積まれる
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=-1 ret
return ret;
} 引数を含む変数が作られる
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 17
18. 制御がメソッド内に移る
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=-1 ret
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 18
19. Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=-1 ret=1
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 19
20. 変数 ret の値を呼び出し元に返す
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n;
}
n=-1 ret=1
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 20
21. 現在のフレームを破棄して,
制御を呼び出し元に戻す
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b=1
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 21
22. Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b=1
abs_b = abs(b);
sum = abs_a+abs_b; sum=4
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n;
} else {
ret = -n;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 22
23. Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a=3 abs_b=1
abs_b = abs(b);
sum = abs_a+abs_b; sum=4
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; 画面
} else {
ret = -n; sum=4
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 23
24. 注意点:引数は呼び出しもとと異なる箱
Test06b.java スタック
public class Test06b {
public static void main( String[] args ){ メソッド main のスタックフレーム
int a, b;
int abs_a, abs_b;
int sum; a=3 b=-1
a = 3; b = -1;
abs_a = abs(a); abs_a abs_b
abs_b = abs(b);
sum = abs_a+abs_b; sum
System.out.println(“sum=“+sum);
}
public static int abs( int n ){
int ret;
if ( n >= 0 ){
ret = n; メソッド abs のスタックフレーム
} else {
ret = -n; 呼び出し元の箱と n=3 ret
}
return ret; 引数の箱は異なって
引数を含む変数が作られる
}
}
いることに注意
2008年8月,データ解析の基礎,加藤,瀬々,金子. 24
41. デバッガ:Step Over のみ使う場合
スタック
メソッド main のスタックフレーム
a b
abs_a abs_b
sum
デバッガが起動され,最初のブレーク
ポイントまで処理が進んだ
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 41
42. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a abs_b
sum
a=3, b=-1が代入された
Step Intoをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 42
43. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a b
abs_a abs_b
sum
メソッド abs の最初のステップまで
進んだ
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 43
44. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a abs_b
sum
メソッド abs のスタックフレーム
n=3 ret
n>=0 なので
引数を含む変数が作られる
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 44
45. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a abs_b
sum
メソッド abs のスタックフレーム
n=3 ret=3
変数 ret に n の値が代入された
引数を含む変数が作られる
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 45
46. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a abs_b
sum
戻り値を3としてメソッド abs が
終了して,呼び出し元に戻ってきた
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 46
47. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b
sum
変数 abs_a にメソッド abs の
戻り値3が代入された
もう一度Step Intoの動きをみてみましょう
2008年8月,データ解析の基礎,加藤,瀬々,金子. 47
48. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b
sum
メソッド abs のスタックフレーム
n=-1 ret
メソッド abs の最初のステップまで
引数を含む変数が作られる
進んだ
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 48
49. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b
sum
メソッド abs のスタックフレーム
n=-1 ret
n>=0 の条件は満たさないので
引数を含む変数が作られる
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 49
50. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b
sum
メソッド abs のスタックフレーム
n=-1 ret
n>=0 の条件は満たさないので
引数を含む変数が作られる
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 50
51. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b
sum
メソッド abs のスタックフレーム
n=-1 ret=1
変数 ret に –n の値が代入された
引数を含む変数が作られる
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 51
52. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b
sum
戻り値を1としてメソッド abs が
終了して,呼び出し元に戻ってきた
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 52
53. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b=1
sum
変数 abs_b にメソッド abs の
戻り値1が代入された
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 53
54. デバッガ:Step Into ボタンを使うと
スタック
メソッド main のスタックフレーム
a=3 b=-1
abs_a=3 abs_b=1
sum=4
変数 sum に abs_a+abs_b の
値が代入された
ステップオーバーをクリック
2008年8月,データ解析の基礎,加藤,瀬々,金子. 54
55. 練習6-b. つづき
Test06b.java プロジェクト名: test06
(1) デバッガを使って
public class Test06b {
public static void main( String[] args ){
この2つの呼び出し
int a, b; に対して,Step Into
int abs_a, abs_b;
int sum; を使って
a = 3; b = -1;
n と ret の値が
abs_a = abs(a); それぞれどうなって
abs_b = abs(b);
sum = abs_a+abs_b; いるのか調べよ
}
System.out.println(“sum=“+sum);
(2) 変数 c と abs_c を
public static int abs( int n ){ 追加し,
int ret;
if ( n >= 0 ){ a=-3; b=7; c=-5;
ret = n;
} else {
としたときに,
ret = -n; n と ret の値がどう
}
return ret; なるか,デバッガを
}
}
使って調べよ
2008年8月,データ解析の基礎,加藤,瀬々,金子. 55
56. 練習6-c. べき乗の合計を計算せよ
Test06c.java プロジェクト名: test06
public class Test06c {
public static void main( String[] args ){
べき乗の合計を
int a, b, c, n; 計算するプログラム
int pow_a, pow_b, pow_c;
int sum; を完成させよ
a = 3; b = 7; c = 4; n = 3;
pow_a = power(a,n);
pow_b = power(b,n);
pow_c = power(c,n);
sum = pow_a+pow_b+pow_c;
System.out.println(“sum=“+sum);
}
public static int power( int x, int n ){
int i, ret;
ret = 1;
for ( i = 0; i < n; i++ ){
xのn乗を計算して ret に代入せよ
ret = ret * x;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 56
57. 練習6-d. 階乗の合計を計算せよ
Test06d.java プロジェクト名: test06
public class Test06d {
public static void main( String[] args ){
階乗の合計を
int a, b, c; 計算するプログラム
int facto_a, facto_b, facto_c;
int sum; を完成させよ
a = 3; b = 7; c = 4;
facto_a = factorial(a);
facto_b = factorial(b);
facto_c = factorial(c);
sum = facto_a+facto_b+facto_c;
System.out.println(“sum=“+sum);
}
public static int factorial( int n ){
int ret;
ret = 1;
while ( n > 0 ){
階乗n!を計算し ret に代入せよ
ret = ret * n;
n = n – 1;
}
return ret;
}
}
2008年8月,データ解析の基礎,加藤,瀬々,金子. 57