プログラミング論 第十四回 何度も繰り返して処理させよう(繰り返し文) 本日の内容 繰り返し処理 – for文を使ったプログラム – while文を使ったプログラム – do-while文を使ったプログラム – 配列を使った繰り返し for文を使ったプログラム(復習) ようするに。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> 変数 i の値が,1からスタートして, int main(void) { 繰り返しの度ごとに1ずつ増加しながら, int i; 10以下の(10を超えない)範囲で処理を繰り返す for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } よって, この場合は, 処理が10回繰り返される ことになります。 for文を使ったプログラム(復習) フローチャートは次のようになります。 i の値を1にする i の値は10以下 ? Yes Hello, world と表示 i の値を1増やす No for文を使ったプログラム(復習) 決まり文句を覚えておきましょう。 for( i=1; i<= 回数; i++){ 実行したい処理; } 「回数」の所に繰り返したい処理を書き込みます。 「回数」は,数値だけでなく,変数でも指定出来ます。 for文を使ったプログラム(復習) // 1から5までの積(5の階乗)を求めるプログラム #include <stdio.h> int main(void) { int i, seki; ここの部分がどのように処 seki=1; 理されるか見てみましょう for(i=1; i<=5; i++){ seki = seki * i; } printf("5の階乗は%dです。\n",seki); } for文を使ったプログラム(復習) for(i=1; i<=5; i++){ seki = seki * i; } 初期状態 繰り返し1回目 繰り返し2回目 繰り返し3回目 繰り返し4回目 繰り返し5回目 制御変数iの値 ? 1 2 3 4 5 sekiの値 1 1x1=1 1x2=2 2x3=6 6x4=24 24x5=120 演習 問題1 – ensyu38.cを参考にして,任意の整数値に対 する階乗を計算するプログラムensyu39.cを 完成させなさい。 問題2 – ある数値nを入力し,その倍数で1000を超え ない最大の数を求めるプログラムensyu40.c を完成させなさい。 演習:問題2の考え方 1000からスタート,1ずつ減らしながら。。 その数字がnの倍数かどうかをチェック – nで割った余りが0なら倍数,0でない場合は 倍数ではない,という判断 もしnの倍数だったら,そこで繰り返し処 理を中断,その時の数字を出力する – 繰り返しの中断は break; を使う while文を使ったプログラム 繰り返す回数が最初に分かっていない場合に 利用するプログラムです。 // ensyu41.c // 0が入力されるまで入力を繰り返し,入力された数字の合計を計算する。 #include <stdio.h> int main(void) { int dt=-1, sum=0; while(dt != 0){ ここが,繰り返しを表して printf("数値は? "); いるwhile文になります。 scanf("%d",&dt); sum=sum+dt; } printf("合計=%d\n", sum); return 0; } while文を使ったプログラム 繰り返す回数が最初に分かっていない場合に 利用するプログラムです。 // ensyu41.c // 0が入力されるまで入力を繰り返し,入力された数字の合計を計算する。 #include <stdio.h> int main(void) { int dt=-1, sum=0; while(dt != 0){ ここから printf("数値は? "); これらの処理が繰り返されます scanf("%d",&dt); sum=sum+dt; } ここまで printf("合計=%d\n", sum); return 0; } while文を使ったプログラム 繰り返す回数が最初に分かっていない場合に 利用するプログラムです。 // ensyu41.c // 0が入力されるまで入力を繰り返し,入力された数字の合計を計算する。 #include <stdio.h> int main(void) { int dt=-1, sum=0; while(dt != 0){ ここが条件式になります printf("数値は? "); scanf("%d",&dt); 「dtが0でない間は sum=sum+dt; 繰り返し処理する」 } という意味です。 printf("合計=%d\n", sum); return 0; *dtの値は,ループ内で更新されなければなりません。 } while文を使ったプログラム 繰り返す回数が最初に分かっていない場合に 利用するプログラムです。 // ensyu41.c // 0が入力されるまで入力を繰り返し,入力された数字の合計を計算する。 #include <stdio.h> int main(void) { 「dtが0でない間は繰り返す」 int dt=-1, sum=0; という処理であるため,dtに while(dt != 0){ は,最初に,0でない初期値 printf("数値は? "); を与えておく必要があります。 scanf("%d",&dt); sum=sum+dt; } printf("合計=%d\n", sum); return 0; } while文を使ったプログラム フローチャートは次のようになります。 dtに初期値を与える dtが0ではない ? Yes dtに数値を入力 sum+dtを計算 No while文を使ったプログラム 決まり文句を覚えておきましょう。 最初の条件要素の設定 while( 繰り返し条件 ){ 実行したい処理; 繰り返しの条件要素の再設定 } 演習 ensyu42.cは,ensyu38.cをwhile文を用 いて書き直したプログラムである。空欄を 適切なプログラムで埋め,これを完成さ せなさい。 do-while文を使ったプログラム とりあえずループに一度入って処理を行い,その後で 条件判定を行う繰り返し処理です。 処理 Yes 条件 do { 処理; } while(条件); No *while文との違いを確認しましょう。 配列を使った繰り返し 配列変数の添え字を繰り返しの制御変数と関 連させると,効率的なプログラムが書けます。 配列変数に数値を入力する時のプログラム int data[5]; int i, data[5]; scanf("%d",&data[0]); scanf("%d",&data[1]); scanf("%d",&data[2]); scanf("%d",&data[3]); scanf("%d",&data[4]); 繰り返し処理を使わない場合 for(i=0; i<5; i++){ scanf("%d",&data[i]); } 繰り返し処理を使う場合 演習 配列変数に保存されたデータの中から, 最大値を求めるプログラムを考えましょう。 3つの変数の中から最大値を求める時は, if文の処理を2回繰り返しました。 つまり,n個の変数(配列要素)から最大 値を求める時は,if文の処理をn-1回繰り 返す,ということになります。 演習(続き) int a, b, c; max = a; if( b > max){ max = b; } int data[3]; max = data[0]; if( data[1] > max){ max = data[1]; } 演習(続き) if( c > max){ max = c; } printf(“max=%d\n”,max); if( data[2] > max){ max = data[2]; } printf(“max=%d\n”,max); こちらの処理は,繰り返し処理 で簡潔に書く事ができます。 演習(続き) if( data[1] > max){ max = data[1]; } if( data[2] > max){ max = data[2]; } for( i=1; i<=2; i++ ){ if ( data[i] > max ){ max = data[i]; } } for文を使って一つにまとめる ことができます。 演習(続き) それでは,n個のデータから最大値を求 めるプログラムを考えましょう。 ensyu43.cを完成させなさい。 演習 averagec.cを配列を用いて書き直してみ ましょう。
© Copyright 2024 ExpyDoc