ji-5. Javaプログラミングにお
ける繰り返し処理と数値計算
の基礎
1
Java プログラミング入門)
URL: https://www.kkaneko.jp/pro/ji/index.html
金子邦彦
内容
例題1.自然数の和
例題2.最大公約数の計算
例題3.ベクトルの長さ
while
例題4.九九の表
for 文と繰り返しの入れ子
例題5.ド・モアブルの公式
計算誤差の累積
2
目標
繰り返しwhile , for 文)を使って,繰り返し
計算を行えるようになること
ループカウンタとして,整数の変数を使うこと
見やすいプログラムを書くために,字下げを行う
3
繰り返しとは
繰り返しとは,ある条件が満たされるまで,同じ
ことを繰り返すこと.
繰り返しを行うための文としてwhile, for
どがある.
4
繰り返しの例
ユークリッドの互助法
m n の最大公約数を求めるために,「割った余りを
求めること」を,余りが0になるまで繰り返す
九九の表
九九の表を求めるために,掛け算を81回繰り返す
5
オンライン開発環境 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
例題1.自然数の和
整数データ(とする)を読み込んで,からN
までの和を求めるプログラムを作る
ここでは,練習のため,自然数の和の公式は使わ
ずに,while文を用いる
例) 100 → 5050
10
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int N, sum, i;
Scanner s = new Scanner(System.in);
System.out.println("Please Enter N =");
N = s.nextInt();
sum = 0;
i = 1;
while(i <= N) {
sum = sum + i;
i = i + 1;
}
System.out.printf("goukei = %d¥n", sum);
}
11
繰り返し実行される
部分
条件式
自然数の和
12
実行結果の例
繰り返し処理の中身
繰り返しの前
i = 1 sum = 0 を実行
繰り返しの各ステップでなされること
1. sum i を足しこむ
sum」には,その時点での「1から i 」までの和
が入る
2. i の値を1増やす
繰り返しの終了条件
i <= N 成り立たなくなったら終了
つまり i > N になったら終了
13
自然数の和
14
N = 7 とすると
i <= 7 が成立する
sum = 0 + 1
i <= 7 が成立する
sum = 1 + 2
i <= 7 が成立する
sum = 3 + 3
i <= 7 が成立する
sum = 6 + 4
i <= 7 が成立する
sum = 10 + 5
i <= 7 が成立する
sum = 15 + 6
i <= 7 が成立する
sum = 21 + 7
i <= 7 が成立しない
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
繰り返し
1回目
繰り返し
2回目
繰り返し
3回目
繰り返し
4回目
繰り返し
5回目
繰り返し
6回目
繰り返し
7回目
繰り返し
8回目
sum の値
i の値
はじめは sum = 0 i = 1
while
何かの処理の繰り返し
繰り返しのたび while 文で書かれた条件式の真
偽が判定され, 真である限りwhile のあとに続
く文が実行され続ける
15
例題2.最大公約数の計算
2つの整数データを読み込んで,最大公約数を求
めるプログラムを作る.
ユークリッドの互助法を用いること
ユークリッドの互助法を行うために while 文を使い,
余りを求めること繰り返す
例) 20, 12 のとき: 4
16
ユークリッドの互助法
最大公約数を求めるための手続き
m, n の最大公約数は,
m n とすると,
m n で割った余り = 0 なら,最大公約数は n
m n で割った余り > 0 なら,m n の最大公約
数は, m n で割った余り」 n の最大公約数に等
しい
なお,n m n で割った余り」 が成り立つ)
17
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int m, n, r;
Scanner s = new Scanner(System.in);
System.out.println("Please Enter m =");
m = s.nextInt();
System.out.println("Please Enter n =");
n = s.nextInt();
r = m % n;
while(r > 0) {
m = n;
n = r;
r = m % n;
}
System.out.printf("GCD = %d¥n", n);
}
}
18
条件が成り立つ限り,
実行されつづける部分
条件式
最大公約数の計算
19
実行結果の例
繰り返し処理の中身
繰り返しの前
r = m % n を実行(m n で割った余りが r に入る)
繰り返しの各ステップでなされること
m = n;
n = r;
r = m % n;
を実行(m, n, r の値は小さくなっていく)
繰り返しの終了条件
r 0 になったら終了
20
最大公約数の計算
21
m = 80, n = 35 とすると,
最初の「 r = m % n; 」で, r = 10 になる
r > 0 が成立する
m = 35 n = 10 r = 5
r > 0 が成立する
m = 10 n = 5 r = 0
r > 0 が成立しない
繰り返し
1回目
繰り返し
2回目
繰り返し
3回目
m の値
n の値
r の値
80, 35 の最大公約数は
35, 10 の最大公約数に等しい
35, 10 の最大公約数は
10, 5 の最大公約数に等しい
例題3.総和と平均
データ x1, x2, ... xk を1つづつ読み込んで,合計
と平均を求めるプログラムを作成す
負の数が入力されたら終了する
整数のデータ 1, 2, 3 に対して
1
2
3
-1
22
入力
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int sum, i, x;
sum = 0;
i = 0;
Scanner s = new Scanner(System.in);
System.out.printf("Please Enter x[%d] =", i);
x = s.nextInt();
while(0 <= x) {
sum = sum + x;
i = i + 1;
System.out.printf("Please Enter x[%d] =", i);
x = s.nextInt();
}
System.out.printf("sum = %d¥n", sum);
System.out.printf("%d / %d = %d", sum, i, sum / i);
}
}
23
条件が成り立つ限り,
実行されつづける部分
条件式
総和と平均
24
実行結果の例
繰り返し処理の中身
繰り返しの前
sum = 0 i = 0 を実行
X0 読み込む
繰り返しの各ステップでなされること
1. sum Xi を足しこむ
sum」には,その時点での「X0から Xi 」までの和
が入る
2. i の値を1増やす
3. Xi 読み込む
繰り返しの終了条件
Xi < 0 ならば終了
25
例題4.九九の表
九九の表を表示するプログラムを作成する
九九の表を表示するために,繰り返しの入れ子を使う
26
public class Main
{
public static void main(String[] args) {
int i, j;
for(i = 1; i <= 9; i++) {
System.out.printf("%3d:", i);
for(j = 1; j <= 9; j++) {
System.out.printf("%3d", i * j);
}
System.out.println("");
}
}
}
27
繰り返し
実行される部分
実行結果画面(例)
28
for
29
例題5.ド・モアブルの定理
θを読み込んで,次の値を計算するプログラムを
なお,i は虚数単位
ここでは (sinθ+ i cosθ)n を求めるために,while文を用
いた繰り返し計算を行ってみる
30
( )
n
i
sincos +
nin sincos +
複素数の積
z1 = x1 + i y1
z2 = x2 + i y2 のとき
z1 z2 = (x1 + i y1) (x2 + i y2 )
= x1x2 + x1i y2 + i y1x2 + i y1i y2
= x1x2 - y1y2 + i (x1y2 + y1x2 )
31
実数部 虚数部
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int n, j;
double x1, y1, x2, y2, theta;
Scanner s = new Scanner(System.in);
System.out.println("Please Enter n =");
n = s.nextInt();
System.out.println("Please Enter theta =");
theta = s.nextFloat();
x1 = Math.cos(theta);
y1 = Math.sin(theta);
x2 = x1;
y2 = y1;
j = 1;
while(j <= n) {
System.out.printf("(cos theta + i sin theta)%d = %8.3f + i%8.3f¥n", j, x1, y1);
System.out.printf("cos %d theta + i sin %d theta = %8.3f + i %8.3f¥n", j, j,
Math.cos(j * theta), Math.sin(j * theta));
x1 = x1 * x2 - y1 * y2;
y1 = x1 * y2 + x2 * y1;
j = j + 1;
}
}
}
32
繰り返し実行される
部分
条件式
実行結果
33
繰り返し処理の中身
繰り返しの前
を実行
繰り返しの各ステップでなされること
を実行 x1 実数部y1 虚数部
34
(cosθ+ i sinθ)
n
= cos + i sin
(cosθ+ i sinθ)
2
= cos2θ- sin2θ+ 2i cosθsin θ
= cos2θ+ i sin2θ
(cosθ+ i sinθ)
3
= (cosθ+ i sinθ)
2
(cosθ+ i sinθ)
= (cos2θ+i sin2θ) (cosθ+ i sinθ)
= cos2θcosθ- sin2θsinθ
+ i (cos2θsinθ- sin2θcosθ)
= cos (2θ+θ) + i sin (2θ+θ)
= cos3θ+ i sin3θ
(以下同様に考える.数学的帰納法で証明できる)
35
計算結果から分かること
本来なら「 (cosθ+ i sinθ)
n
= cos + i sin 」が成
り立つはず
しかし,コンピュータでの計算は,近似計算
計算を繰り返す(つまり、計算結果を使った計算
たびに,誤差が積み重なる
36
演習.m から n までの
2つの整数データ(M, Nとする)を読み込んで,
MからNまでの和を求めるプログラムを作りなさい
37