条件分岐と繰り返しの問題


問題1

【問題】:下記のコードを実行すると,何が出力されるでしょうか?

【ファイル名】:IfQuestion001.java

public class IfQuestion001 {
    public static void main(String[] args){
        int score = 82;

        if(score > 60){
            System.out.println("まだまだ成長できます。");
        }else if(score > 80){
            System.out.println("あともうちょっと,頑張りましょう。");
        }else if(score == 100){
            System.out.println("100点です。素晴らしい!");
        }
    }
}

【回答】
「まだまだ成長できます。」

【解説】
if-else文の場合,上から順に条件を確認していき,条件がtrueの場合そちらを出力します。
5行目の条件を満たしてしまうため,6行目のメッセージが出力されます。
条件の書き方によって意図した結果とならないことがあるので,条件の順番に気をつけることや
プログラムが完成した後に,色々な値で正しく出力させるようにしましょう。
今回のプログラムを意図した形で出力したい場合は,たとえば,下記のようなコードで対応できます。

public class IfQuestion001 {
    public static void main(String[] args){
        int score = 82;

        if(score == 100){
            System.out.println("100点です。素晴らしい!");
        }else if(score > 80){
            System.out.println("あともうちょっと,頑張りましょう。");
        }else if(score > 60){
            System.out.println("まだまだ成長できます。");
        }
    }
}

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


問題2

【問題】:下記のコードには問題があります。どこが問題となっていて,どのように修正すればよいでしょう?

【ファイル名】:IfQuestion002.java

public class IfQuestion002 {
    public static void main(String[] args){
        String gender = "男性";

        if (gender == "男性") {
            System.out.println("かっこいいですね。");
        } else if (gender == "女性") {
            System.out.println("かわいいですね。");
        } else {
            System.out.println("素敵ですね");
        }
    }
}

【解決方法】
Stringの文字列の比較は,equalsメソッドで行います。

public class IfQuestion002 {
    public static void main(String[] args){
        String gender = "男性";

        if (gender.equals("男性")) {// == を equalsメソッドに変更します。
            System.out.println("かっこいいですね。");
        } else if (gender.equals("女性")) {// == を equalsメソッドに変更します。
            System.out.println("かわいいですね。");
        } else {
            System.out.println("素敵ですね");
        }
    }
}

【解説】
Stringの場合「==」で判定してしまう時に,正しく判定されないことが起きます。
Stringの場合は,「equals」メソッドが用意されていますので,必ずそちらで文字列の比較をしましょう。

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


問題3

【やりたいこと】:boolean型変数lightを使い,if文などを使って条件によって,

 trueの場合は「電気がつきます。」falseの場合は「電気が消えています。」と出力したい。

【問題】:下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion003.java

