学習4日目:制御構文を一通り。

学習時間について。

  • Day:4
  • Today:7h
  • Total:33h

今日の学習内容。

コードはコピペせずに必ず一度はEclipseに打ち込んで実行しています。パッと見で簡単なコードでも、真っ白な画面だと手が進まないこともあるので感覚を掴まなければ。。

条件分岐や繰り返しを行う「関係演算子」。

演算子と用例説明
a > baはbより大きいかどうか
a < baはbより小さいかどうか(未満)
a >= baはbより大きいか等しいかどうか(以上)
a <= baはbより小さいか等しいかどうか(以下)
a == baとbは等しいかどうか
a != b(!は否定の意)aとbは等しくないかどうか
public class Sample {
    public static void main (String[] args) {
        int a = 3;
        int b = 2;
        System.out.println(a > b);
        System.out.println(a < b);
    }
}

/* 結果

true
false

*/

関係演算子の演算結果はtruefalseの真偽値として表示される。

分岐を行うための「if文」。

public class ifSample {

    public static void main(String[] args) {
        int score = 59; //成績

        if (score == 100) {
            System.out.println("満点です!ご褒美をあげます!");
        } else if (score >= 80) {
            System.out.println("よくできました!");
        } else if (score >= 60) {
            System.out.println("合格です!");
        } else {
            System.out.println("赤点です...補講を行います");
        }
    }
}

/* 結果

赤点です...補講を行います

*/
  • else ifはいくつでも付け足すことが可能
  • else ifを使うときは順番が大切(逐次的に処理される)
    • 大きい順に並べる
  • if文の中にif文(else,else if含む)を書くこともできる
    • 入れ子、ネストという
    • インデントを1つ深くする
  • 複数文を記述/実行可能
  • 4重や5重の入れ子にならないように工夫が必要

複数の条件を使って判断させる「論理演算子」。

public class Triangle {

    public static void main(String[] args) {
        // 代入する数値は自由に変更してください
        int a = 8;
        int b = 6;
        int c = 8;

        if (a == b && b == c && c == a) {
            System.out.println("正三角形です。");
        } else if (a == b || b == c || c == a) {
            System.out.println("二等辺三角形です。");
        } else {
            System.out.println("不等辺三角形です。");
        }
    }
}

/* 結果

二等辺三角形です。

*/
  • &&:両方を満たせばtrue(AND)
    • 例:条件A && 条件B && 条件C
  • ||:どちらか片方を満たせばtrue(OR)
    • 例:条件A || 条件B || 条件C
      • 3つの内、どれか1つでも満たせばtrue
  • !:括弧で囲った条件の演算結果を逆にする性質(NOT)
    • 例:!(score < 60)score >= 60は同じ意味
    • !(条件A && 条件B) は !(条件A) || !(条件B))
    • !(条件A || 条件B) は !(条件A) && !(条件B)に置き換え可能
      • ド・モルガンの法則

繰り返しの「for文」。

条件:1から100までの数値を順番に出力する(7の倍数、7が入っている数字のときはclap!の文字列を出力する)。

public class SevenNumber {

    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
                System.out.println("clap");
            } else {
                System.out.println(i);
            }
        }
    }
}
  • for(初期化式;繰り返すための条件式;増やすか減らすか)
    • 初期化式はfor文の実行時、最初に呼ばれるもので2回目以降は実行されない
    • 繰り返しのための条件式でループ回数を決定
    • 最後にループのための数値(ループカウンタ)を調整
    • 入れ子が使える
  • カウンタはi,j,k……と使っていくのが通例
  • ++:インクリメント。1加算(カウントアップ)
    • 例:a++++aa += 1でも可)
  • --:デクリメント。1減算(カウントダウン)
    • 例:a----aa -=1でも可)

ループ回数を変えられる「while文」。

public class whileSample {

    public static void main(String[] args) {
        int num = 2;

        while (num < 1024) {
            num = num * 2;
            System.out.println(num);
        }
    }
}

/* 結果

4
8
16
32
64
128
256
512
1024

*/
  • while(条件式)
    • 何回回せるかわからない時や、処理結果によってループ回数を変えたい時に使用
  • num = num * 2;:処理結果を元の変数に戻す
    • 処理結果用の変数を用意する必要がないので便利
  • 無限ループに気を付ける
    • フリーズや再起動の原因
      • こまめにソースコードを保存

あえて無限ループをさせる「break文」。

public class breakSample {

    public static void main(String[] args) {
        int i = 1;
        while (true) {
            System.out.println(i);
            i++;
            if (i > 10) {
                break;
            }
        }
    }
}

/* 結果

1
2
3
4
5
6
7
8
9
10

*/
  • break:あえてwhile文の条件式が永遠とtrueになる記述をして無限ループとさせることもある
    • その際はブロック内の記述でループを終了させなければならない

課題:「FizzBuzz」。

条件
  • 1から100までの連続した整数
  • もし、その整数が3で割り切れる数なら「Fizz」と表示
  • もし、その整数が5で割り切れる数なら「Buzz」と表示
  • もし、その整数が3で割り切れ、なおかつ5で割り切れる数なら「FizzBuzz」と表示
  • それ以外の数は、その数をそのまま表示
