メソッドの問題


問題1

【やりたいこと】:引数に名前をとり,その名前を使って「●●さん,こんにちは。」と出力するhelloメソッドを作りたい。

【問題】:上記を実現するためにはどのようにしたらよいでしょう。

【ファイル名】:MethodQuestion001.java

public class MethodQuestion001 {
    public static void main(String[] args){
        String name = "Bebeit";
        
        //メソッドの呼び出しをこちらに書きましょう。

    }
    
    //引数に名前をとり,「●●さん,こんにちは。」と出力するメソッドを作成しましょう。
    

}

【解決方法】
helloメソッドを定義して,helloメソッドを呼び出します。

public class MethodQuestion001 {
    public static void main(String[] args){
        String name = "Bebeit";
        
        hello(name);//メソッドの呼び出し部分
    }
    
    //引数に名前をとり,「●●さん,こんにちは。」と出力するメソッドを作成しましょう。
    public static void hello(String name){
        System.out.println(name + "さん,こんにちは。");
    }
}

【解説】
はじめにメソッドの定義部分を作成します(9-11行目)。今回,メッセージを出力するだけなので,戻り値はなしなので,voidを設定します。
引数として名前を受け取るために,String nameという名前の引数を作成します。
問題に合わせてメッセージ部分を作成することで,完成となります。
メソッドは定義をするだけでは利用ができないので,mainメソッド内の5行目で,helloメソッドを呼び出す処理を記述します。
今回の場合の出力は,「Bebeitさん,こんにちは。」と出力されます。

【スッキリわかるJava入門編第2版の参考ページ】170-179ページ


問題2

【やりたいこと】:引数に縦と横の長さを与えて,三角形の面積の値を返してくれるgetTriangleAreaメソッドを作りたい。

【問題】:上記を実現するためにはどのようにしたらよいでしょう。

【ファイル名】:MethodQuestion002.java

public class MethodQuestion002 {
    public static void main(String[] args){
        int width = 5; //縦の変数。
        int height = 6; //横の変数。

        //メソッドを呼び出してその結果を変数で受け取りましょう。
        
        System.out.println("縦: " + width + " 横: " + height + "の三角形の面積は,");//結果を追加して出力しましょう。
    }

    //引数に縦と横の長さを与えて,三角形の面積の値を返してくれるgetTriangleAreaメソッドを作成しましょう。


}

【解決方法】
getTriangleAreaメソッドを定義して,getTriangleAreaメソッドを呼び出します。

public class MethodQuestion002 {
    public static void main(String[] args){
        int width = 5; //縦の変数。
        int height = 6; //横の変数。

        //メソッドを呼び出してその結果を変数で受け取りましょう。
        int result = getTriangleArea(width, height);

        System.out.println("縦: " + width + " 横: " + height + "の三角形の面積は," + result);//結果を追加して出力しましょう。
    }

    //引数に縦と横の長さを与えて,三角形の面積の値を返してくれるgetTriangleAreaメソッドを作成しましょう。
    public static int getTriangleArea(int width, int height){
        int result = width * height / 2;//結果をdoubleにしてもOK。受け取り側すべてdoubleにしましょう。
        return result;
    }
}

【解説】
はじめにメソッドの定義部分を作成します(13-16行目)。今回,計算結果を返す必要があるため,戻り値をintとして設定します。
引数としては,縦と横の値を受け取るために,int width, int heightという引数を作成します。
問題に合わせて三角形の面積を計算して,結果をreturnすることで,完成となります。
メソッドは定義をするだけでは利用ができないので,mainメソッド内の7行目で,getTriangleAreaメソッドを呼び出す処理を記述します。
同時に結果をint resultへ代入して,最後に出力処理をしています。
今回の場合の出力は,「縦: 5 横: 6の三角形の面積は,15」と出力されます。

【スッキリわかるJava入門編第2版の参考ページ】177-199ページ


問題3

