繰り返し計算 while文, for文.

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

プログラミング Ⅱ 第2回 第1回(プログラミングⅠの復 習) の解説. プログラムの作り方 いきなり完全版を作るのではなく,だんだ んふくらませていきます. TicTa cToe1.
初年次セミナー 第8回 データの入力.
Fortran と有限差分法の 入門の入門の…
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
プログラミング基礎I(再) 山元進.
初年次セミナー 第4回 整数と実数の取り扱い.
情報基礎実習I (第7回) 木曜4・5限 担当:北川 晃.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
6/26 前回復習 for文、while文による繰り返し計算
数値計算及び実習 第3回 プログラミングの基礎(1).
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
情報基礎実習I (第5回) 木曜4・5限 担当:北川 晃.
C言語 配列 2016年 吉田研究室.
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
Semantics with Applications
第6章 2重ループ&配列 2重ループと配列をやります.
湘南工科大学 2013年12月10日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
関数 関数とスタック.
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
北極振動指数と日本各地の気温の関係を調べる
配列(1) 第9回目 [6月15日、H.16(‘04)] 本日のメニュー 1)前回の課題について 2)前回の宿題について 3)配列 4)課題
第7回 条件による繰り返し.
第2回 Microsoft Visual Studio C++ を使ってみよう
整数データと浮動小数データ 整数データと浮動小数データの違い.
Borland Delphi 6 でビジュアルプログラミング
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
Cプログラミング演習 第6回 ファイル処理と配列.
繰り返し計算 while文, for文.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング入門 電卓を作ろう・パートIV!!.
情報とコンピュータ 静岡大学工学部 安藤和敏
第7回 条件による繰り返し.
情報とコンピュータ 静岡大学工学部 安藤和敏
Cの実行モデル.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
3.条件式.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
整数データと浮動小数データ.
情報基礎Ⅱ (第5回) 月曜4限 担当:北川 晃.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
11.再帰と繰り返しの回数.
9.構造体.
C言語 はじめに 2016年 吉田研究室.
計算機プログラミングI 第6回 2002年11月14日(木) アルゴリズムと計算量 第1回課題の説明 平方根を計算するアルゴリズム 計算量
情報とコンピュータ 静岡大学工学部 安藤和敏
高度プログラミング演習 (01).
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミングⅡ 第2回.
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
福井大学大学院工学研究科機械工学専攻 川谷 亮治
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
情報工学Ⅱ (第2回) 月曜4限 担当:北川 晃.
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
1.Scheme の式とプログラム.
プログラミング基礎演習 第4回.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
Cプログラミング演習 ニュートン法による方程式の求解.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
Q q 情報セキュリティ 第7回:2005年5月27日(金) q q.
コンピュータープログラミング (C言語)(10) 1.ファイル入出力
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
情報処理Ⅱ 2006年10月20日(金).
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
知能情報工学演習I 第10回( C言語第4回) 課題の回答
情報処理技法(Javaプログラミング)1 第8回 同じ処理を何回も繰り返すには?
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

繰り返し計算 while文, for文

本日の内容 例題1.自然数の和 例題2.最大公約数の計算 例題3.ベクトルの長さ while 文 例題4.九九の表 for 文と繰り返しの入れ子 例題5.ド・モアブルの公式 計算誤差の累積

今日の到達目標 繰り返し(while 文, for 文)を使って,繰り返し計算を行えるようになること ループカウンタとして,整数の変数を使うこと 今回も,見やすいプログラムを書くために,ブロック単位での字下げを行う

繰り返しとは 条件 繰り返しとは,ある条件が満たされるまで,同じことを繰り返すこと. 繰り返しを行うための文としてwhile文, for 文などがある.

繰り返しの例 ユークリッドの互助法 九九の表 など m と n の最大公約数を求めるために,「割った余りを求めること」を,余りが0になるまで繰り返す. 九九の表 九九の表を求めるために,掛け算を81回繰り返す など

例題1.自然数の和 整数データ(Nとする)を読み込んで,1からNまでの和を求めるプログラムを作る ここでは,練習のため,自然数の和の公式は使わずに,while文を用いる 例) 100 → 5050

program sum; {$APPTYPE CONSOLE} uses SysUtils; 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. 条件式 繰り返し実行される 部分

自然数の和 実行結果の例 sum [1..N] Program. Please Enter N: 100 sum [1..N] = 5050

実行結果画面(例)

プログラム実行順 s := 0; i := 1; Yes i <= N No s := s + i; i := i + 1;

繰り返し処理の中身 繰り返しの前 繰り返しの各ステップでなされること 繰り返しの終了条件 i := 1 と S := 0 を実行 1. 「S」 に 「i」 を足しこむ → 「S」には,その時点での「1から i 」までの和     が入る 2. 「i」 の値を1増やす 繰り返しの終了条件 i <= N が成り立たなくなったら終了 → つまり i > N になったら終了

