>100 Views
February 03, 22
スライド概要
(Pascal プログラミング入門)
URL: https://www.kkaneko.jp/cc/pascal/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
pe-5. 繰り返し計算 (Pascal プログラミング入門) URL: https://www.kkaneko.jp/cc/pascal/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 • ウェブブラウザを使う • たくさんの言語を扱うことができる Pascal, Python3, Java, C/C++, C#, JavaScript, R, アセンブリ言語,SQL など • オンラインなので、「秘密にしたいプログラム」 を扱うには十分な注意が必要 6
Online GDB で Pascal を動かす手順 ① ウェブブラウザを起動する ② 次の URL を開く https://www.onlinegdb.com 7
③ 「Language」のところで,「Pascal」を選ぶ 8
実行ボタン エディタ画面 プログラムを 書き換えること ができる 9
例題1.自然数の和 • 整数データ(Nとする)を読み込んで,1からN までの和を求めるプログラムを作る • ここでは,練習のため,自然数の和の公式は使わ ずに,while文を用いる 例) 100 → 5050 10
program sum; var N, i, s: integer; begin write('sum [1..N] Program. Please Enter N: '); readln(N); s := 0; i := 1; 条件式 while i <= n do begin s := s + i; 繰り返し実行される 部分 i := i + 1; end; writeln('sum[1..n] = ', s:8); readln end. 11
自然数の和 実行結果の例 12
プログラム実行順 s := 0; i := 1; i <= N Yes No s := s + i; i := i + 1; 13
繰り返し処理の中身 • 繰り返しの前 i := 1 と S := 0 を実行 • 繰り返しの各ステップでなされること 1. 「S」 に 「i」 を足しこむ → 「S」には,その時点での「1から i 」までの和 が入る 2. 「i」 の値を1増やす • 繰り返しの終了条件 i <= N が成り立たなくなったら終了 → つまり i > N になったら終了 14
自然数の和 N = 7 とすると 繰り返し 1回目 繰り返し 2回目 繰り返し 3回目 繰り返し 4回目 繰り返し 5回目 繰り返し 6回目 繰り返し 7回目 繰り返し 8回目 i の値 s の値 はじめは s = 0 i=1 i <= 7 が成立する s=0+1 i=2 i <= 7 が成立する s=1+2 i=3 i <= 7 が成立する s=3+3 i=4 i <= 7 が成立する s=6+4 i=5 i <= 7 が成立する s = 10 + 5 i=6 i <= 7 が成立する s = 15 + 6 i=7 i <= 7 が成立する s = 21 + 7 i=8 i <= 7 が成立しない 15
while 文 • 何かの処理の繰り返し • 繰り返しのたびに while 文で書かれた条件式の真 偽が判定され, 真である限り,while のあとに続 く文が実行され続ける. while 条件式 do begin 式1; 式2; ... 条件式 No Yes 式1 式2 ... end 16
例題2.最大公約数の計算 • 2つの整数データを読み込んで,最大公約数を求 めるプログラムを作る. • ユークリッドの互助法を用いること • ユークリッドの互助法を行うために while 文を書く 例) 20, 12 のとき: 4 17
ユークリッドの互助法 • 最大公約数を求めるための手続き • m,nの最大公約数は, • m ≧ n とすると, • 「m をn で割った余り」 = 0 なら,最大公約数は n • 「m をn で割った余り」 > 0 なら,m と n の最大公約 数は, 「m をn で割った余り」 と n の最大公約数に等 しい ( なお,n > 「m をn で割った余り」 が成り立つ) 18
program sum; var r, m, n: integer; begin write('GCD Program. Please Enter m: '); readln(m); write('Please Enter n: '); 条件式 readln(n); r := m mod n; while r > 0 do begin m := n; n := r; 条件が成り立つ限り, 実行されつづける部分 r := m mod n; end; writeln('GCD = ', n:8); readln end. 19
最大公約数の計算 実行結果の例 20
プログラム実行順 r := m % n; r>0 No Yes m := n; n := r; r := m mod n; 21
繰り返し処理の中身 • 繰り返しの前 r := m mod n を実行(m を n で割った余りが r に入る) • 繰り返しの各ステップでなされること m := n; n := r; r := m mod n; を実行(m, n, r の値は小さくなっていく) • 繰り返しの終了条件 r が 0 になったら終了 22
最大公約数の計算 m = 80, n = 35 とすると, 最初の「 r = m mod n; 」で, r = 10 になる m の値 繰り返し 1回目 r > 0 が成立する m = 35 n の値 n = 10 r の値 r=5 80, 35 の最大公約数は 35, 10 の最大公約数に等しい 繰り返し 2回目 r > 0 が成立する m = 10 n=5 r=0 35, 10 の最大公約数は 10, 5 の最大公約数に等しい 繰り返し 3回目 r > 0 が成立しない 23
例題3.総和と平均 • データ x1, x2, ... xk を1つづつ読み込んで,合計 と平均を求めるプログラムを作成す • 負の数が入力されたら終了する 整数のデータ 1, 2, 3 に対して 1 2 入力 3 -1 24
program sum; var x, s: real; var i: integer; begin s := 0; i := 0; 条件式 write('Please Enter x[', i:3, ']: '); readln(x); while 0 <= x do begin s := s + x; i := i + 1; 条件が成り立つ限り, 実行されつづける部分 write('Please Enter x[', i:3, ']: '); readln(x); end; writeln('sum =', s:8:3); writeln('average =', (s/i):8:3); readln end. 25
総和と平均 実行結果の例 26
プログラム実行順 s := 0; i := 0; write('Please Enter x[', i:3, ']: '); readln(x); Yes 0 <= x No s := s + x; i := i + 1; write('Please Enter x[', i:3, ']: '); readln(x); 27
繰り返し処理の中身 • 繰り返しの前 S := 0 と i := 0 を実行 X0 を読み込む • 繰り返しの各ステップでなされること 1. 「S」 に 「Xi」 を足しこむ → 「S」には,その時点での「X0から Xi 」までの和 が入る 2. 「i」 の値を1増やす 3. Xi を読み込む • 繰り返しの終了条件 Xi < 0 ならば終了 28
演習1.m から n までの和 • 2つの整数データ(M, Nとする)を読み込んで, MからNまでの和を求めるプログラムを作りなさい • while 文を使いなさい.例題1のプログラムを参考にし なさい 29
例題4.九九の表 • 九九の表を表示するプログラムを作成する • 九九の表を表示するために,繰り返しの入れ子を使う 30
program sum; uses SysUtils; var i, j: integer; 繰り返し実行される部分 begin for i := 1 to 9 do begin write( i:3, ':' ); for j := 1 to 9 do begin write( (i*j):3 ); end; writeln; end; readln end. 31
実行結果画面(例) 32
繰り返しの入れ子 33
九九の表 i := 1 i <= 9 Yes j := 1 No j <= 9 No Yes 九九の表を表示 i := i + 1; j := j + 1; 34
for 文 for 変数名 := 初期値 to 終了値 do begin 式1; 式2; ... end 35
例題5.ド・モアブルの定理 • θを読み込んで,次の値を計算するプログラムを作 る ( cos + i sin ) n cos n + i sin n • なお,i は虚数単位 • ここでは (sinθ+ i cosθ)n を求めるために,while文を用 いた繰り返し計算を行ってみる 36
複素数の積 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 ) 実数部 虚数部 37
program sum;
var j, n: integer;
var x1, y1, x2, y2, theta: real;
begin
write('Please Enter n: ');
readln(n);
write('Please Enter theta: ');
readln(theta);
x1 := cos(theta);
y1 := sin(theta);
x2 := x1;
y2 := y1;
条件式
繰り返し実行される
部分
j := 1;
while j <= n do begin
writeln( '(cos theta + i sin theta)', j, '=', x1:8:3, '+ i ', y1:8:3 );
writeln( 'cos', j, 'theta + i sin', j, 'theta =', cos( j * theta ):8:3, sin( j * theta ):8:3 );
x1 := x1 * x2 - y1 * y2;
y1 := x1 * y2 + x2 * y1;
j := j + 1;
end;
readln
end.
38
実行結果画面(例) 39
繰り返し処理の中身 • 繰り返しの前 x1 := cos θ y1 := sin θ x2 := x1 y2 := y1 を実行 • 繰り返しの各ステップでなされること x1 := x1 * x2 - y1 * y2 y1 := x1 * y2 + x2 * y1; を実行 (x1 が実数部,y1 が虚数部) 40
(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θ (以下同様に考える.数学的帰納法で証明できる) 41
計算結果から分かること • 本来なら「 (cosθ+ i sinθ)n = cos nθ+ i sin nθ 」が 成り立つはず • しかし,コンピュータでの計算は,近似計算 • 計算を繰り返す(つまり、計算結果を使った計算) たびに,誤差が積み重なる 42