【問題】:下記プログラムはエラーがでています。何が原因でしょうか。

【ファイル名】:MethodQuestion003.java

public class MethodQuestion003 {
    public static void main(String[] args){
        int num1 = 10;
        int num2 = 20;

        int result = add(num1, num2);

        System.out.println("合計は," + result);
    }

    public static int add(int num1, int num2){
        int result = num1 + num2;
        return result;
    }

    public static int add(int a, int b){
        int result = a + b;
        return result;
    }

}

【エラーの原因】
addメソッドの引数で同じ引数の形(int, int)となっているため,エラーとなっています。
メソッド名が同じ名前で引数が同じ形のものは定義できないので修正します。

public class MethodQuestion003 {
    public static void main(String[] args){
        int num1 = 10;
        int num2 = 20;

        int result = add(num1, num2);//引数がint, intの方のaddが呼ばれます。
        System.out.println("合計は," + result);

        double num3 = 3.5;
        double num4 = 4.8;
        double result2 = add(num3, num4);//引数がdouble, doubleの方のaddが呼ばれます。
        System.out.println("合計は," + result2);

    }

    public static int add(int num1, int num2) {//引数の形がint , int
        int result = num1 + num2;
        return result;
    }

    public static double add(double num1, double num2) {//引数の形がdouble , double
        double result = num1 + num2;
        return result;
    }
}

【解説】
Javaではオーバーロードという仕組みで同一の名前でメソッドが定義ができるようになっています。
ただし,引数の形が異なる場合でしか定義はできません。たとえば,引数の順番や,引数の数,引数の型が異なっていれば問題ありません。
ちなみにメソッドを呼び出す場合は,メソッドの引数名と一致している必要はなく,型が一致していれば問題ありません。
上記プログラムを実行すると,下記のような出力となります。

合計は,30
合計は,8.3

【スッキリわかるJava入門編第2版の参考ページ】191-194ページ


問題4

【やりたいこと】:int型配列の要素を逆順にして,返してくれるメソッドを作成したい。

【問題】:上記を実現するためにはどのようにしたらよいでしょう。

【ファイル名】:MethodQuestion004.java

public class MethodQuestion004 {
    public static void main(String[] args){
        int array[] = { 51, 28, 33, 19, 38, 98 };

        //そのままをまず出力。
        System.out.println("そのままを出力。-------");
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
        //この間でメソッドで処理をして配列を逆順にしましょう。

        //逆順にした状態で出力。
        System.out.println("逆順を出力。-------");
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }

    }

}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion004 {
    public static void main(String[] args){
        int array[] = { 51, 28, 33, 19, 38, 98 };

        //そのままをまず出力。
        System.out.println("そのままを出力。-------");
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
        //この間でメソッドで処理をして配列を逆順にしましょう。
        array = reverce(array);

        //逆順にした状態で出力。
        System.out.println("逆順を出力。-------");
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }

    }

    public static int[] reverce(int array[]) {
        int newArray[] = new int[array.length];//引数の配列のサイズで初期化をする。
        for (int i = 0; i < array.length; i++) {
            newArray[i] = array[array.length - 1 - i];
        }
        return newArray;
    }
}

【解説】
メソッドの引数に配列をそのまま渡して,戻り値が配列となっています。
メソッド内では,受け取った引数の配列のサイズで,新しい配列のサイズを決定します。
ループ処理をしながら,新しい配列の最初に受けとった配列の最後の数値を代入していき,配列を逆順にしていきます。
11行目のメソッドの呼び出し部分では,引数でarrayを渡したのち,戻り値をarrayで受け取ります。
上記プログラムを実行すると,下記のような出力となります。

そのままを出力。-------
51
28
33
19
38
98
逆順を出力。-------
98
38
19
33
28
51

【スッキリわかるJava入門編第2版の参考ページ】195-200ページ


問題5

【やりたいこと】:メソッドhelloを利用して「HelloWorld!!」 を出力したい。