自然数の和 N = 7 とすると i の値 s の値 はじめは s = 0 i = 1 i = 2 i <= 7 が成立する 繰り返し 1回目 i <= 7 が成立する s = 0 + 1 i = 2 繰り返し 2回目 i <= 7 が成立する s = 1 + 2 i = 3 繰り返し 3回目 i <= 7 が成立する s = 3 + 3 i = 4 繰り返し 4回目 i <= 7 が成立する s = 6 + 4 i = 5 繰り返し 5回目 i <= 7 が成立する s = 10 + 5 i = 6 繰り返し 6回目 i <= 7 が成立する s = 15 + 6 i = 7 繰り返し 7回目 i <= 7 が成立する s = 21 + 7 i = 8 繰り返し 8回目 i <= 7 が成立しない

while 文 while 条件式 do begin 式1; 式2; ... end 何かの処理の繰り返し Yes 条件式 No 式1 式2 ... 何かの処理の繰り返し 繰り返しのたびに while 文で書かれた条件式の真偽が判定され, 真である限り,while のあとに続く文が実行され続ける.

練習1.例題1を実行せよ ① 例題1のプログラム ② Borland Delphi 6 の起動 ③ コンソールアプリケーションの新規作成 ① 例題1のプログラム ② Borland Delphi 6 の起動 「スタート」→「プログラム」→「Borland Delphi 6」→「Delphi 6」 ③ コンソールアプリケーションの新規作成 「ファイル」→「新規作成」→「その他」 ⇒ ウインドウが現れる 「コンソールアプリケーション」→「OK」  ⇒ ウインドウが現れる ④ ①のプログラムコードを「コピー」して「貼り付け」 ⑤ コンパイル 「プロジェクト」→「○○をコンパイル」 ⑥ 実行 「実行」→「実行」 ☆余裕がある人は練習2に進んでください

ステップ実行画面 現在 「i := 1;」の行を実行中で あることを示す ステップ実行は「F8」キー

ステップ実行での変数の値の確認 変数 s の値は,現時点では3 変数の値の確認は「CTRL+F7」キー

ステップ実行の終わり方 「F9」キーを押すと,ステップ実行が終わって,通常の実行に切り替わる

ステップ実行での注意事項 read, readln 文では,何かの値を入れるまでプログラムは止まる この間,「F8」, 「F9」キーなどは利かない

練習2.例題1をステップ実行せよ ① すでに「練習1」を終えていること ② ここで,「F8」を押す ③ さらに「F8」を2回押す ① すでに「練習1」を終えていること 正確には,練習1の「⑤コンパイル」を終えた状態であること ② ここで,「F8」を押す F8はステップ実行の意味  → 実行画面が現れる.実行中の行が「青色」で表示される ③ さらに「F8」を2回押す → readln の行に達したことを確認すること ④「実行画面」のウインドウで N の値を入れる Nの値を入れるまでプログラムは止まっている (「F8」などは受け付けられない) ⑤ さらに「F8」を押しつづける ⑥ ステップ実行に飽きたら,「F9」を押すとプログラムの最後の行まで1度に実行される

ステップ実行の意味 プログラムの「間違い」を探すのに便利 プログラム実行の途中で,変数の値などを確認できる → ステップ実行によって,プログラムの実行の流れを確認できる プログラム実行の途中で,変数の値などを確認できる Borland Delphi 6 では F9: 通常の実行 F8: ステップ実行 CTRL+F7: 変数の値などの表示

例題2.最大公約数の計算 2つの整数データを読み込んで,最大公約数を求めるプログラムを作る. 例) 20, 12 のとき: 4 ユークリッドの互助法を用いること ユークリッドの互助法を行うために while 文を書く 例) 20, 12 のとき: 4

ユークリッドの互助法 最大公約数を求めるための手続き m,nの最大公約数は, m ≧ n とすると, 「m をn で割った余り」 = 0 なら,最大公約数は n 「m をn で割った余り」 > 0 なら,m と n の最大公約数は, 「m をn で割った余り」 と n の最大公約数に等しい ( なお,n > 「m をn で割った余り」 が成り立つ)

write('GCD Program. Please Enter m: '); readln(m); program sum; {$APPTYPE CONSOLE} uses SysUtils; 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; end; writeln('GCD = ', n:8); readln end. 条件式 条件が成り立つ限り, 実行されつづける部分

最大公約数の計算 実行結果の例 GCD Program. Please Enter m: 80 Please Enter n: 35

実行結果画面(例)

プログラム実行順 r := m % n; Yes r > 0 No m := n; n := r; r := m mod n;

繰り返し処理の中身 繰り返しの前 繰り返しの各ステップでなされること m := n; n := r; r := m mod n; r := m mod n を実行(m を n で割った余りが r に入る) 繰り返しの各ステップでなされること m := n; n := r; r := m mod n; を実行(m, n, r の値は小さくなっていく) 繰り返しの終了条件 r が 0 になったら終了