public class FizzBizz {

    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i % 3 == 0 && i % 5 != 0) {
                System.out.println("Fizz");
            } else if (i % 5 == 0 && i % 3 != 0) {
                System.out.println("Buzz");
            } else if (i % 3 == 0 && i % 5 == 0) {
                System.out.println("FizzBuzz");
            } else {
                System.out.println(i);
            }
        }
    }
}

始めに書いたコード(下記)ではFizzBuzzが表示されなくて悩んだ。

public class FizzBuzz {

    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i % 3 == 0) {
                System.out.println("Fizz");
            } else if (i % 5 == 0) {
                System.out.println("Buzz");
            } else if (i % 3 == 0 && i % 5 == 0) {
                System.out.println("FizzBuzz");
            } else {
                System.out.println(i);
            }
        }
    }
}

しかし、3で割り切れるということは5で割り切れないということなのでi % 5 != 0&&で繋げば解決。

もう一つの条件分岐「switch文」。

public class switchSample {

    public static void main(String[] args) {
        int num = 4;

        switch (num) { // 式
        case 1: // case value
            System.out.println("非常に不満");
            break;
        case 2:
            System.out.println("少し不満");
            break;
        case 3:
            System.out.println("どちらとも言えない");
            break;
        case 4:
            System.out.println("少し満足");
            break;
        case 5:
            System.out.println("大変満足");
            break;
        default:
            System.out.println("存在しない選択肢です");
            break;
        }
    }
}

/* 結果

少し満足

*/
  • 式:整数の条件式によって分岐を行う
  • value:整数で具体的な数値
  • case:1つ以上複数回記載可能
  • default:どのcaseにも一致しない時のみ実行
  • 文字や小数では処理が行えない
  • breakがないと次のcase節を実行してしまうので注意

先に実行する「do-while文」。

public class doWhileSample {

    public static void main(String args[]) {
        int num = 13;
        do {
            System.out.println("num = " + num);
            num = num - 4;
        } while (num > 0);
        System.out.println("0を下回ったので終了");

        num = -3;
        do {
            System.out.println("num = " + num);
            num = num - 4;
        } while (num > 0);
        System.out.println("0を下回ったので終了");
    }
}

/* 結果

num = 13
num = 9
num = 5
num = 1
0を下回ったので終了
num = -3
0を下回ったので終了

*/

num = num + 4にしてて無限ループ発生した。気をつけないとね。ああ、だからEclipseは実行前に保管を促すのか。

  • ブロック内のコードを実行した後に、条件式のチェックが行われる
    • whileの逆
  • 最初の1回目はtruefalseに関係なく実行される

処理の流れを制御する「continue文」。

public class continueSample {

    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i == 3 || i == 5) {
                continue;
            }
            System.out.println(i);
        }
    }
}

/* 結果

1
2
4
6
7
8
9
10

*/
  • break:ループ処理を抜けるための命令
  • continue:残りのコードをスキップして、ループの先頭に戻ってを続けるための仕組み

オブジェクト指向について。

  • オブジェクト指向の特徴
    • 属性情報を持っている(プロパティ)
      • プロパティやメンバ、フィールドなどの変数
    • 振る舞いを持っている(メソッド)
    • ひとつひとつのオブジェクトは唯一無二の存在である
      • クラスという金型を用いて、個体としては異なるオブジェクトを生成する
    • オブジェクトとオブジェクトに関係性を持たせられる

※オブジェクト(参照型)が持つデータなのでプロパティも参照型のデータにする(プリミティブ型でも問題はない)。

  • パッケージ=PCのフォルダのようなもの
    • カテゴリ分けなどをして小分けにしてまとめる
  • 自分で開発する場合は、機能やカテゴリに応じてパッケージを切って命名
  • パッケージ名にはjavaは使用できない

気になった点。

if文とswitch文の使い分けについて。
  • if文
    • 条件指定をしてtrueまたは falseで条件分岐
    • 条件を上から順に探索
    • 二分岐の場合に適している
      • else if文を何度も記述すべきではない
  • switch文
    • 変数の値によって条件分岐
    • 多分岐の場合に適している
while文とdo-while文の使い分けについて。
  • while文
    • 繰り返し処理が行われる前に条件式が評価される
    • 一度も繰り返し処理が行われない可能性がある
  • do-while文
    • 繰り返し処理が行われた後に条件式が評価される
    • 最低限1回は繰り返し処理を実行
    • 変数に絶対に渡してはならないデータが入ってないかをチェックしたいときに使える
      • 例:割る数が0

今日の反省と明日に向けて。

今日は朝早くから別の用事があり、非常に眠かったが何とか寝落ちせずにPCと対面していた。学習時間は7時間だが、集中できていれば今日の内容も5時間ぐらいで終えたと思う。昨日のメソッドや戻り値に比べれば楽勝だったが、明日からはオブジェクト指向に入るので今晩は夜更かしせずに速攻で寝て、明日に備えたい。

閉じる