357 Views
February 22, 22
スライド概要
Java プログラミング入門(スライド資料とプログラム例)(全6回)
https://www.kkaneko.jp/pro/ji/index.html
金子邦彦研究室ホームページ
https://www.kkaneko.jp/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
ji-5. 繰り返し計算 (Java プログラミング入門) URL: https://www.kkaneko.jp/cc/ji/index.html 金子邦彦 1
内容 • 例題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とする)を読み込んで,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
自然数の和 sum の値 N = 7 とすると はじめは sum = 0 繰り返し 1回目 繰り返し 2回目 繰り返し 3回目 繰り返し 4回目 繰り返し 5回目 繰り返し 6回目 繰り返し 7回目 繰り返し 8回目 i の値 i=1 i <= 7 が成立する sum = 0 + 1 i=2 i <= 7 が成立する sum = 1 + 2 i=3 i <= 7 が成立する sum = 3 + 3 i=4 i <= 7 が成立する sum = 6 + 4 i=5 i <= 7 が成立する sum = 10 + 5 i=6 i <= 7 が成立する sum = 15 + 6 i=7 i <= 7 が成立する sum = 21 + 7 i=8 i <= 7 が成立しない 14
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
最大公約数の計算 m = 80, n = 35 とすると, 最初の「 r = m % n; 」で, r = 10 になる m の値 繰り返し 1回目 r > 0 が成立する m = 35 n の値 r の値 n = 10 r=5 80, 35 の最大公約数は 35, 10 の最大公約数に等しい 繰り返し 2回目 r > 0 が成立する m = 10 n=5 r=0 35, 10 の最大公約数は 10, 5 の最大公約数に等しい 繰り返し 3回目 r > 0 が成立しない 21
例題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.ド・モアブルの定理 • θを読み込んで,次の値を計算するプログラムを作 る ( cos + i sin ) n cos n + i sin n • なお,i は虚数単位 • ここでは (sinθ+ i cosθ)n を求めるために,while文を用 いた繰り返し計算を行ってみる 30
複素数の積 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 nθ+ i sin nθ (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 nθ+ i sin nθ 」が成 り立つはず • しかし,コンピュータでの計算は,近似計算 • 計算を繰り返す(つまり、計算結果を使った計算) たびに,誤差が積み重なる 36
演習.m から n までの和 • 2つの整数データ(M, Nとする)を読み込んで, MからNまでの和を求めるプログラムを作りなさい 37