public class IfQuestion003 {
    public static void main(String[] args){
        boolean light = true;//テストする際は,falseも設定して試しましょう。

        //light がtrue の時
        System.out.println("電気がつきます。");

        //light がfalse の時
        System.out.println("電気が消えています。");
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion003 {
    public static void main(String[] args){
        boolean light = true;//テストする際は,falseも設定して試しましょう。

        if (light) { //light がtrue の時
            System.out.println("電気がつきます。");
        } else {     //light がtrueでない時,つまり,false の時
            System.out.println("電気が消えています。");
        }
    }
}

【解説】
boolean の場合,条件式部分は,「light == true」と書いても良いですが,一般的に「light」のみを記載します。
この「light」と条件で書かれている場合は,「light」がtrueの時を指し示しています。
また,if (!light) のように,booleanの変数の前に!がついている場合は,if(light == false)と同じことを指し,
「light」がtrueでない という否定を意味します。 ※!がつくと,否定の意味になります。
最初はなれないかもしれませんが少しずつなれていきましょう。

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


問題4

【やりたいこと】:num1とnum2の数値の比較をするプログラムを作成したい。

【問題】:下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?
【ヒント】:MECE(ミーシー)『もれなく,だぶりなく』を意識してコードを作成しましょう。

【ファイル名】:IfQuestion004.java

public class IfQuestion004 {
    public static void main(String[] args){
        int num1 = 100;
        int num2 = 50;

        //num1とnum2の値を色々と変更して条件に合わせて出力を変更しましょう。
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion004 {
    public static void main(String[] args){
        int num1 = 100;
        int num2 = 50;

        //num1とnum2の値を色々と変更して条件に合わせて出力を変更しましょう。
        if (num1 > num2) {
            System.out.println("num1の方が大きいです。");
        } else if (num1 == num2) {
            System.out.println("num1とnum2は同じです。");
        } else { //残りの条件は num1 < num2 しかないので,elseでOKです。
            System.out.println("num2の方が大きいです。");
        }
    }
}

【解説】
条件をもれなく考えて記載できましたでしょうか?
今回の場合は,大きい,同じ,小さい という3つの条件で全てでしたが,
プログラムによって条件分岐の数は,変わってきますので,同じ考え方でダブりやもれなく条件を組み立てる必要があります。
はじめは難しいですが,少しずつ慣れていきましょう。

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


問題5

【やりたいこと】:if文で記述していたものを,switch文で書き直したい。

【問題】:下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion005.java

public class IfQuestion005 {
    public static void main(String[] args){
        String fruit = "りんご";

        System.out.print(fruit + "は英語で,");
        if (fruit.equals("りんご")) {
            System.out.print("Apple");
        } else if (fruit.equals("みかん")) {
            System.out.print("Mandarin orange");
        } else if (fruit.equals("ぶどう")) {
            System.out.print("Grape");
        } else {
            System.out.print("わからない");
        }
        System.out.println("です。");
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion005 {
    public static void main(String[] args){
        String fruit = "ぶどう";

        System.out.print(fruit + "は英語で,");
        switch (fruit) {
        case "りんご":
            System.out.print("Apple");
            break;
        case "みかん":
            System.out.print("Mandarin orange");
            break;
        case "ぶどう":
            System.out.print("Grape");
            break;
        default:
            System.out.print("わからない");
        }
        System.out.println("です。");
    }
}

【解説】
if文の条件文で特定の値を判定するといった場合は,switch文で置き換えることができます。
switch文の記述の仕方もこちらで覚えておきましょう。

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


問題6

【やりたいこと】:1:青信号,2:黄信号,3:赤信号 として,それぞれでメッセージを出したいけど,出力がおかしいので,修正したい。

【問題】:下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion006.java

public class IfQuestion006 {
    public static void main(String[] args){
        int signal = 1;//1:青信号,2:黄信号,3:赤信号

        switch (signal) {
        case 1:
            System.out.println("青信号です。渡って大丈夫。");
        case 2:
            System.out.println("黄信号です。そろそろ止まりましょう。");
        default:
            System.out.println("赤信号です。止まりましょう。");
        }
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion006 {
    public static void main(String[] args){
        int signal = 1;//1:青信号,2:黄信号,3:赤信号

        switch (signal) {
        case 1:
            System.out.println("青信号です。渡って大丈夫。");
            break;//breakが抜けているので追加します。
        case 2:
            System.out.println("黄信号です。そろそろ止まりましょう。");
            break;//breakが抜けているので追加します。
        default:
            System.out.println("赤信号です。止まりましょう。");
        }
    }
}

【解説】
switch文の場合,caseの最後でbreak;を書かない場合,条件を満たしたケース以降の次のケースまではいってしまいます。
複数の条件で問題がない場合は良いですが,必要な場合はbreak;を適宜挿入しましょう。

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


問題7

【やりたいこと】:「おはよう」と5回表示したい。

【問題】:for文を利用して下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion007.java

public class IfQuestion007 {
    public static void main(String[] args){
        //for文を使って5回出力しましょう。
        System.out.println("おはよう");
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion007 {
    public static void main(String[] args){
        //for文を使って5回出力しましょう。
        for (int i = 0; i < 5; i++) {
            System.out.println("おはよう");
        }
    }
}

【解説】
for文は繰り返しの処理をする場合に利用します。forの場合,あらかじめ処理する回数が決まっている場合に利用して,
while文の場合は繰り返し処理の回数が分からない場合に利用します。

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


問題8

【やりたいこと】:10から20までをループしながら,10から20までの合計を求めたい。

【問題】:for文を利用して下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion008.java

public class IfQuestion008 {
    public static void main(String[] args){
        //10から20までをループしながら,合計を求めましょう。
        for (int i = 10; i <= 20; i++) {

        }

        System.out.println("10-20までの合計値は = ");
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion008 {
    public static void main(String[] args){
        int sum = 0; //①合計値をためておく変数を用意します。
        for (int i = 10; i <= 20; i++) {
            sum = sum + i; //②sum にループ変数のi を足し合わせていきます。
            //sum += i; //②の部分はこちらでもOKです!!
        }
        System.out.println("10-20までの合計値は = " + sum);//③sum を追加して合計を表示させます。
    }
}

【解説】
合計値を求める場合,合計値を保存しておくために,変数が必要になります。
繰り返しの処理の中で利用しているループ変数のiがあるので,そちらを sum に足していくことで合計値が求められます。
最後に合計値の入っている変数のsumを出力に追加して完了となります。
合計値が165となっていれば,バッチリです!!

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


問題9

【やりたいこと】:1から100までをループしながら,1から100までの3の倍数のみの合計値を求めたい。

【問題】:for文を利用して下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion009.java

public class IfQuestion009 {
    public static void main(String[] args){
        //1から100までをループしながら,3の倍数のみの合計を求めましょう。
        for (int i = 1; i <= 100; i++) {

        }
        System.out.println("1-100までの3の倍数のみの合計値は = ");
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion009 {
    public static void main(String[] args){
        int sum = 0; //①合計値をためておく変数を用意します。
        for (int i = 1; i <= 100; i++) {
            if(i % 3 == 0){//②3の倍数かを判定するために,3で割った時の剰余が0の場合という条件をつけます。
                sum = sum + i;//③sum にループ変数のi を足し合わせていきます。
            }
        }
        System.out.println("1-100までの3の倍数のみの合計値は = " + sum);//④sum を追加して合計を表示させます。
    }
}

【解説】
合計値を求める場合,合計値を保存しておくために,変数が必要になります。
今回3の倍数のみという条件がついているので,3の倍数を判定するために,3で割った時のあまりが0という条件をつけて,3の倍数を判定しています。
問題8と同様に,繰り返しの処理の中で利用しているループ変数のiがあるので,そちらを sum に足していくことで合計値が求められます。
最後に合計値の入っている変数のsumを出力に追加して完了となります。
合計値が1683 となればバッチリです!!

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


問題10

【やりたいこと】:1から100までをループしながら,1から100まで合計値を求めていき,合計値が2500をこえた時の足し合わせた最後の数字を出力したい。

【問題】:for文を利用して下記のコードを修正して,上記のやりたいことを実現するコードはどのように書けばいいでしょうか?

【ファイル名】:IfQuestion010.java

public class IfQuestion010 {
    public static void main(String[] args){
        //ここに処理を記述しましょう。
        System.out.println("合計値が2500をこえた時の最後の数字は,");
        System.out.println("合計値は, ");
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion010 {
    public static void main(String[] args){
        int i;//①ループ変数をforの外側で宣言します。※forループの処理が終わっても利用したいから。
        int sum = 0;//②合計値をためておく変数を用意します。
        for (i = 1; i <= 100; i++) {
            sum = sum + i;//③sum にループ変数のi を足し合わせていきます。
            if(sum > 2500){//④合計値が2500をこえているかを判定します。
                break;//⑤こえている場合にforループを中断させるために,break;で抜け出します。
            }

        }
        System.out.println("合計値が2500をこえた時の最後の数字は = " + i);//⑥数字のiを追加します。
        System.out.println("合計値は, " + sum);//⑦その時の合計値をsumを追加します。
    }
}

【解説】
今回の場合,最後の数字が必要になるので,forの中でint i とすると,forの処理が終わると利用できなくなるので,
forの前で変数の宣言を行います。合計値用にsum も用意します。
繰り返し処理をしながら,2500を超えているかを判定していき,超えた場合にforを抜け出すbreakをして,処理を中断します。
最後にループで利用していたiが超えた最後の数字が入っているので,そちらと合計値の入っている変数のsumを出力に追加して完了となります。
ちなみに最後の数字は,71でその時の合計値が2556 となればバッチリです!!

【スッキリわかるJava入門編第2版の参考ページ】105-106, 122-129ページ


問題11

【やりたいこと】:ゲームの時によくおこなわれるような場面をプログラムで作成したい。

 ※王様からのメッセージをうけて,勇者が世界をすくうかどうかを「はい」「いいえ」で選択するあれです。

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

【ヒント】:Scannerを利用します。ループ処理として,do-whileを利用します。

【ファイル名】:IfQuestion011.java

import java.util.Scanner;

public class IfQuestion011 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String answer = "";//勇者の回答を保存しておく変数。

        System.out.println("王様:勇者よ,世界をすくってくれないか?");//王様のメッセージです。

        System.out.println("勇者:1:はい,2:いいえ (1,2のどちらかで入力をお願いします。");//入力を促すメッセージです。

        System.out.println("王様:勇者よ,たのんだぞ!!");//「"1"」を入力された場合のメッセージを出力して終了。
        System.out.println("王様:勇者よ,そんなこといわないで\n");//「"2"」を入力された場合のメッセージを出力して再度王様のメッセージ。
        System.out.println("王様:勇者よ,答えてくれ\n");//「"1"」「"2"」以外を入力された場合のメッセージを出力して再度王様のメッセージ。

        sc.close();//※Scannerを利用した場合,入力の受付をもうしないという場合,close処理が必要です。
    }
}

【実行結果のサンプル】下記のコメント部分は入力待ちの状態で入力したものを示しています。

王様:勇者よ,世界をすくってくれないか?
勇者:1:はい,2:いいえ (1,2のどちらかで入力をお願いします。
2 //「2」を入力します。
王様:勇者よ,そんなこといわないで

王様:勇者よ,世界をすくってくれないか?
勇者:1:はい,2:いいえ (1,2のどちらかで入力をお願いします。
2 //「2」を入力します。
王様:勇者よ,そんなこといわないで

王様:勇者よ,世界をすくってくれないか?
勇者:1:はい,2:いいえ (1,2のどちらかで入力をお願いします。
a //「a」を入力します。
王様:勇者よ,答えてくれ

王様:勇者よ,世界をすくってくれないか?
勇者:1:はい,2:いいえ (1,2のどちらかで入力をお願いします。
1 //「1」を入力します。
王様:勇者よ,たのんだぞ!!

【解決方法】
下記のようなコードに変更します。

import java.util.Scanner;

public class IfQuestion011 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String answer = "";//勇者の回答を保存しておく変数。

        do {//①ループ処理の始まりです。
            System.out.println("王様:勇者よ,世界をすくってくれないか?");//王様のメッセージです。

            System.out.println("勇者:1:はい,2:いいえ (1,2のどちらかで入力をお願いします。");//入力を促すメッセージです。
            answer = sc.nextLine();//②文字列を受け取るためのメソッドです。

            if (answer.equals("1")) {//③入力された文字列が「"1"」か判定。
                System.out.println("王様:勇者よ,たのんだぞ!!");//「"1"」を入力された場合のメッセージを出力して終了。
            } else if (answer.equals("2")) {//④入力された文字列が「"2"」か判定。
                System.out.println("王様:勇者よ,そんなこといわないで\n");//「"2"」を入力された場合のメッセージを出力して再度王様のメッセージ。
            } else {//⑤入力された文字列が「"1"」「"2"」以外の場合の判定。
                System.out.println("王様:勇者よ,答えてくれ\n");//「"1"」「"2"」以外を入力された場合のメッセージを出力して再度王様のメッセージ。
            }

        } while (!answer.equals("1"));//⑥「"1"」以外の文字列が入力されている場合にループをする。
        sc.close();//※Scannerを利用した場合,入力の受付をもうしないという場合,close処理が必要です。
    }
}

【解説】
今回のループ処理のポイントは,ユーザが何回,いいえなどの判断をするかわからない。ということがポイントになります。
イジワルな人は何回もいいえを選択すると思います。その回数はユーザ毎に異なるため,ループする回数がわからないということになります。
また,かならず最初にメッセージを一回は出力したいため,do-whileを利用します。
ループ回数があらかじめ決まっていない状態で,0回以上という場合は,whileループで作成します。
forとwhileの使い分けのイメージの説明でした。

【スッキリわかるJava入門編第2版の参考ページ】90-91, 121-122ページ


問題12

【やりたいこと】:九九の表を綺麗に出力したい。

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

【ヒント】:0-9までは一桁になります。一桁の場合に,半角スペースを補うと2桁になります。

【ファイル名】:IfQuestion012.java

public class IfQuestion012 {
    public static void main(String[] args){
        //こちらにプログラムを書きましょう。    
    }
}

【実行結果のサンプル】下記のように出力しましょう。

 1  2  3  4  5  6  7  8  9 
 2  4  6  8 10 12 14 16 18 
 3  6  9 12 15 18 21 24 27 
 4  8 12 16 20 24 28 32 36 
 5 10 15 20 25 30 35 40 45 
 6 12 18 24 30 36 42 48 54 
 7 14 21 28 35 42 49 56 63 
 8 16 24 32 40 48 56 64 72 
 9 18 27 36 45 54 63 72 81 

【解決方法】
下記のようなコードに変更します。

public class IfQuestion012 {
    public static void main(String[] args){
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
                int result = i * j;
                if (result < 10) {// 一桁の場合かを判定して,
                    System.out.print(" ");//そうであった場合に,前に空白を一つ補い2桁とする。
                }
                System.out.print(result + " ");
            }
            System.out.println();
        }
    }
}

【解説】
ポイントとしては,綺麗に出力したいとということになります。
そのまま出力すると,ずれて表示されてしまうので,一桁の場合を判定して,空白を一つ補う形にしています。
今回の方法以外にも,String.formatというメソッドを利用することや,System.out.printfを利用することで解決できます。
プログラムには回答は複数ありますが,今回は,そちらを使わずに対応する方法で回答を作成しています。
下記にその他の方法を使う場合のヒントとなるページを紹介していますので,お時間ある方は,アドバンスな知識として確認しておきましょう。

【5分で理解】JavaのString.formatの使い方まとめ
【Java入門】printfメソッドで書式を指定して文字列を表示する方法

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


問題13

【やりたいこと】:BMIの値を入力して,結果を判別したい。

【出力条件】:「BMIが0より大きくて18.5未満の場合は,低体重。」「BMIが18.5以上25未満の場合は,普通体重。」「BMIが25以上の場合は,過体重」とする。

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

【お願い】:論理演算子のかつを利用して作成しましょう。

【ファイル名】:IfQuestion013.java

public class IfQuestion013 {
    public static void main(String[] args){
        double bmi = 19;

        System.out.print(bmi + "は,");
        //この下に条件をいれて完成させましょう。

        System.out.println("低体重です。");//18.5未満の場合
        System.out.println("普通体重です。");//18.5以上25未満の場合
        System.out.println("過体重です。");//25以上の場合
        System.out.println("計測不能です。");//0以下の場合,計測できません。    
    }
}

【解決方法】
下記のようなコードに変更します。

public class IfQuestion013 {
    public static void main(String[] args){
        double bmi = 19;

        System.out.print(bmi + "は,");
        
        if (bmi > 0 && bmi < 18.5) {
            System.out.println("低体重です。");//18.5未満の場合
        } else if (bmi >= 18.5 && bmi < 25) {
            System.out.println("普通体重です。");//18.5以上25未満の場合
        } else if (bmi >= 25) {
            System.out.println("過体重です。");//25以上の場合
        } else {
            System.out.println("計測不能です。");//0以下の場合,計測できません。
        }
    }
}

【解説】
今回の課題のポイントは論理演算子を利用している点です。
条件を組み合わせて書く場合,論理演算子を利用します。これは,AかつBまたCというような形で複数同時にかけますが,
&& のかつの方が優先順位が高く,先ほどの判定は,①A かつ B で得られた結果 ②①の結果 または C という判定になります。
判定の順序なども意識してかけるように頑張っていきましょう。
下記に優先順位についての参考URLがあるので,お時間ある方は,確認しておきましょう。

2分ですぐにわかる!演算子の優先順位の考え方

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


問題14

【やりたいこと】:鶴亀算を解くプログラムを作成したい。

【鶴亀算とは】:鶴亀算について分からない場合は,鶴亀算と連立方程式 などを確認してみましょう。

【要件】:鶴と亀の合計数,足の数を変数にあらかじめ設定しておき,鶴と亀の数を出力してみましょう。

     その際、計算できない場合は,「答えは存在しません。」と出力しましょう。

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

【ファイル名】:IfQuestion014.java

public class IfQuestion014 {
    public static void main(String[] args){
        int hiki = 10;//合計匹数をいれる変数
        int asi = 28;//足の合計をいれる変数
        int turu;//鶴の数を入れる変数
        int kame;//亀の数を入れる変数

        System.out.println("問題");
        System.out.println(" 鶴と亀が合計" + hiki + "匹いる。");
        System.out.println(" 足の数が合わせて" + asi + "本の時,亀は何匹いるか?");

        //この下にプログラムを作成しましょう。

        //答えがない場合のメッセージです。
        System.out.println("答えは存在しません。");

        //答えがある場合のメッセージです。
        System.out.println("解答");
        System.out.println(" 亀は" + kame + "匹います。(鶴は" + turu + "匹います。)");   
    }
}

【実行結果のサンプル】下記のように出力しましょう。

【答えがある場合】-------------------------------
問題
 鶴と亀が合計10匹いる。
 足の数が合わせて28本の時,亀は何匹いるか?
解答
 亀は4匹います。(鶴は6匹います。)
【答えがない場合】-------------------------------
問題
 鶴と亀が合計20匹いる。
 足の数が合わせて28本の時,亀は何匹いるか?
答えは存在しません。

【解決方法】
下記のようなコードに変更します。

public class IfQuestion014 {
    public static void main(String[] args){
        int hiki = 10;//合計匹数をいれる変数
        int asi = 28;//足の合計をいれる変数
        int turu;//鶴の数を入れる変数
        int kame;//亀の数を入れる変数

        System.out.println("問題");
        System.out.println(" 鶴と亀が合計" + hiki + "匹いる。");
        System.out.println(" 足の数が合わせて" + asi + "本の時,亀は何匹いるか?");

        //連立方程式により,亀と鶴の計算をします。
        kame = (asi - hiki * 2) / 2;
        turu = hiki - kame;

        if (kame < 0 || asi % 2 == 1) {//亀がマイナスになる場合や足の本数が奇数の場合,答えはありません。
            System.out.println("答えは存在しません。");
        } else {
            System.out.println("解答");
            System.out.println(" 亀は" + kame + "匹います。(鶴は" + turu + "匹います。)");
        }
    }
}

【解説】
今回の課題のポイントは連立方程式を上手く利用することで,亀と鶴の数を求めている点となります。
プログラムを作成する場合にどのようにすれば,解決できるか?を考え,それをプログラムで書くとどのようになるかを考えることが,
とても大切になります。また,計算が出来ない場合も考慮しながら,色々な値でもおかしくならないようにすることを検討しましょう。

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


問題15

【やりたいこと】:10 から1 までを順に出力したい。

【問題】:上記のプログラムを実現するためには,ループ処理を使ってどのように記述すればよいでしょうか?

【ファイル名】:IfQuestion015.java

public class IfQuestion015 {
    public static void main(String[] args){
        //ここに処理を記述しましょう。
        
    }
}

【実行結果のサンプル】下記のように出力しましょう。

10
9
8
7
6
5
4
3
2
1

【解決方法】
下記のようなコードに変更します。

public class IfQuestion015 {
    public static void main(String[] args){
        for (int i = 10; i > 0; i--) {
            System.out.println(i);
        }
    }
}

【解説】
forのループ処理を利用します。初期値として10を設定し,条件を1になるまで設定し,増減の部分を-1ずつ減らす形にします。
繰り返し回数があらかじめ決まっている状態で,複雑なパターンも条件などの設定で上手く記述できるので色々と試して見ましょう。

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


問題16

【やりたいこと】:変数weightに設定されている値でメッセージを切り替えたい。

【問題】:下記プログラムはエラーとなっています。どのようにすれば,やりたいことを実現できるでしょうか?

【ファイル名】:IfQuestion016.java

public class IfQuestion016 {
    public static void main(String[] args){
        int weight = 100;

        if (weight >= 100) {
            String message = weight + "は100以上です。";
        } else {
            String message = weight + "は100未満です。";
        }

        System.out.println(message);
        
    }
}

【解決方法】
ブロック内で宣言された変数は,ブロック内でしか利用ができないので,外側で変数の宣言を行います。

public class IfQuestion016 {
    public static void main(String[] args){
        int weight = 100;
        String message;
        if (weight >= 100) {
            message = weight + "は100以上です。";
        } else {
            message = weight + "は100未満です。";
        }

        System.out.println(message);
    }
}

【解説】
変数はブロック内でしか利用ができないため,問題文の書き方だと,外側のブロックでは参照ができないので,
外側のブロックで宣言することで,mainメソッド内で利用できる形に変更しています。
変数の利用可能な範囲をスコープといい,エラーなどで「変数●●が見つかりません」といった場合,
変数の宣言や変数が宣言されている場所が正しいかを確認してみましょう。

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


問題17

【やりたいこと】:うるう年を判定するプログラムを作りたい。

【問題】:上記プログラムを実装する時,どのように記述すればよいでしょうか?

【ヒント】:論理演算子を組み合わせることで,シンプルにまとめることができます。

【うるう年の条件】:

グレゴリオ暦では、現在以下の規則になっています。
  (1) 西暦の年が 4 で割り切れる年は原則として「うるう年」
  (2) ただし、100で割り切れたら「平年」とする
  (3) しかし、400で割り切れるなら「うるう年」とする 
うるう年チェック
    2011年は、平年 (4で割り切れません)
    2012年は、うるう年 (4で割り切れ、100では割り切れません)
    2000年は、うるう年 (4で割り切れ、100で割り切れますが、400で割り切れます)
    2100年は、平年 (4で割り切れ、100で割り切れ、400では割り切れません)

 

【ファイル名】:IfQuestion017.java

public class IfQuestion017 {
    public static void main(String[] args){
        int year = 2000;

        //うるう年の場合のメッセージ
        System.out.println(year + "年はうるう年です");

        //うるう年じゃない場合のメッセージ
        System.out.println(year + "年はうるう年ではありません。");
        
    }
}

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

public class IfQuestion017 {
    public static void main(String[] args){
        int year = 2000;

        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            System.out.println(year + "年はうるう年です");//うるう年の場合のメッセージ
        } else {
            System.out.println(year + "年はうるう年ではありません。"); //うるう年じゃない場合のメッセージ
        }
    }
}

【解説】
今回の場合,問題の条件の順に条件を作成していきます。5行目のif文で順に条件をまとめて書いてありますが,
判定の順番としては,①4で割り切れるを判定し,②100で割り切れないを判定します。この①かつ②を満たす場合,条件はtrueになるので,
うるう年となります。①かつ②でfalseの場合,③の400で割り切れるかを判定します。③がtrueの場合,うるう年になります。
条件を上手く組み合わせることで,ひとつの条件としてまとめられるので,少しずつ練習をしていきましょう。
演算子の優先順位については,下記URLにまとめられていますので,確認してみましょう。

演算子の優先順位

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


問題18

【やりたいこと】:信号の結果によって出力を変えたい。

【問題】:下記プログラムを実行すると,意図しないメッセージが表示されてしまいます。どのように修正すればよいでしょうか?

【ファイル名】:IfQuestion018.java

public class IfQuestion018 {
    public static void main(String[] args){
        boolean signal = true;//信号:trueが青で,falseが赤とします。

        if (signal) {
            System.out.println("信号は青です。");
            System.out.println("渡ります。");
        } else
            System.out.println("信号は赤です。");
            System.out.println("止まります。");
    }
}

上記プログラムを実行すると,下記のような出力がされます。

信号は青です。
渡ります。
止まります。

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

public class IfQuestion018 {
    public static void main(String[] args){
        boolean signal = true;//信号:trueが青で,falseが赤とします。

        if (signal) {
            System.out.println("信号は青です。");
            System.out.println("渡ります。");
        } else {
            System.out.println("信号は赤です。");
            System.out.println("止まります。");
        }
    }
}

【解説】
今回の場合,elseの条件について,波カッコを省略してしまっているため,elseでの処理は9行目だけが反応する形になっているため,
signalがtrueの時に,10行目まで出力されてしまいます。プログラムの文法上,間違っていないので,コンパイルは通るのですが,
意図しない形で実行されています。条件が1行の場合は,波カッコは省略できますが,処理が1行であっても,省略しないように
記述することが推奨されていますので,elseの処理にあわせて,波カッコを追加しましょう。

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