ji-3. 条件分岐とプログラム制
御:Javaプログラムの基本構
1
Java プログラミング入門)
URL: https://www.kkaneko.jp/pro/ji/index.html
金子邦彦
内容
例題1.平方根の計算
if 文,else 文,条件分岐,比較演算
例題2.定形郵便物の料金
例題3.2次方程式
多分岐
例題4.直線と原点の距離
比較演算と論理演算の組み合わせ
2
目標
条件分岐if 文)を使って,より役に立つプログ
ラムを作ることができるようになる.
比較演算(<,<=,>,>=,=,<>)の使い方
を理解する
前回習った四則演算Java の標準ライブラリ(指数関
数,対数関数)も使う
3
条件分岐
条件分岐では,条件式成り立てばAを,成り立た
なければBを実行というように分岐する
4
Yes
No
条件式
オンライン開発環境 Online GDB
プログラミングを行えるオンラインのサービス
https://www.onlinegdb.com
ウェブブラウザを使う
たくさんの言語を扱うことができる
Python3, Java, C/C++, C#, JavaScript,
R, アセンブリ言語,SQL など
オンラインなので、「秘密にしたいプログラム」
を扱うには十分な注意が必要
5
Online GDB Java を動かす手順
ウェブブラウザを起動する
次の URL を開く
https://www.onlinegdb.com
6
Language」のところで,「Javaを選ぶ
7
エディタ画面
実行ボタン
プログラムを
書き換えること
ができる
8
if, else
if, else を用いて,「条件式」が成り立てばAを、
成り立たなければB実行するようなプログラムを
書くことができる.
9
Yes
No
条件式
if ( 条件式 ) {
;
;
...
} else {
;
;
...
}
if のみ
if のみを書いて,else を書かないこともできる
条件式」が成り立つときに限りA実行
10
Yes
No
条件式
if ( 条件式 ) {
;
;
...
}
比較演算
比較演算は,条件式を書くときなどに使用
左辺が右辺より小さい
<= 左辺が右辺以下
左辺が右辺より大きい
>= 左辺が右辺以上
== 左辺が右辺と等しい
<> 左辺が右辺と等しくない
11
比較演算の例
12
条件式 x >= 0 は,「x 0 以上」の意味
平方根を求める
次は,平方根を求めるプログラム
-5を与えると,NaN と表示される
これは正常動作.そもそも x の値がマイナスになる
のが想定外 次ページ以降で改良版を示す
13
例題1.平方根の計算
浮動小数点数データを読み込んで,平方根の計算と
表示を行うプログラム
但し,負の数の場合には,「計算できないこと」を意
味するメッセージを表示する
正または0のとき: sqrt() を使って計算できる
負のとき: 「計算できないこと」と,確認の
ために x の値も表示
負であるかどうかによって条件分岐を行うために if
を使う
14
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);
}
}
}
15
条件式
条件が成り立つ場合に実行され
る部分
条件が成り立たない場合に実行
される部分
平方根の計算
16
実行結果の例
x = 9 のときは,平方根が表示される
x = -5 のときは,計算できないという
メッセージと,x の値が表示される
プログラム実行順
17
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 の値
を表示
プログラムとデータ
18
メモリ
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 を使う
19
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");
}
}
}
20
x <= 25 が成り立つ
場合に実行される部分
x <= 25 が成り立たず,
x <= 50 が成り立つ
場合に実行される部分
x <= 25 も成り立たず,
x <= 50 も成り立たない
場合に実行される部分
定形郵便物の料金
21
実行結果の例
定形郵便物の料金
22
Yes
No
x <= 25
x <= 50
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");
}
}
}
23
このうちどれか1つ
が実行される
例題3.2次方程式
2次方程式 ax
2
+ by + c = 0 の解を求めるプログ
ラムを作る
重解虚数解も正しく求めるために,判別式 b
2
-4ac
の値で条件分岐する
a=0」の場合は考えない
24
D = b
2
- 4ac とする
1) 判別式 D > 0 のとき
2) D = 0 のとき
3) D < 0 のとき
25
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));
}
}
}
26
D > 0 のとき
D = 0 のとき
D < 0 のとき
2次方程式
27
実行結果の例
例題4.直線と原点の距離
平面: ax + by + c = 0 原点との距離を求めるプ
ログラムを作成する
但し,a = 0 かつ b = 0 のときには計算を行わない
28
22
ba
c
d
+
=
直線と原点の距離
29
直線 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);
}
}
}
30
条件が成り立つ場合に
実行される部分
条件が成り立たない
場合に実行される部分
直線と原点の距離
31
実行結果の例
条件式
(a == 0) && (b == 0)
32
a=0 である b=0 である
かつ
論理演算
A && B A かつ B
A || B A または B
! A Aでない
真,偽に関する論理的な演算を行う.
33
演習.論理式に関する演習
(1)2次方程式 ax
2
+ by + c = 0 の解を求めるプ
ログラムを作りなさい
例題3のプログラムを書き換えて,a=0 の場合にも,正
しく解を求めるようにしなさい
34
(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
35
演習(1)で行うこと
a = 0 かつ b ≠ 0 のとき
x = - c / b
36
else if ((a == 0) && (b != 0)) {
System.out.printf("x = %8.3f", -c / b);
}
この部分のプログラム例(正解は1つでは無い)