練習問題

本日の残りの時間で,次に挙げる練習問題を順に作成してください.

1. Big & Small

0から1までの Double 型の乱数を発生させ,その値が0.5より小さければ Small,0.5以上であれば Big と出力するプログラムを作成してください. 0以上1未満の Double 型の乱数は,次のコードで得られます.

public class BigAndSmall{
    public static void main(String[] args){
        Double value = Math.random();
        // valueには0から1の乱数が代入されている.
        System.out.printf("value: %f: ", value);

        // ここに判定のプログラムを書いていく.
    }
}

実行すると,そのときの value の値と Big もしくは Small の文字列が出力されます.

乱数発生方法

0以上1未満の Double 型の乱数は,次の1行で得られます.

Double value = Math.random();

出力例

以下の出力例と同じ結果は出ませんが,条件に示したように,value の値が0.5より小さいか,以上かで判定できているかを確認してください.

$ java BigAndSmall
value: 0.327039: Small
$ java BigAndSmall
value: 0.582704: Big
$ java BigAndSmall
value: 0.239037: Small
$ java BigAndSmall
value: 0.304460: Small

2. うるう年の判定

与えられた年がうるう年であるか否かを判定しましょう. うるう年は,次のように判定します.

次のようなフローチャートになります.

graph LR id1{4で割り切れる} id2{100で割り切れる} id3{400で割り切れる} leap(うるう年) ordinal(平年) id1 -->|true|id2 id1 -->|false|ordinal id2 -->|true|id3 id3 -->|false|ordinal id3 -->|true|leap id2 -->|false|leap
public class LeapYear{
    public static void main(String[] args){
        Integer year = 2016;
        Boolean leapYear = false;
        // ここに判定処理を書いていく.
 
        if(leapYear){ // leapYearがtrueの場合.
            System.out.printf("%d年はうるう年です.%n", year);
        }
        else{
            System.out.printf("%d年はうるう年ではありません.%n", year);
        }
    }
}

完成すれば,year の値を変更して実行結果を確認してください. なお,2000, 2004, 2016年はうるう年,2100,2015, 1900年はうるう年ではありません.

条件文の AND, OR, NOT

if(条件式1 && 条件式2){
    // 条件式1, 条件式2の両方を満たした時に実行される.
}
if(条件式1 || 条件式2){
    // 条件式1,条件式2のどちらかを満たすときに実行される.
}
if(!条件式1){
    // 条件式1を満たさないとき(falseの場合)に実行される.
}

出力例

以下のように,判定する年を変更して実行結果を確認してみましょう. 以下の例では省略していますが, year に代入する値を変更するたびにコンパイルしてください.

$ java LeapYear
2016年はうるう年です.
$ java LeapYear
2000年はうるう年です.
$ java LeapYear
2004年はうるう年です.
$ java LeapYear
2100年はうるう年ではありません.
$ java LeapYear
2015年はうるう年ではありません.
$ java LeapYear
1900年はうるう年ではありません.

3. 総和を求める.

ループを用いて,1から10までの総和(10を含む)を求めましょう.次の手順で作成していきましょう.

  1. クラス名をGrandTotal とする.
  2. main メソッドを用意する.
  3. main メソッド内で Integer 型の変数 result を宣言する.
    • result は初期値として0を代入しておく.
  4. main メソッド内で Integer 型のループ制御変数 i を宣言する.
  5. ループ制御変数 i を用いて1から10までループを作成する.
  6. 繰り返しごとに,resulti の値を加算していく.
  7. ループ終了後,result の値を出力する.

ループはC言語と同じように書けます. forwhile のどちらも利用できますので,試してみましょう.

完成すれば,範囲を変更して,総和を求めましょう.

出力例

$ java GrandTotal
1から10までの総和は55です.
$ java GrandTotal
1から100までの総和は5050です.
$ java GrandTotal
1から1000までの総和は500500です.

4. 九九を表示する.

出力例のように,九九を表示するプログラムを作成しましょう. クラス名を Multiplication とします.

出力するとき,System.out.printf のフォーマット記述子に%d ではなく,%2dとすると,1桁の数字でも2桁として出力してくれます. なお,%02dとすると,足りない桁は0で埋めてくれます.

出力例

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

5. Xの描画

繰り返しを利用し,出力例の模様を出力してください. クラス名は XPrinter としてください.

出力例

$ java XPrinter
X........X
.X......X.
..X....X..
...X..X...
....XX....
....XX....
...X..X...
..X....X..
.X......X.
X........X