【エラーがでている】:下記のコードでエラーがあります。どこが間違っており,どのように修正すればよいでしょうか?

【ファイル名】:MethodQuestion005.java

public class MethodQuestion005 {
    public static void main(String[] args){

        hello;//helloのメソッドの呼び出し。
    }

    public static void hello(){
        System.out.println("HelloWorld!!");
    }
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion005 {
    public static void main(String[] args){

        hello();//メソッドの呼び出しに必要な丸括弧「()」を追加する。
    }

    public static void hello() {
        System.out.println("HelloWorld!!");
    }
}

【解説】
4行目のhelloの部分で赤波線が入っており,Eclipseの場合,左側に×印が表示され,そちらにマウスをあわせると 「hello を解決できません」「構文エラーがあります。"VariableDeclarators" を挿入して LocalVariableDeclaration を完了してください」
といったメッセージを確認できると思います。
メソッドの呼び出し方としては,メソッド名の後に丸括弧「()」が必要になります。
今回引数がないため,丸括弧のみを入れていますが,定義の中で引数が指定されている場合は,引数の型にあわせて,
値を設定する必要があります。

【スッキリわかるJava入門編第2版の参考ページ】174-176ページ


問題6

【やりたいこと】:メソッドgetInclusivePriceを利用して消費税込みの料金 を出力したい。

【エラーがでている】:下記のコードでエラーがあります。どこが間違っており,どのように修正すればよいでしょうか?

【ファイル名】:MethodQuestion006.java

public class MethodQuestion006 {
    public static void main(String[] args) {
        int price = 100;//料金の変数
        double tax = 0.08;//消費税8%の場合,消費税をいれる変数

        int result = getInclusivePrice(int price, double tax);//消費税込みの料金を返すメソッドを呼び出す。
        System.out.println("消費税込みの料金は," + result);
    }

    //消費税込みの料金を返すメソッド
    public static int getInclusivePrice(int price, double tax) {
        int result = (int) (price * (1 + tax));
        return result;
    }
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion006 {
    public static void main(String[] args){
        int price = 100;//料金の変数
        double tax = 0.08;//消費税8%の場合,消費税をいれる変数

        int result = getInclusivePrice(price, tax);//①メソッドの呼び出しをする場合,型の指定は不要となります。
        System.out.println("消費税込みの料金は," + result);
    }

    //消費税込みの料金を返すメソッド
    public static int getInclusivePrice(int price, double tax) {
        int result = (int) (price * (1 + tax));
        return result;
    }
}

【解説】
6行目の部分で赤波線が入っており,Eclipseの場合,左側に×印が表示され,そちらにマウスをあわせると
「トークン "double" に構文エラーがあります。このトークンを削除してください」「トークン "int" に構文エラーがあります。このトークンを削除してください」
といったメッセージを確認できると思います。
メソッドの呼び出しの場合,型を指定する必要がないため,それぞれの型を削除しましょう。

【スッキリわかるJava入門編第2版の参考ページ】177-183ページ


問題7

【やりたいこと】:メソッドgetInclusivePriceを利用して消費税込みの料金 を出力したい。

【エラーがでている】:下記のコードでエラーがあります。どこが間違っており,どのように修正すればよいでしょうか?

【ファイル名】:MethodQuestion007.java

public class MethodQuestion007 {
    public static void main(String[] args) {
        int price = 100;//料金の変数
        double tax = 0.08;//消費税8%の場合,消費税をいれる変数

        int result = getInclusivePrice(price, tax);
        System.out.println("消費税込みの料金は," + result);
    }

