「アルゴリズム」という用語は JIS X0001 で以下のように定義されている。

制御の流れ
「アルゴリズム」という用語は JIS X0001 で以下のように定義されている。
「問題を解くためのものであって、明確に定義され、順序付けられた有限個の規則からなる集合」
コンピュータに仕事をさせるためにはまず、アルゴリズムを考え、プログラミングを行い、コンパイラを用
いて機械語に翻訳してコンピュータに実行させる必要がある。アルゴリズムには大きく分けて 3 つの処理の流
れがある。それらは「順次処理」
、
「条件判断処理」
、
「ループ処理」という。
ここまでに標準入出力、変数、算術演算などを使ったプログラミングを習った。ここまでに示したプログラ
ムの処理の流れは全て上から下へと実行されていくことを思い出して欲しい。この処理の流れは「順次処理(順
次構造)
」と呼ばれている。
課題のプログラムでは三角形の底辺と高さを読み込んで面積を求めるプログラムを作成してもらった。これ
は入力した値が 0 以下だった場合には面積が得られない。本来ならば入力した値が正しいかどうかチェックし、
正しくなければ「入力した値が正しくありません」などと表示して、ユーザに知らせる必要があるだろう。プ
ログラムではある条件を判定することによって処理を分岐させる方法が用意されている。この処理を「条件判
断処理(または分岐処理、分岐構造)
」などと言う。
また、買い物をした商品の価格と個数から合計金額を求めるプログラムを考えるとしよう。商品が 100 個や
1000 個になった場合はどうすれば良いだろうか。順次処理しかなければ、コピーして貼り付けをし、修正を
行う作業を 100 回も 1000 回も行わなくてはならない。可能ではあるが大変面倒である。このように似たよう
な処理を繰り返す場合、プログラムでは「ループ処理(または繰り返し処理、反復処理、反復構造)
」を利用
することで簡潔にプログラミングを行うことができる。
本日はまず、アルゴリズムを図で表現するものとして、
「フローチャート(流れ図)
」を紹介し、条件判断処
理の使い方を学習していく。
フローチャート
「フローチャート」はアルゴリズムを一目で分かるように図式化したものである。アルゴリズムを図式化し
たチャートは他にも NS チャート、PAD などがあるがフローチャートが一般的である。ただし、フローチャー
トは実際の開発現場でプログラミングに利用するには適していない。実際に開発現場で作成されるプログラム
は現在の練習用のプログラムに比べ、規模が大きくなる。具体的なアルゴリムを示すフローチャートを作成す
る手間は、プログラムを作成する以上の手間があり、しかも2度手間である。そのため、実際の開発現場では、
どのような仕様や設計方法にするかを定めてからプログラムを作成していくことになる。しかしながら、フロ
ーチャートが有効なのはプログラムの初心者に処理の流れを把握させるためや基本情報処理技術者などの資
格試験問題として出題されるので、学ぶ価値がある。
フローチャートの記号は日本工業規格(JIS)で定められている。
表 1 にフローチャートで用いられる主な記号
を示す。この他にも多くの記号が存在するが、記号の内部に処理の内容が記述されるので、直感的にわかりや
すい。フローの最初と最後は「端末」を用いて明記し、処理の流れは原則として、
「上から下」
、
「左から右」と
なる。逆行する場合や強調したい場合は矢印をつける。処理の流れを誤解されないように、線は交差させては
いけない。
表 1 フローチャートで用いられる主な記号
記 号
名称
説
明
記 号
名称
フローチャートの開始
端末
線
と終了を表す。
-1-
説
明
データや制御の流れを表す。流
れの方向を明示したいときは矢
印を付ける。
処理
判断
任意の処理(計算、代入
など)を表す。記号中に
処理内容を書く。
一つの入口と複数の出
口を持ち、記述された条
件を判断して出口を選
ぶ。
ループの開始と終了を表す。記
号のどちらかに終了条件を書
く。また、必要に応じてループ
ループ
名を書く。
端
処理の構造
フローチャートは基本的に3つの構造を組み合わせてアルゴリズムを記述する。
順次
処理が上から下に順番に並んでいる構造。
int main(void)
{
syoriA( ); /*処理A*/
syoriB( ); /*処理B*/
開始
処理A
処理B
return 0;
}
終了
図1 順次
選択
条件によって処理が分岐する構造。条件は「yes(または true、真など)」か「no(または false、偽など)」
で表す。分岐する形式によって「二分岐型」と「多分岐型」に分けることができる。Java では「if 文」
、
「switch
文」がこれにあたる。
開始
no
条件式
yes
処理A
処理B
終了
int main(void)
{
if(条件式)
{
syoriA( );
}
else
{
syoriB( );
}
図2 選択
/*処理A*/
/*処理B*/
return 0;
}
繰り返し
条件を満たしている間は処理を繰り返して実行する構造。Java では「while 文」
、
「for 文」
、
「do-while 文」
がこれに当たる。条件を判定する位置によって「前判定型」と「後判定型」に分けることができる。
前判定型:処理を実行する前に条件の判定を行う。条件を満たさない場合には一度も処理を
行わない場合もある。
後判定型:処理を実行してから条件の判定を行う。そのため、どのような条件でも一度は必ず
処理を行う。
-2-
開始
終了条件
開始
ループ
終了条件
yes
no
処理
処理
ループ
終了
終了
図3 前判定型
開始
開始
ループ
処理
終了条件
yes
処理
no
ループ
終了条件
終了
終了
図4 後判定型
条件式
条件分岐の具体的な処理を説明する前に条件の記述方法を説明する。以前、例題として 2 つの値を入力とし
て四則演算を行うプログラムを示した。プログラムの割り算では 0 で割ることができない。そのため、以下の
ような判定を行う必要がある。
if(b != 0) c = a / b;
この文は「変数 b が 0 で無いならば、変数 a を変数 b で割り、結果を変数 c に格納する」という意味になる。
この条件「b != 0」は条件式といい、その結果は true(真)か false(偽)のどちらかになる。条件式が成り
立つかどうかを調べ、真偽を決定することを「条件式を評価する」という。条件式では、
=(等しい)
、  (等しくない)
、  (以上)
、  (以下)
、>(大なり)
、<(小なり)
などの関係を比較することができる。Java ではそれぞれ
「==」
、
「!=」
、
「>=」
、
「<=」
、
「>」
、
「<」
と書く。これらを総称して「関係演算子」という。関係演算子の一覧を表 2 に示す。
-3-
表 2 関係演算子一覧表
関係演算子
数学的表現
意味
プログラムでの表現
その意味
==
=
等号
a == b
a と b は等しい
!=
不等号
a != b
a と b は等しくない
以上
a >= b
a は b 以上である
<=