最大公約数の計算 m = 80, n = 35 とすると, 最初の「 r = m mod n; 」で, r = 10 になる 繰り返し 1回目 r > 0 が成立する m = 35 n = 10 r = 5 80, 35 の最大公約数は 35, 10 の最大公約数に等しい 繰り返し 2回目 r > 0 が成立する m = 10 n = 5 r = 0 35, 10 の最大公約数は 10, 5 の最大公約数に等しい 繰り返し 3回目 r > 0 が成立しない

練習3.例題2を実行せよ ① 例題2のプログラム ② Borland Delphi 6 の起動 ③ コンソールアプリケーションの新規作成 ① 例題2のプログラム ② Borland Delphi 6 の起動 「スタート」→「プログラム」→「Borland Delphi 6」→「Delphi 6」 ③ コンソールアプリケーションの新規作成 「ファイル」→「新規作成」→「その他」 ⇒ ウインドウが現れる 「コンソールアプリケーション」→「OK」  ⇒ ウインドウが現れる ④ ①のプログラムコードを「コピー」して「貼り付け」 ⑤ コンパイル 「プロジェクト」→「○○をコンパイル」 ⑥ 実行 「実行」→「実行」  ☆余裕がある人は「ステップ実行」してください

例題3.総和と平均 データ x1, x2, ... xk を1つづつ読み込んで,合計と平均を求めるプログラムを作成する 負の数が入力されたら終了する 例) 整数のデータ 1, 2, 3 に対して 1 2 3 -1 入力

条件式 program sum; {$APPTYPE CONSOLE} uses SysUtils; 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; end; writeln('sum =', s:8:3); writeln('average =', (s/i):8:3); readln end. 条件式 条件が成り立つ限り, 実行されつづける部分

総和と平均 実行結果の例 Please Enter x[ 0]: 1 Please Enter x[ 1]: 2 sum = 6.000 average = 2.000

実行結果画面(例)

プログラム実行順 0 <= x 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);

繰り返し処理の中身 繰り返しの前 繰り返しの各ステップでなされること 繰り返しの終了条件 S := 0 と i := 0 を実行 X0 を読み込む 繰り返しの各ステップでなされること 1. 「S」 に 「Xi」 を足しこむ → 「S」には,その時点での「X0から Xi 」までの和が入る 2. 「i」 の値を1増やす 3. Xi を読み込む 繰り返しの終了条件 Xi < 0 ならば終了

練習4.例題3を実行せよ ① 例題3のプログラム ② Borland Delphi 6 の起動 ③ コンソールアプリケーションの新規作成 ① 例題3のプログラム ② Borland Delphi 6 の起動 「スタート」→「プログラム」→「Borland Delphi 6」→「Delphi 6」 ③ コンソールアプリケーションの新規作成 「ファイル」→「新規作成」→「その他」 ⇒ ウインドウが現れる 「コンソールアプリケーション」→「OK」  ⇒ ウインドウが現れる ④ ①のプログラムコードを「コピー」して「貼り付け」 ⑤ コンパイル 「プロジェクト」→「○○をコンパイル」 ⑥ 実行 「実行」→「実行」   ☆余裕がある人は「課題1」に進んでください

課題1.m から n までの和 2つの整数データ(M, Nとする)を読み込んで,MからNまでの和を求めるプログラムを作りなさい while 文を使いなさい.例題1のプログラムを参考にしなさい 必ず,動作確認まで行うこと (余裕がある人のみ)和だけでなく平均も表示させよ

例題4.九九の表 九九の表を表示するプログラムを作成する 九九の表を表示するために,繰り返しの入れ子を使う

program sum; {$APPTYPE CONSOLE} 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; readln end. 繰り返し実行される部分

実行結果画面(例)

繰り返しの入れ子

九九の表 i := 1 Yes i <= 9 No j := 1 Yes j <= 9 No i := i + 1; 九九の表を表示 i := i + 1; j := j + 1;

for 文 for 変数名 := 初期値 to 終了値 do begin 式1; 式2; ... end

例題5.ド・モアブルの定理 θを読み込んで,次の値を計算するプログラムを作る なお,i は虚数単位 ここでは (sinθ+ i cosθ)n を求めるために,while文を用いた繰り返し計算を行ってみる

複素数の積 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 ) 実数部 虚数部

繰り返し実行される 部分 条件式 program sum; {$APPTYPE CONSOLE} uses SysUtils; 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. 繰り返し実行される 部分 条件式

実行結果画面(例)

繰り返し処理の中身 繰り返しの前 x1 := cos θ y1 := sin θ x2 := x1 y2 := y1 を実行 繰り返しの各ステップでなされること x1 := x1 * x2 - y1 * y2 y1 := x1 * y2 + x2 * y1; を実行 (x1 が実数部,y1 が虚数部)

(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θ (以下同様に考える.数学的帰納法で証明できる)

計算結果から分かること 本来なら「 (cosθ+ i sinθ)n = cos nθ+ i sin nθ 」が成り立つはず しかし,「浮動小数」の計算は,あくまでも近似計算(有効精度12桁程度) 計算を繰り返す(つまり、計算結果を使った計算)たびに,誤差が積み重なる