    //消費税込みの料金を返すメソッド
    public static int getInclusivePrice(price, tax) {
        int result = (int) (price * (1 + tax));
        return result;
    }
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion007 {
    public static void main(String[] args){
        int price = 100;//料金の変数
        double tax = 0.08;//消費税8%の場合,消費税をいれる変数

        int result = getInclusivePrice(price, tax);
        System.out.println("消費税込みの料金は," + result);
    }

    //消費税込みの料金を返すメソッド
    public static int getInclusivePrice(int price, double tax) {//①メソッドの定義の時は型の指定は必須となります。
        int result = (int) (price * (1 + tax));
        return result;
    }
}

【解説】
11行目の部分などで赤波線が入っており,Eclipseの場合,左側に×印が表示され,そちらにマウスをあわせると
「price を型に解決できません」といったメッセージを確認できると思います。
メソッドの定義をする場合は,型を指定する必要があるため,それぞれの型を追加します。

【スッキリわかるJava入門編第2版の参考ページ】170-183ページ


問題8

【やりたいこと】:メソッドgetInclusivePriceを利用して消費税込みの料金 を出力したい。

【エラーがでている】:下記のコードでエラーがあります。どこが間違っており,どのように修正すればよいでしょうか?

【ファイル名】:MethodQuestion008.java

public class MethodQuestion008 {
    public static void main(String[] args) {
        int price = 100;//料金の変数
        double tax = 0.08;//消費税8%の場合,消費税をいれる変数

        int result = getInclusivePrice(tax, price);
        System.out.println("消費税込みの料金は," + result);
    }

    //消費税込みの料金を返すメソッド
    public static int getInclusivePrice(int price, double tax) {
        int result = (int) (price * (1 + tax));
        return result;
    }
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion008 {
    public static void main(String[] args){
        int price = 100;//料金の変数
        double tax = 0.08;//消費税8%の場合,消費税をいれる変数

        int result = getInclusivePrice(price, tax);//①メソッドの定義に合わせて,順番を正しく設定します。
        System.out.println("消費税込みの料金は," + result);
    }

    //消費税込みの料金を返すメソッド
    public static int getInclusivePrice(int price, double tax) {
        int result = (int) (price * (1 + tax));
        return result;
    }
}

【解説】
6行目の部分で赤波線が入っており,Eclipseの場合,左側に×印が表示され,そちらにマウスをあわせると
「MethodQuestion008 のメソッド getInclusivePrice(int, double) は引数 (double, int) に適用できません」といったメッセージを確認できると思います。
メソッドの呼び出しの場合,型の指定や定義の順序を間違えると,正しい結果を得られなくなります。
定義をしっかりと確認して,それにあわせてメソッドの呼び出しをするようにしましょう。

【スッキリわかるJava入門編第2版の参考ページ】170-183ページ


問題9

【やりたいこと】:要素数が同じ配列の要素をそれぞれ足し合わせた結果を戻り値とするメソッドaddを作成したい。

【問題】:上記のコードを実現するためには,どのようにプログラムをすればよいでしょうか?

【ファイル名】:MethodQuestion009.java

public class MethodQuestion009 {
    public static void main(String[] args) {
        int array1[] = {1, 2, 3, 4, 5};
        int array2[] = {10, 20, 30, 40, 50};

        int result[] = ???;//こちらにメソッドaddを利用して戻り値を受け取りましょう。

        for(int i = 0; i <result.length; i++){
            System.out.println("result[" + i + "] = " + result[i]);
        }
    }