以下
a <= b
a は b 以下である
>
>
大なり
a > b
a は b よりも大きい
<
<
小なり
a < b
a は b よりも小さい
>=
ここでは関係演算子として示したが、
「==」や「!=」は特に等価演算子と呼ぶ場合もある。また、 また、
「b !=
0」や「c = a + b」において、a、b、c、0 のことを「オペランド」と呼ぶ。式は演算子とオペランドで構成
される。条件式は式を利用して「a != b + 10」といった比較も可能である。
条件判断処理
if 文
それでは条件判断処理の具体的な処理を見ていこう。まずは if 文である。if 文は条件式が真だった場合に
指定した処理を行う。偽の場合には指定した処理を行わず、次の処理に移る。以下に書式とプログラム例を示
す。
書式
if(条件式)
{
文;
}
偽
条件式
真
文
図5 if 文
プログラム例1
import java.util.Scanner;
public class Prog04_01
{
public static void main(String[ ] args)
{
Scanner stdIn = new Scanner(System.in);
System.out.print("整数を入力してください:");
int a = stdIn.nextInt();
-4-
if(a < 0)
{
a *= -1;
}
System.out.println("入力した値の絶対値は" + a + "です");
}
}
出力例(斜体はキーボードから入力した値)
整数を入力してください:-5
入力した値の絶対値は5です
注: a *= -1; は a = a*(-1);と同じ処理である。この省略した表記方法は他に以下のものなどがある。
省略表記
同じ処理
a++;
a = a + 1;
a--;
a = a - 1;
a += b;
a = a + b;
a -= b;
a = a - b;
a *= b;
a = a * b;
a /= b;
a = a / b;
a %= b;
a = a % b;
{ }で囲まれた部分をブロックという。このブロック内の文が 1 つだけの場合には以下のように{ }を省略する
ことができる。この例では条件式が真の場合だけ文1が実行される。文2については通常の順次処理が行われ
るので条件式の真偽に関わらず必ず実行される。しかし、慣れないうちは{ }を省略しないほうが無難である。
また、どこが if 文であるのかわかりやすいように字下げ(インデント)を行う方が良い。
書式
if(条件式)
文 1;
文 2;
if-else 文
if 文は分岐の数によって多少書き方が変わる。ここでは条件式が真の場合と偽の場合とで異なる処理を行う
if-else 文を紹介する。条件式が真のときには文1が処理され、偽のときに文2が処理される。つまり条件に
従って文1か文2のどちらかを実行させたい場合に用いる。この場合も、ブロック{ }内の文が 1 つのみの
場合は、
{ }を省略することができる。
書式
if(条件式)
{
文 1;
}
-5-
else
{
文 2;
}
偽
条件式
真
文1
文2
図6 if-else 文
プログラム例2
import java.util.Scanner;
public class Prog04_02
{
public static void main(String[ ] args)
{
Scanner stdIn = new Scanner(System.in);
System.out.print("整数を入力してください:");
int a = stdIn.nextInt();
if(a % 2 == 0)
{
System.out.println("入力した値は偶数です");
}
else
{
System.out.println("入力した値は奇数です");
}
}
}
出力例(斜体はキーボードから入力した値)
整数を入力してください:5
入力した値は奇数です
if-else if-else 文
複数の分岐を行いたい場合に用いる。以下の例では、条件式 1 が真のとき文 1 が実行される。条件式 1 が偽
のときには条件式 2 を評価し、真のとき文 2 が実行される。このように次々と条件式を評価していき、すべて
の条件式が偽であった場合は最後の else 文のブロック内の文 m が実行される。else if 文はいくつでも設定で
き、多分岐(多方向分岐)を行うことが可能である。また、最後の else 文が不要な場合は省略することができる。
-6-
最後の else 文を省略すると、すべての条件式の評価が偽となった場合には、この構文で実行される文は無いこ
とになる。
書式
if(条件式 1)
{
文 1;
}
else if(条件式 2)
{
文 2;
}
else if(条件式 3)
{
文 3;
}
:
:
else if(条件式 n)
{
文 n;
}
else
{
文 m;
}
真
条件式1
文1
偽
真
条件式2
文2
偽
真
条件式3
文3
・・・
偽
真
条件式n
文n
偽
文n
図7 if-else if-else 文
-7-
プログラム例3
import java.util.Scanner;
public class Prog04_03
{
public static void main(String[ ] args)
{
Scanner stdIn = new Scanner(System.in);
System.out.print("整数を入力してください:");
int a = stdIn.nextInt();
if(a < 0)
{
System.out.println("入力した値は負です");
}
else if(a > 0)
{
System.out.println("入力した値は正です");
}
else
{
System.out.println("入力した値は0です");
}
}
}
出力例(斜体はキーボードから入力した値)
整数を入力してください:5
入力した値は正です
switch 文
式と定数式との間で値が一致するか評価し、
一致した定数式の case 部分にジャンプして対応する文を処理す
る。
break 文が実行されると switch 文全体を終了する。
また、
どの case の定数式とも一致しない場合は default
部分に記述された文が実行される。default 部は不要なら省略できる。式には変数や計算式を使うことができ
る。定数式には整数、または文字を記述することができるが、実数や変数名、文字列は使えない。
書式
switch(式)
{
case 定数式1;
文1;
break;
case 定数式2;
文2;
-8-
break;
case 定数式3;
文3;
break;
:
:
default;
文 n;
break;
}
真
break
式==定数式1
文1
偽
真
break
式==定数式2
文2
偽
真
break
式==定数式3
文3
・・・
偽
default
break
文n
図8 switch 文
プログラム例4
import java.util.Scanner;
public class Prog04_04
{
public static void main(String[ ] args)
{
Scanner stdIn = new Scanner(System.in);
System.out.print("1から3の範囲で値を入力してください:");
int a = stdIn.nextInt();
switch(a)
{
case 1:
System.out.println("入力した値は1です");
break;
-9-
case 2:
System.out.println("入力した値は2です");
break;
case 3:
System.out.println("入力した値は3です");
break;
default:
System.out.println("範囲内の値を入力してください");
}
}
}
出力例(斜体はキーボードから入力した値)
整数を入力してください:3
入力した値は3です
また、break 文は省略することができる。その場合の書式とフローチャートは以下のようになる。
書式
switch(式)
{
case 定数式1;
文1;
case 定数式2;
文2;
case 定数式3;
文3;
:
:
default;
文 n;
}
- 10 -
真
式==定数式1
文1
偽
真
式==定数式2
文2
偽
真
式==定数式3
文3
偽
:
default
文n
図9 break を省略した switch 文
演習
プログラム例1~4を作成し、出力を確認しなさい。また、プログラム例4の switch 文の使用例において、
break 文を全てコメントアウトした場合にどのような出力になるか確認しなさい。
課題2
Kadai2-1 以下のプログラムは商品の価格と個数を入力し、合計金額を求め、支払いを促し、お釣りを表示す
るプログラムである。このプログラムについて、if-else 文を用いて、支払いの金額と合計金額を比較し、合
計金額以上ならば、お釣りを表示し、不足した場合には「お金が足りません」と表示しなさい。
import java.util.Scanner;
public class Kadai02_01
{
public static void main(String[ ] args)
{
Scanner stdIn = new Scanner(System.in);
System.out.print("商品1の価格を入力してください:");
int x = stdIn.nextInt();
System.out.print("商品1の個数を入力してください:");
int a = stdIn.nextInt();
System.out.print("商品2の価格を入力してください:");
int y = stdIn.nextInt();
System.out.print("商品2の個数を入力してください:");
int b = stdIn.nextInt();
System.out.print("商品3の価格を入力してください:");
int z = stdIn.nextInt();
System.out.print("商品3の個数を入力してください:");
int c = stdIn.nextInt();
int sum = (int)(1.05 * (x*a + y*b + z*c));
- 11 -
System.out.println("合計金額(税込み)は:" + sum + "円です\n");
System.out.print("支払い金額を入力してください:");
int money = stdIn.nextInt();
System.out.println("お釣りは" + (money - sum) + "円です");
}
}
変更後の出力例(斜体はキーボードから入力した値)
商品 1 の価格を入力してください:130
商品 1 の個数を入力してください:3
商品 2 の価格を入力してください:300
商品 1 の個数を入力してください:4
商品 3 の価格を入力してください:250
商品 3 の個数を入力してください:1
合計金額(税込み)は 1932 円です
支払金額を入力してください:1000
お金が足りません
Kadai2-2 以下のプログラムは身長と体重を入力し、BMI を計算して表示するプログラムである。BMI とは
Body Mass Index の略で肥満度の指標であり、身長と体重を用いて以下の式から計算される。
BMI = 体重[kg]÷(身長[m]×身長[m])
このプログラムについて、if-else if-else 文を用いて変更する。提示したプログラムでは BMI を計算し、結
果を次のように表示する。
「あなたの BMI は 22.3 です。25 を超えると注意してください。」この「25 を超えると注
意してください。」の部分を条件分岐で以下のように表示を変える。
0 未満
入力に間違いがあります
18.5 未満
やせ気味です
25 未満
標準の範囲です
30 未満
肥満気味です
それ以外
だいぶ肥満です
import java.util.Scanner;
public class Kadai02_02
{
public static void main(String[ ] args)
{
Scanner stdIn = new Scanner(System.in);
System.out.println("BMIを計算します");
System.out.print("体重[kg]を入力してください:");
double w = stdIn.nextDouble();
- 12 -
System.out.print("身長[m]を入力してください:");
double h = stdIn.nextDouble();
System.out.printf("\nBMI = %.1f[kg] ÷ (%.2f[m] × %.2f[m]) で計算します\n",
w , h, h);
double bmi = w / (h * h);
System.out.printf("あなたのBMIは%.1fです\n", bmi);
System.out.println("25を超えると注意してください");
}
}
変更後の出力例(斜体はキーボードから入力した値)
BMI を計算します
体重[kg]を入力してください:75.6
身長[m]を入力してください:1.84
BMI = 75.6[kg] ÷(1.84[m]×1.84[m])で計算します
あなたの BMI は 22.3 です
標準の範囲です
Kadai2-3 switch 文を用いてコンピュータとじゃんけんするプログラムを作成しなさい。まず、キーボードか
ら 0~2 を入力させ、その値を用いて switch 文で条件分岐させて入力者の手(グー、チョキ、パー)を表示す
る。次に 0~2 の乱数を生成して、switch 文で条件分岐させてコンピュータの手を表示する。
余力がある人は if-else if-else 文で勝敗の判定を行って「あなたの勝ちです」などと表示してみること。
出力例(斜体はキーボードから入力した値)
グー(0)、チョキ(1)、パー(2)で入力してください:1
あなたはチョキを出しました
コンピュータはグーを出しました
課題2は続きがあるので、締め切りは後で提示する。
- 13 -