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

Slides:



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

第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
1 繰り返し処理 while 文 と do 文 所定回反復(特定回数の繰り返し)には for 文を用いた while( 式 ) 文 式が真であるかぎり、文を繰り返し実行する 繰り返す回数が不定の場合に用いる 繰り返し回数が明示的に決まらない場合には while 文、 do 文を用いる ある手順を、例えば.
ループで実行する文が一つならこれでもOK
4章 制御の流れ-3.
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
6/26 前回復習 for文、while文による繰り返し計算
第2回ネットワークプログラミング 中村 修.
C言語 配列 2016年 吉田研究室.
コンピュータープログラミング (C言語)(6) 1.条件分岐2(switch文、復習) 2.繰り返し処理(for文、while文)
第6章 2重ループ&配列 2重ループと配列をやります.
プログラミング入門2 第2回 複合文、繰り返し 情報工学科 篠埜 功.
関数 関数とスタック.
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
構造体 構造体, 構造体とポインタの組み合わせ,.
第7回 条件による繰り返し.
情報基礎及び演習 プログラミング基礎① 電気・佐藤亮一.
繰り返し計算 while文, for文.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
Cプログラミング演習.
第10回関数 Ⅱ (ローカル変数とスコープ).
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
高度プログラミング演習 (03).
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
Cの実行モデル.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
整数データと浮動小数データ.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
プログラミング序論演習.
プログラミング序論演習.
情報処理Ⅱ 第3回 2007年10月22日(月).
プログラミングⅡ 第2回.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
プログラミング基礎演習 第4回.
ループだよ!難しいよ! 第5章 while(ループ);.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
モバイルプログラミング第2回 C言語の基礎 (1).
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
プログラミング序論演習.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
知能情報工学演習I 第10回( C言語第4回) 課題の回答
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

繰り返し計算 while文, for文

本日の内容 例題1.最大公約数の計算 例題2.自然数の和 while 文 例題3.フィボナッチ数列 例題4.自然数の和 for 文 例題5.九九の表 繰り返しの入れ子

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

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

繰り返しの例 ユークリッドの互助法 九九の表 フィボナッチ数 など m と n の最大公約数を求めるために,「割った余りを求めること」を,余りが0になるまで繰り返す. 九九の表 九九の表を求めるために,掛け算を81回繰り返す フィボナッチ数 フィボナッチ数を求めるために, f(n)=f(n-1)+f(n-2)を,nに達するまで繰り返す など

例題1.最大公約数の計算 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 で割った余り」 が成り立つ)

条件式 #include <stdio.h> int main() { int r; int m; int n; printf("m="); scanf("%d", &m); printf("n="); scanf("%d", &n); r = m % n; while( r != 0 ){ m = n; n = r; } printf("GCD=%d\n", n); return 0; 条件式 条件が成り立つ限り, 実行されつづける部分

ユークリッドの互助法 実行結果の例 m=12 n=8 GCD=4

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

ユークリッドの互助法 最初の「 r = m % n; 」で, m = 80, n = 35 とすると, r = 10 になる 繰り返し 1回目 r != 0 が成立する m = 35 n = 10 r = 5 繰り返し 2回目 r != 0 が成立する m = 10 n = 5 r = 0 繰り返し 3回目 r != 0 が成立しない

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

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

自然数の和 条件式 #include <stdio.h> int main() { int i; int n; int sum; printf("n="); scanf("%d", &n); sum = 0; i = 1; while( i<=n ) { sum = sum + i; i = i + 1; } printf("n=%d, sum=%d\n", n, sum); return 0; 条件式 条件が成り立つ限り, 実行されつづける部分

自然数の和 実行結果の例 n=100 n=100, sum=5050

プログラム実行順 i = 1; Yes i <= n No sum = sum + 1; i = i + 1;

自然数の和 n = 7 とすると i の値 sum の値 i = 2 i <= 7 が成立する sum = 0 + 1 i = 3 繰り返し 1回目 i <= 7 が成立する sum = 0 + 1 i = 2 繰り返し 2回目 i <= 7 が成立する sum = 1 + 2 i = 3 繰り返し 3回目 i <= 7 が成立する sum = 3 + 3 i = 4 繰り返し 4回目 i <= 7 が成立する sum = 6 + 4 i = 5 繰り返し 5回目 i <= 7 が成立する sum = 10 + 5 i = 6 繰り返し 6回目 i <= 7 が成立する sum = 15 + 6 i = 7 繰り返し 7回目 i <= 7 が成立する sum = 21 + 7 i = 8 繰り返し 8回目 i <= 7 が成立しない 1から 「繰り返し数」の和 「繰り返し数」+1

例題3.フィボナッチ数列 整数(Nとする)を読み込んで,1からNまでのフィボナッチ数列を求めるプログラムを作る. フィボナッチ数列f(n) とは   f(0)=1, f(1)=1, f(n)=f(n-1)+f(n-2) フィボナッチ数列を求めるために for 文を使う 例) 1,1,2,3,5,8,13,21,34,55,89,144,....

条件式 #include <stdio.h> int main() { int i; int n; int fn; printf("n="); scanf("%d", &n); fn1 = 1; fn2 = 1; for (i=2; i<=n; i++) { fn=fn1+fn2; fn2=fn1; fn1=fn; printf("f(%d) = %d\n", i, fn); } return 0; 条件式 条件が成り立つ限り, 実行されつづける部分 順番に意味がある. fn1=fn; fn2=fn1; とはしないこと