    //要素数の同じ配列の要素の値をそれぞれ足し合わせた結果を返すメソッドaddを作成しましょう。
    }
}

上記のような設定の場合,下記のように出力されるようになります。

result[0] = 11
result[1] = 22
result[2] = 33
result[3] = 44
result[4] = 55

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion009 {
    public static void main(String[] args){
        int array1[] = { 1, 2, 3, 4, 5 };
        int array2[] = { 10, 20, 30, 40, 50 };

        int result[] = add(array1, array2);//①メソッドの呼び出し部分

        for (int i = 0; i < result.length; i++) {
            System.out.println("result[" + i + "] = " + result[i]);
        }
    }

    //要素数の同じ配列の要素の値をそれぞれ足し合わせた結果を返すメソッドaddを作成しましょう。
    //②引数としてint型配列を二つ用意して,戻り値としてint型配列として定義します。
    public static int[] add(int[] array1, int[] array2) {
        int result[] = new int[array1.length];//③引数の配列の要素数で,配列を宣言します。

        for (int i = 0; i < array1.length; i++) {//④ループ処理をしながら,配列の要素を足し合わせます。
            result[i] = array1[i] + array2[i];
        }

        return result;
    }
}

【解説】
②の部分でメソッドの定義を作成します。引数として,int型の配列を設定できるように記述して,戻り値としてint型の配列となるようにします。
③の部分では,戻り値を返すために,最初に配列の宣言を作成します。このとき,受け取った引数の要素の数で初期化します。
④の部分で,受け取った引数の値を加算するために,ループ処理をしながら足し合わせていきます。
最後に結果をreturn してメソッドの呼び出し元へ戻します。
①では,定義したメソッドを呼び出す処理を記述して,完了となります。

【スッキリわかるJava入門編第2版の参考ページ】170-190ページ


問題10

【やりたいこと】:配列の内容を足し合わせた結果を出力するメソッドprintArrayを作成したい。

【問題】:上記のコードを実現するためには,どのようにプログラムをすればよいでしょうか?

【ファイル名】:MethodQuestion010.java

public class MethodQuestion010 {
    public static void main(String[] args) {
        int array[] = { 1, 2, 3, 4, 5 };
        printArray(array);
    }

    //printArrayのメソッドを作成しましょう。
}

上記のような設定の場合,下記のように出力されるようになります。

1 + 2 + 3 + 4 + 5 = 15

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion010 {
    public static void main(String[] args){
        int array[] = { 1, 2, 3, 4, 5 };
        printArray(array);
    }

    //printArrayのメソッドを作成しましょう。
    public static void printArray(int[] array) {
        int sum = 0;//①合計を入れておく変数
        for (int i = 0; i < array.length; i++) {
            sum = sum + array[i];//②ループ処理をしながら,合計値を加算します
            System.out.print(array[i]);//③配列の要素の出力
            if (i == array.length - 1) {//④配列の最後の場合は = と合計値を出力
                System.out.print(" = " + sum);
            } else {//⑤配列の最後ではない場合は, + を出力
                System.out.print(" + ");
            }
        }
    }
}

【解説】
①合計値を出力しなければならないので,合計を入れておく変数を用意します。
②配列の要素すべてへアクセスるためのforループを作成し,要素をそれぞれ加算していきます
③最初に配列の要素を出力します。
④⑤では,条件によって, + か = かを判断しなければなりませんが,配列が最後の一つ手前までは, + を,
配列の最後の場合は, = と合計値を出力することが分かるので,そちらで条件わけをして完成となります。

【スッキリわかるJava入門編第2版の参考ページ】195-200ページ


問題11

【やりたいこと】:台形の面積を求め,台形の情報や面積を出力する部分をメソッド化して,コードをきれいにまとめたい。

【問題】:下記のコードを修正して,台形の情報や面積を出力するcalcメソッドを作成し,きれいにまとめましょう。

【ファイル名】:MethodQuestion011.java

public class MethodQuestion011 {
    public static void main(String[] args) {
        int zyotei = 5; //上底の変数
        int katei = 10; //下底の変数
        int takasa = 8;//高さの変数

        int result = (zyotei + katei) * takasa / 2;
        System.out.println("上底は," + zyotei);
        System.out.println("下底は," + katei);
        System.out.println("高さは," + takasa);
        System.out.println("台形の面積は," + result);
        System.out.println("---------------------");

        //2つめの計算
        zyotei = 8;
        katei = 12;
        takasa = 4;

        result = (zyotei + katei) * takasa / 2;
        System.out.println("上底は," + zyotei);
        System.out.println("下底は," + katei);
        System.out.println("高さは," + takasa);
        System.out.println("台形の面積は," + result);
        System.out.println("---------------------");

    }

