5.条件分岐

  1. 流れ図
    流れ図は、処理の流れを図を用いて視覚的に表現したもので、
    フローチャート(flowchart)とも呼ばれる。
    一つの「開始」端子に始まり、基本処理を長方形で、条件分岐をひし形で表し、
    処理の流れを矢印で示し、一つの「終了」端子で終了する。
    処理(process)は一つの入力と出力を持ち、結合子 で順番につなげることができる。
    (結合子に番号等を付けて、直接矢印で接続できない離れた処理と処理を繋ぐこともできる。)
  2. 構造化プログラミング(structured programming)

     構造化プログラミングでは、処理の部分を逐次(順序:Sequence)、条件分岐(選択:Selection)、ループ(反復:Iteration)の三種の構造で置き換える以外の構造を作らない。

  3. プログラム(program)、メソッド(method)
    /* メソッド定義 */
    戻り値の型 メソッド名(引数リスト)
    {
    	処理
    }
    // { } で囲まれたブロック内は
    // インデント(字下げ)する
    // hello world と画面に表示する
    public static void main(String[] args)
    {
    	System.out.println("hello world");
    }
    // インデントして可読性を向上する
  4. 処理(process)
    /* 処理は文 */
    文
    
    /* 最も簡単な文は式の後ろにセミコロン */
    式;
    
    y = a * x + b;
    
     
    /* メソッド呼び出し */
    メソッド名(引数並び);
    
    // hello world と画面に表示する
    System.out.println("hello world");
    
    // 斜辺(hypotenuse)の長さを求める
    z = Math.hypot(x, y);
    
    呼び出されたメソッドの処理が終わったら戻ってきて続きを実行する
    (main以外のメソッドを定義して呼び出して使う例はこちら
  5. 逐次処理(sequential process)

     「処理1」を行なってから、「処理2」を行なう。これもまたひとつの「処理」となる。

    /* 逐次処理 */
    文1
    文2
    
    /* 文が一つしか書けない場所に複数の文を書く方法 */
    {// ひとつの文にする為に、
    	文1 // ブロックの中はインデント(字下げ)する
    	文2 // tabを使えば複数行の縦位置を揃えやすい
    }// 中カッコで囲んでブロック(block)にする
    
    // y = a * x + b を計算する
    y = a * x;
    y = y + b;
    
    // y = a * x + b を計算する
    {
    	y = a * x;
    	y = y + b;
    }
    // ↑↑↑ブロック内をインデントして可読性を向上する
    
  6. 条件分岐(選択型)(conditional branch)

     条件によって流れを変える。

  7. 文字列から文字を取り出す
    char ch = str.charAt(0);
    //文字列str0番目(最初)の文字を変数chに格納する
    
  8. 練習問題
    1. 「賛否を問うプログラム」
      「YesあるいはNoで回答して下さい。」への回答に対して、一文字目が「Y」または「y」ならば賛成、「N」または「n」ならば反対したものとみなして、「賛成ですね?」あるいは「反対ですね?」と画面に表示する(YesNo1.java
      一文字目がy,Y,n,Nの何れでもない場合の処理も適切に考えて仕様を決めること!
      (文字をtoUpperCase()やtoLowerCase()メソッドで大文字や小文字に揃えてから処理する方法もあるが、ここでは用いないこと!)
      例:
      YesあるいはNoで回答して下さい。
      yes
      賛成ですね?
    2. 「閏年の判定プログラム」
      入力した西暦年が閏年か平年かに応じて、「xxxx年は閏年です。」あるいは「xxxx年は平年です。」と画面に表示する(Leap1.java
      (閏年に関してはhttps://www.chugakujuken.com/koushi_blog/ooki/20170309.html等参照のこと)
      例:
      西暦年を入力して下さい。
      2001
      2001年は平年です。

6.繰り返し

  1. ループ(反復型)(loop、iteration)

     同じ処理を繰り返し行なう。

  2. 無限ループ(endless loop、infinite loop)

     ループの継続条件を恒真(常に真)にすると無限ループとなる。

    • whileを使った無限ループ
      while(true)
      {// 無限に繰り返される処理
      
      }
      
    • forを使った無限ループ
      for(;;) // 継続条件を省略する
      {// 無限に繰り返される処理
      
      }
      
  3. 無条件分岐(unconditional branch)
  4. フィルタプログラム
  5. プログラムの強制終了

     コマンドプロンプトで起動したプログラム(コマンド)を強制終了するには、Ctrl+Cキーを押す。 次の様な場合が該当する。

  6. 練習問題
    1. 「バー(棒)を表示するプログラム」
      変数numに初期値で設定した個数の■を横に並べて画面に表示する(Bar1.java
      例:
      長さ10のバーを描きます
      ■■■■■■■■■■
      ヒント:■の画面表示は一つずつ、System.out.print("■");
    2. 「素数の判定プログラム」
      入力した自然数が素数か合成数かに応じて、「1は素数でも合成数でもありません。」、「xxは素数です。」、「xxは、yyの倍数で、合成数です。」、と画面に表示する(Prime1.java
      ここで、yyは1より大きい最小の約数とします。
      例:
      自然数を入力して下さい。
      1
      1は素数でも合成数でもありません。
      自然数を入力して下さい。
      12
      12は、2の倍数で、合成数です。
      自然数を入力して下さい。
      29
      29は素数です。
      ヒント:素数とは1とその数以外に約数を持たない数なので、2以上の自然数で割り切れるがどうかを順番に試す
    3. 「素数の判定プログラム(その2)」
      A. で試除(割り切れるかどうかの確認)の回数を減らす工夫をせよ!(Prime2.java
      ヒント:例えば 101 は素数ですが、2から順に100までの数で割ってみる必要があるでしょうか?
          いま、自然数$A$が$a$で割り切れるとすると$A=ab$と因数分解できます。
          $a\le b$とすると、$A=ab\ge a^2$、即ち、$a\le\sqrt{A}$、ってことは!?
    4. 「長方形(白旗)を表示するプログラム(その1)」
      横(幅)、縦(高さ)のサイズをそれぞれ変数(yoko, tate)に初期値で設定し、そのサイズの長方形を□を並べて画面に表示する(WFlag1.java
      例:
      7×5の長方形を描きます
      □□□□□□□
      □□□□□□□
      □□□□□□□
      □□□□□□□
      □□□□□□□
      ヒント:□の画面表示は一つずつ、System.out.print("□");
    5. 「長方形(白旗)を表示するプログラム(その2)」
      入力されたサイズ(横×縦)の長方形(白旗)を画面に表示する(WFlag2.java
      例:
      サイズ(横)を入力して下さい。
      8
      サイズ(縦)を入力して下さい。
      6
      □□□□□□□□
      □□□□□□□□
      □□□□□□□□
      □□□□□□□□
      □□□□□□□□
      □□□□□□□□
      サイズ(横)を入力して下さい。
      1
      サイズ(縦)を入力して下さい。
      1

      ヒント:□の画面表示は一つずつ、System.out.print("□");
    6. 「長方形を表示するプログラム」
      入力されたサイズ(横×縦)の長方形を画面に表示する(Rect1.java
      横線を"−"、縦線を"|"、四隅を"+"、内部を" "で表し、|から|までが横(幅)、−から−までが縦(高さ)となるようにすること
      例:
      サイズ(横)を入力して下さい。
      8
      サイズ(縦)を入力して下さい。
      6
      +−−−−−−−+
      |       |
      |       |
      |       |
      |       |
      |       |
      +−−−−−−−+
      サイズ(横)を入力して下さい。
      1
      サイズ(縦)を入力して下さい。
      1
      ++
      ++
      ヒント:−等の画面表示は一つずつ、System.out.print("−"); 等で
    7. 「チェッカーフラグ表示プログラム」
      入力されたサイズ(横×縦)のチェッカーフラグ(市松模様)を画面に表示する(CFlag1.java
      例:
      サイズ(横)を入力して下さい。
      8
      サイズ(縦)を入力して下さい。
      6
      ■□■□■□■□
      □■□■□■□■
      ■□■□■□■□
      □■□■□■□■
      ■□■□■□■□
      □■□■□■□■
      サイズ(横)を入力して下さい。
      7
      サイズ(縦)を入力して下さい。
      5
      ■□■□■□■
      □■□■□■□
      ■□■□■□■
      □■□■□■□
      ■□■□■□■
      ヒント:□や■の画面表示は一つずつ、System.out.print("□");System.out.print("■");
      注意:横幅が偶数の場合、奇数の場合等、如何なるサイズに対してもチェッカーフラグ(市松模様)となることを確認せよ
    8. 「スペアー/ストライク表示プログラム」
      入力されたサイズのスペア/ストライク(ボウリングのスコアマーク)を画面に表示する(Spare1.java/Strike1.java
      例:
      サイズを入力して下さい。
      7
      □□□□□□■
      □□□□□■■
      □□□□■■■
      □□□■■■■
      □□■■■■■
      □■■■■■■
      ■■■■■■■
      サイズを入力して下さい。
      8
      □□□□□□□■
      □□□□□□■■
      □□□□□■■■
      □□□□■■■■
      □□□■■■■■
      □□■■■■■■
      □■■■■■■■
      ■■■■■■■■
      サイズを入力して下さい。
      7
      ■□□□□□■
      ■■□□□■■
      ■■■□■■■
      ■■■■■■■
      ■■■□■■■
      ■■□□□■■
      ■□□□□□■
      サイズを入力して下さい。
      8
      ■□□□□□□■
      ■■□□□□■■
      ■■■□□■■■
      ■■■■■■■■
      ■■■■■■■■
      ■■■□□■■■
      ■■□□□□■■
      ■□□□□□□■
      注意:サイズが奇数でも偶数でも正しくスコアマークが表示されることを確認せよ
    9. 「データの最小、最大、平均を計算するプログラム」
      負数が入力されるまで入力された数の最小、最大、平均を計算して表示する(Minmaxave1.java)
      (配列を使ったりして全てのデータを格納しておかなくても実現できます。むしろ今回は配列等は使わないように!)
      例:
      データを入力して下さい。(負数で終了します。)
      1.2
      4.3
      3.8
      -1
      3個のデータが入力されました。
      最小値:1.2、最大値:4.3、平均値:3.1です。

      データを入力して下さい。(負数で終了します。)
      -1
      処理すべきデータが入力されませんでした。
      中級:小数点以下の表示桁数を調整するには System.out.printf() を使えば良い