ji-3. 条件分岐とプログラム制
御:Javaプログラムの基本構
造
1
(Java プログラミング入門)
URL: https://www.kkaneko.jp/pro/ji/index.html
金子邦彦
if文による条件分岐と比較演算・論理演算を用いた、実用的
なJavaプログラムの作成
【学習内容の構成】
1. 条件分岐の基本:if文とelse文による処理の分岐
2. 比較演算:<、<=、>、>=、==、<>を用いた条件式の記
述
3. 多分岐:else ifを用いた複数条件による処理の振り分け
4. 論理演算:&&(かつ)、||(または)、!(でない)によ
る条件式の組み合わせ
• 前提:四則演算、Java標準ライブラリ(Math.sqrt等)の基
本的な使用方法
• 意義:入力値に応じて適切な処理を選択できる実用的なプ
ログラムの構築
2
内容
例題1.平方根の計算
if 文,else 文,条件分岐,比較演算
例題2.定形郵便物の料金
例題3.2次方程式
多分岐
例題4.直線と原点の距離
比較演算と論理演算の組み合わせ
3
目標
• 条件分岐(if 文)を使って,より役に立つプログ
ラムを作ることができるようになる.
• 比較演算(<,<=,>,>=,=,<>)の使い方
を理解する
• 前回習った四則演算,Java の標準ライブラリ(指数関
数,対数関数)も使う
4
条件分岐
条件分岐では,条件式が成り立てばAを,成り立た
なければBを実行というように分岐する
5
Yes
No
B A
条件式
オンライン開発環境 Online GDB
• プログラミングを行えるオンラインのサービス
https://www.onlinegdb.com
• ウェブブラウザを使う
• たくさんの言語を扱うことができる
Python3, Java, C/C++, C#, JavaScript,
R, アセンブリ言語,SQL など
• オンラインなので、「秘密にしたいプログラム」
を扱うには十分な注意が必要
6
Online GDB で Java を動かす手順
① ウェブブラウザを起動する
② 次の URL を開く
https://www.onlinegdb.com
7
③ 「Language」のところで,「Java」を選ぶ
8
エディタ画面
実行ボタン
プログラムを
書き換えること
ができる
9
if, else
if, else を用いて,「条件式」が成り立てばAを、
成り立たなければBを実行するようなプログラムを
書くことができる.
10
Yes
No
B
A
条件式
if ( 条件式 ) {
文;
文;
...
} else {
文;
文;
...
}
B
A
if のみ
• if のみを書いて,else を書かないこともできる
• 「条件式」が成り立つときに限りAを実行
11
Yes
No
A
条件式
if ( 条件式 ) {
文;
文;
...
}
A
比較演算
比較演算は,条件式を書くときなどに使用
< 左辺が右辺より小さい
<= 左辺が右辺以下
> 左辺が右辺より大きい
>= 左辺が右辺以上
== 左辺が右辺と等しい
<> 左辺が右辺と等しくない
12
比較演算の例
13
条件式 x >= 0 は,「x が 0 以上」の意味
平方根を求める
• 次は,平方根を求めるプログラム
• 「-5」を与えると,NaN と表示される
これは正常動作.そもそも x の値がマイナスになる
のが想定外 → 次ページ以降で改良版を示す
14
例題1.平方根の計算
浮動小数点数データを読み込んで,平方根の計算と
表示を行うプログラム
• 但し,負の数の場合には,「計算できないこと」を意
味するメッセージを表示する
正または0のとき: sqrt() を使って計算できる
負のとき: 「計算できないこと」と,確認の
ために x の値も表示
• 負であるかどうかによって条件分岐を行うために if 文
を使う
15
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
double x;
Scanner s = new Scanner(System.in);
System.out.println("Please Enter x =");
x = s.nextDouble();
if (x >= 0) {
System.out.printf("sqrt(x) = %8.3f¥n", Math.sqrt(x));
} else {
System.out.printf("out of range, x = %8.3f¥n", x);
}
}
}
16
条件式
条件が成り立つ場合に実行され
る部分
条件が成り立たない場合に実行
される部分
平方根の計算
17
実行結果の例
x = 9 のときは,平方根が表示される
x = -5 のときは,計算できないという
メッセージと,x の値が表示される
プログラム実行順
18
System.out.println("Please Enter x =");
x = s.nextDouble();
System.out.printf("sqrt(x) = %8.3f¥n", Math.sqrt(x));
メッセージ
「Please Enter x =」を表示
浮動小数点数データを読み込み
平方根を計算し,計算
結果を表示
終わり
Yes
No
条件分岐
x >= 0
System.out.printf("sqrt(x) = %8.3f¥n", Math.sqrt(x));
メッセージと x の値
を表示
プログラムとデータ
19
メモリ
1つの変数
x = s.nextDouble();
x
①
浮動小数点数
データを読み込み
System.out.printf("sqrt(x) = %8.3f¥n", Math.sqrt(x));
③
計算と表示 (x >= 0 のとき)
例題2.定形郵便物の料金
• キーボードから数値を読み込んで,
25 以下なら 「84 Yen」
25 より大きくて50以下なら 「94 Yen」
50より大きいなら 「Too heavy」
と表示するプログラムを作る
• 多分岐を行うために,if 文を使う
20
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
double x;
Scanner s = new Scanner(System.in);
System.out.println("juuryou?");
x = s.nextDouble();
if (x <= 25) {
System.out.println("84 Yen");
} else if (x <= 50 ) {
System.out.println("94 Yen");
} else {
System.out.println("Too heavy");
}
}
}
21
x <= 25 が成り立つ
場合に実行される部分
x <= 25 が成り立たず,
x <= 50 が成り立つ
場合に実行される部分
x <= 25 も成り立たず,
x <= 50 も成り立たない
場合に実行される部分
定形郵便物の料金
22
実行結果の例
定形郵便物の料金
23
Yes
No
C
B
x <= 25
x <= 50
A
Yes
A, B, C のうちどれか1つを実行
No
System.out.println("84 Yen");
System.out.println("94 Yen");
System.out.println("Too heavy");
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
double x;
Scanner s = new Scanner(System.in);
System.out.println("juuryou?");
x = s.nextDouble();
if (x <= 25) {
System.out.println("84 Yen");
} else if (x <= 50 ) {
System.out.println("94 Yen");
} else {
System.out.println("Too heavy");
}
}
}
24
このうちどれか1つ
が実行される
例題3.2次方程式
• 2次方程式 ax
2
+ by + c = 0 の解を求めるプログ
ラムを作る
• 重解,虚数解も正しく求めるために,判別式 b
2
-4ac
の値で条件分岐する
• 「a=0」の場合は考えない
25
D = b
2
- 4ac とする
1) 判別式 D > 0 のとき
2) D = 0 のとき
3) D < 0 のとき
•26
a
Db
a
Db
x
2
,
2
−−+−
=
,
2a
b
x −=
a
Dib
a
Dib
x
2
,
2
−−−−+−
=
異なる2実数解
重解
異なる2虚数解
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
double a, b, c, D;
Scanner s = new Scanner(System.in);
System.out.println("Please Enter a =");
a = s.nextDouble();
System.out.println("Please Enter b =");
b = s.nextDouble();
System.out.println("Please Enter c =");
c = s.nextDouble();
D = b * b - 4 * a * c;
if (D > 0) {
System.out.printf("x = %8.3f, %8.3f¥n",
(-b + Math.sqrt(D)) / (2 * a),
(-b - Math.sqrt(D)) / (2 * a));
} else if (D == 0) {
System.out.printf("x = %8.3f¥n", -b / (2*a));
} else {
System.out.printf("x = %8.3f + %8.3f i, %8.3f - %8.3f i¥n",
-b / (2 * a), Math.sqrt(-D) / (2 * a),
-b /(2 * a), Math.sqrt(-D) / (2 * a));
}
}
}
27
D > 0 のとき
D = 0 のとき
D < 0 のとき
2次方程式
28
実行結果の例
例題4.直線と原点の距離
• 平面: ax + by + c = 0 と原点との距離を求めるプ
ログラムを作成する
• 但し,a = 0 かつ b = 0 のときには計算を行わない
29
22
ba
c
d
+
=
直線と原点の距離
30
直線 ax + by + c = 0
o
x
y
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
double a, b, c, d;
Scanner s = new Scanner(System.in);
System.out.println("Please Enter a =");
a = s.nextDouble();
System.out.println("Please Enter b =");
b = s.nextDouble();
System.out.println("Please Enter c =");
c = s.nextDouble();
if ((a == 0) && (b == 0)) {
System.out.println("a=0 and b=0!");
} else {
d = Math.abs(c) / Math.sqrt(a * a + b * b);
System.out.printf("d = %8.3f¥n", d);
}
}
}
31
条件が成り立つ場合に
実行される部分
条件が成り立たない
場合に実行される部分
直線と原点の距離
32
実行結果の例
条件式
(a == 0) && (b == 0)
33
a=0 である b=0 である
かつ
論理演算
A && B A かつ B
A || B A または B
! A Aでない
真,偽に関する論理的な演算を行う.
34
演習.論理式に関する演習
(1)2次方程式 ax
2
+ by + c = 0 の解を求めるプ
ログラムを作りなさい
例題3のプログラムを書き換えて,a=0 の場合にも,正
しく解を求めるようにしなさい
35
(2)平面 ax + by + cz + d = 0 と原点の距離を求
めるプログラムを作りなさい
演習(1)で行うこと
• a = 0 かつ b = 0 かつ c = 0 のとき
「すべての x が解である」と表示
• a = 0 かつ b = 0 かつ c ≠0 のとき
「解なし」と表示
• a = 0 かつ b ≠ 0 のとき
x = - c / b
36
演習(1)で行うこと
• a = 0 かつ b ≠ 0 のとき
x = - c / b
37
else if ((a == 0) && (b != 0)) {
System.out.printf("x = %8.3f", -c / b);
}
この部分のプログラム例(正解は1つでは無い)