    //台形の情報や面積を求め出力するまでの部分をメソッド化しましょう。
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion011 {
    public static void main(String[] args){
        int zyotei = 5; //上底の変数
        int katei = 10; //下底の変数
        int takasa = 8;//高さの変数

        calc(zyotei, katei, takasa);
        //2つめの計算
        calc(8, 12, 4);//直接数値を入力してもメソッドは呼び出せます。

    }

    //台形の情報や面積を求め出力するまでの部分をメソッド化しましょう。
    public static void calc(int zyotei, int katei, int takasa) {
        int result = (zyotei + katei) * takasa / 2;
        System.out.println("上底は," + zyotei);
        System.out.println("下底は," + katei);
        System.out.println("高さは," + takasa);
        System.out.println("台形の面積は," + result);
        System.out.println("---------------------");
    }
}

【解説】
1つ目の処理と,2つ目の処理で共通部分を確認します。
変数で利用している,上底や下底,高さ部分以外は共通の処理となっているので,その共通部分をメソッドで書き出せる形で,
メソッドの定義をします。このとき,変更がある部分は,引数として定義することで,再利用が可能になります。
メソッドの呼び出しについては,型にあっていれば,変数でも直接の値を入力しても呼び出すことができます。
同じような処理を記述しようとするとき,コピペをするかと思いますが,その時はメソッドにするチャンスです。

【スッキリわかるJava入門編第2版の参考ページ】170-185ページ


問題12

【問題】:下記プログラムを実行すると,どちらのaddメソッドが呼ばれるでしょう。

【ファイル名】:MethodQuestion012.java

public class MethodQuestion012 {
    public static void main(String[] args) {
        int num1 = 5;
        double num2 = 1.5;

        double result = add(num2, num1);
        System.out.println(result);
    }

    //①add
    public static double add(int num1, double num2) {
        System.out.println("①のaddを呼び出し");
        return num1 + num2;
    }

    //②add
    public static double add(double num1, int num2) {
        System.out.println("②のaddを呼び出し");
        return num1 + num2;
    } 
}

【実行結果】
下記のようになります。

②のaddを呼び出し
6.5

【解説】
メソッドのオーバーロードによる呼び出しの場合,引数の条件を確認する必要があります。
今回の場合,引数の順番が重要となり,第一引数がdouble, 第二引数がintとなっている2つめのaddが呼ばれます。
メソッドの定義で利用している変数名は仮の名前ですので,何でもかまわないです。
引数の型に注目して考えましょう。

【スッキリわかるJava入門編第2版の参考ページ】191-194ページ


問題13

【やりたいこと】:2桁の整数値を引数に渡して,1桁目と2桁目を掛け算した結果を戻すメソッドmultiを作成したい。

【問題】:メソッドmultiを作成しましょう。その際,引数はint型,戻り値int型と定義しましょう。

     また,3桁以上の整数値やマイナスの場合は,0の値を返すようして,1桁の場合はそのまま入力値を元に戻しましょう。

【例】入力値が35の場合,3 × 5 = 15 と出力されるようにしましょう。

【ファイル名】:MethodQuestion013.java

public class MethodQuestion013 {
    public static void main(String[] args) {
        int num = 35;

        int result = multi(num);
        System.out.println(result);
    }

    //メソッドmultiを定義しましょう。
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion013 {
    public static void main(String[] args){
        int num = 35;

        int result = multi(num);
        System.out.println(result);
    }

    //メソッドmultiを定義しましょう。
    public static int multi(int num) {
        if (num >= 100 || num < 0) {
            return 0;//3桁以上やマイナスの場合は,0を返す。
        } else if (num < 10) {
            return num;//1桁の場合は,そのまま入力値を返す。
        }

        int num1 = num / 10;
        int num2 = num % 10;
        return num1 * num2;
    }
}

【解説】
最初に引数で渡された整数値が2桁かどうかをif文にて判定して,2桁出ない場合は,そのまま0を返すように作成しています。
1桁目と2桁目を分けるため,2桁目は10で割った値で取得し,1桁目は10で割った余りを取得しています。
掛け算なので,さきほど取得した値を掛け合わせて,戻り値にして完成となります。

【スッキリわかるJava入門編第2版の参考ページ】???ページ


問題14

【やりたいこと】:2桁の整数値を引数に渡して,1桁目と2桁目を掛け算した結果を一桁になるまで繰り返して,