フィボナッチ数列 実行結果の例 n=6 f(2) = 2 f(3) = 3 f(4) = 5 f(5) = 8 f(6) = 13

フィボナッチ数列 i = 2 i <= n i++ Yes No fn=fn1+fn2; fn2=fn1; fn1=fn; printf("f(%d) = %d\n", i, fn); i++

フィボナッチ数列 n = 5 とすると i = 2 i = 3 i = 4 i = 5 i = 6 fn の値 fn2 の値 fn1 の値 f i が入る f i-1 が入る f i が入る

++, -- の意味 ++ インクリメントを行う演算子. インクリメントとは1足すこと. オペランドに1を足して,オペランドに格納する. - デクリメント演算子. デクリメントとは1引くこと. オペランドから1を引いて,オペランドに格納する.

for 文 for ( 初期式; 条件式; 再設定式 ) { 式1; 式2; ... } 初期式:繰り返しの最初に1回だけ実行される. 条件式:繰り返しのたびに,真偽が判定される(偽ならば繰り返しが終わる). 再設定式: 繰り返しのたびに実行される.

for 文による繰り返し 初期式 条件式 式 再設定式 Yes No 1.まず,「初期式」を実行 2.次に,「条件式」を実行.条件式が成立すれば,   式と「再設定式」を実行し,「条件式」に戻る

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

自然数の和 実行結果の例 n=100 n=100, sum=5050

自然数の和 条件式 #include <stdio.h> int main() { int i; int n; int sum; printf("n="); scanf("%d", &n); sum = 0; for (i=1; i<=n; i++) { sum = sum + i; } printf("n=%d, sum=%d\n", n, sum); return 0; 条件式 条件が成り立つ限り, 実行されつづける部分

プログラム実行順 i = 1; Yes i <= n No sum = sum + 1; i = i + 1;

自然数の和 n = 7 とすると sum の値 i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7

for 文と while 文 for 文と while 文の能力は 同じ.自分にとって分かり やすい方と使うべし 式1; 式2; ... } for 文と while 文の能力は 同じ.自分にとって分かり やすい方と使うべし 初期式 while ( 条件式 ) { 式1; 式2; ... 再設定式 }

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

九九の表 #include <stdio.h> int main() { int i; int j; for (i=1; i<=9; i++) { for(j=1; j<=9; j++) { printf("%d, ", i*j); } printf("\n"); return 0; 内側 外側

繰り返しの入れ子

九九の表 i = 1 Yes i <= 9 No j = 1 Yes j <= 9 No i++ j++ printf("%d, ", i*j); i++ j++

課題1 「例題1.最大公約数の計算」のプログラムを書き換えて,m,nを何度も入力して計算できるようにせよ

課題1のヒント 「m,nを何度も入力して計算できる」とは 繰り返し続けるプログラム while (1) { 式1; 式2; ... } Yes 1 式1 式2 ... この「1」は,「常に真である」 ことを示す特別な数 *後述する do while 文を使っても「繰り返し続ける」ことは可能

条件式での「1」の意味 値 意味 1 真(true) 0 偽(false)

課題1のヒント x と y を入れ替えるプログラム int x; int y; int z; z = x; x = y; y = z; x と y を入れ替えるプログラム int x; int y; int z; z = x; x = y; y = z; z は入れ替えのためだけに 使う変数

課題2 ベクトルの値 (x1, x2, ... xk)を1つづつ読み込んで,1つ読み込むごとに,次の計算を行うプログラムを作成しなさい. 2つのベクトルの値(x1, x2, ... ), (y1, y2, ...)を交互に読み込んで,1組読み込むことに次の計算を行うプログラムを作成しなさい. 2つのベクトルの内積

課題2のヒント k回めの繰り返しにおいて,長さkのベクトル (x1, x2, ... xk) の二乗和を求めるプログラム sum = 0; while (1) { scanf( "%lf", x ); sum = sum + ( x * x ); printf( "sum = %f\n", sum ); }

課題3.三角関数 θを読み込んで,(cosθ+ i sinθ)n を計算するプログラムを作りなさい なお,i は虚数単位

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

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

課題4 あるクラスの試験の点数から,その平均値と,標準偏差を計算するプログラムを作成しなさい.

より勉強したい人への付録

do while 文による繰り返し while 文との違い: 必ず最初に1回は実行される

do while文 do { 式1; ... 式n; } while (条件式);

do while 文が役に立つ場合 読み込み値のチェック 0点以上,100点以下のデータの読み込み 間違いがあったら,読み込みを繰り返す printf(" tensu="); scanf("%d", &tensu); } while( ( tensu < 0 ) || ( tensu > 100 ) );

break文 繰り返しを中断 break を含む最も内側の switch文あるいは繰り返し文(while, for 文など)から抜け出す.

break文 while (条件1){ 式; if (条件2){ break; /* whileの外へ*/ } 条件1の結果が成り立たない while (条件1){ 式; if (条件2){ break; /* whileの外へ*/ } printf("条件2が成り立てば実行されない."); printf("whileの外\n"); 条件2の結果が成り立つ

continue文 次の繰り返し実行を行うための文. continue を含む最も内側の繰り返し文(while文, for 文など)について,繰り返しの本体の残りを飛ばして,次の繰り返しを始める.

continue文 while (条件1){ 式; if (条件2){ continue; /* whileの先頭へ*/ } printf(“条件2が成り立たなければ実行される."); printf("whileの外\n");

break 文, continue 文のまとめ break 文 continue 文 while 文, for 文での繰り返しから抜け出す 繰り返し途中で,残りの処理を飛ばす