         1桁の結果を戻すメソッドmulti2を作成したい。

【問題】:メソッドmulti2を作成しましょう。その際,引数はint型,戻り値int型と定義しましょう。

     また,3桁以上の整数値やマイナスの場合は,0の値を返すようして,1桁の場合はそのまま入力値を元に戻しましょう。

【例】入力値が35の場合,3 × 5 = 15 -> 1 × 5 = 5となり, 最終結果の5 が出力されるようにしましょう。

【ファイル名】:MethodQuestion014.java

public class MethodQuestion014 {
    public static void main(String[] args) {
        int num = 35;

        int result = multi2(num);
        System.out.println(result);
    }

    //メソッドmulti2を定義しましょう。
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion014 {
    public static void main(String[] args){
        int num = 35;

        int result = multi2(num);
        System.out.println(result);
    }

    //メソッドmulti2を定義しましょう。
    public static int multi2(int num) {
        if (num >= 100 || num < 0) {
            return 0;//3桁以上やマイナスの場合は,0を返す。
        } else if (num < 10) {
            return num;//1桁の場合は,そのまま入力値を返す。
        }

        int num1 = num / 10;
        int num2 = num % 10;
        return multi2(num1 * num2); //計算した結果をさらにmulti2へ渡します。
    }
}

【解説】
問題13の発展系の問題となり,再起処理を利用します。再帰処理とは,メソッドの中で自身のメソッドを呼び出すことを指します。
計算した結果をそのままmulti2メソッドへ渡します。
流れとしては,1回目は,最初の35を渡すと,15という結果を返すので,その15をさらにmulti2のメソッドの引数に渡します。
2回目は,15を受けとり,計算して,5という結果を返すので,5をmulti2のメソッドの引数に渡します。
3回目は,5を受けとり1桁になっているので,そのままの数値の5を返す。ということで,前のメソッドへ戻り値を返していき,
最終的に5という数字が戻されるという仕組みになります。
書籍のスッキリわかるJava入門編第2版には入っていなかった内容かと思いますが,このようなこともできると覚えておきましょう。

【スッキリわかるJava入門編第2版の参考ページ】???ページ


問題15

【やりたいこと】:2桁の整数値を引数に渡して,1桁目と2桁目を掛け算した結果を一桁になるまで繰り返して,

         1桁になるまでの回数が一番多いものをみつけたい。

【問題】:問題14で作成したメソッドmulti2をベースに10から99までをループして,計算の流れを出力するプログラムへmulti2メソッドを

     修正しましょう。

【ヒント】:数値を2桁幅で出力することができます。System.out.printfというメソッドを探して対応してみましょう。

【ファイル名】:MethodQuestion015.java

public class MethodQuestion015 {
    public static void main(String[] args) {
        for (int i = 10; i < 100; i++) {
            multi2(i);
        }

    }

    //メソッドmulti2を定義しましょう。
}

出力イメージの一部は下記のようになります。

51 =>  5
52 10 =>  0
53 15 =>  5
54 20 =>  0
55 25 10 =>  0

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion015 {
    public static void main(String[] args){
        for (int i = 10; i < 100; i++) {
            multi2(i);
        }

    }

    //メソッドmulti2を定義しましょう。
    public static int multi2(int num) {
        if (num >= 100 || num < 0) {
            return 0;//3桁以上やマイナスの場合は,0を返す。
        } else if (num < 10) {
            System.out.printf("=> %2d\n", num);
            return num;//1桁の場合は,そのまま入力値を返す。
        }

        int num1 = num / 10;
        int num2 = num % 10;
        System.out.printf("%2d ", num);
        return multi2(num1 * num2); //計算した結果をさらにmulti2へ渡します。
    }
}

【解説】
問題14の発展系の問題となります。新たに出力部分を追加するという問題で,どこに何を出力すればよいか?を考える問題です。
考え方としては,2パターンあります。ロジックをしっかりと考えて,ここにいれるという考え方です。
しっかりとプログラムの流れが分かっている場合,こちらはとても早く解決に至ります。また,自身の理解度も試せます。
もう一つの方法としては,とりあえず,出力する処理を色々いれてみて,試して結果に近づくようにします。
わからなくても,とにかく何かアプローチをするということがとても大切です。時間はかかりますが,回答に近づけ,
あんまり理解が出来ていない場合は,理解をすすめる一助となるかと思います。
また,フォーマットをして出力してくれるSystem.out.printfについては,2桁幅で出力するために利用しています。
こちらも書籍のスッキリわかるJava入門編第2版には入っていなかった内容かと思いますが,学習を進めていきましょう。
繰り返しが一番多い数字は,ご自身で確認してみましょう。

【スッキリわかるJava入門編第2版の参考ページ】???ページ


問題16

【やりたいこと】:0より大きい整数を入力として,一桁ずつを足し合わせて合計した結果を返すメソッドを作りたい。

【問題】:数値を1桁ずつ取得して,それらを合計した結果を返すsumメソッドを作りましょう。

【ヒント】:①桁数を取得しましょう。②桁数がわかったら,その桁のみを取り出すための方法を考えましょう。

      (Math.pow(10, 1) とすると10を返してくれます。調べて利用してみましょう。)

【出力例】:1234 を渡すと, 1 + 2 + 3 + 4 = 10なので,10が出力されるとバッチリです。

【ファイル名】:MethodQuestion016.java

public class MethodQuestion016 {
    public static void main(String[] args) {
        int num = 1234;//0より大きい整数の入力値

        int result = sum(num);

        System.out.println(result);//合計値を出力。

    }

    //数値を1桁ずつ取得して,それらを合計したものを返すメソッドを作りましょう。
}

【解決方法】
下記のようなプログラムにします。

public class MethodQuestion016 {
    public static void main(String[] args){
        int num = 1234;//0より大きい整数の入力値

        int result = sum(num);

        System.out.println(result);//合計値を出力。

    }

    //数値を1桁ずつ取得して,それらを合計したものを返すメソッドを作りましょう。
    public static int sum(int num) {
        int inputNum = num;
        String numStr = String.valueOf(inputNum);//桁数を取得

        int sum = 0;
        for (int i = numStr.length() - 1; i >= 0; i--) {//一番大きい桁から順に取得していき数値を取り出し,足し合わせていく。
            int base = (int) Math.pow(10, i);
            int num1 = inputNum / base;//数字の取り出し
            //System.out.println(num1);こちらで出力すると1桁ずつの数字のイメージがつきやすいかと思います。
            inputNum = inputNum % base;//後ろの数字を取得して,numへ設定
            sum += num1;
        }
        return sum;
    }
}

【解説】
各数字を取得するためにまず,数値の桁数を取得するために一度文字列型へ変更して,length()を利用して桁数を取得します。
桁数分だけをループ処理しますが,1桁ずつを取得するために,その桁に合わせて割り算を作成します。
今回の場合,最初のループでは,最初の1234 を1000で割った数字で1を取得し,その余りで,234を次のループへ渡すinputNumに設定しています。
これを繰り返して,桁ごとの数値を足し合わせたものを返しています。
プログラムを利用して,できることを少しずつ増やしていきましょう。

【スッキリわかるJava入門編第2版の参考ページ】???ページ