プログラミング論 第十二回 何度も繰り返して処理させよう(繰り返し文) 本日の内容 繰り返し処理 – 繰り返し処理の必要性 – for文を使ったプログラム – while文を使ったプログラム – do-while文を使ったプログラム – 配列を使った繰り返し 演習(復習) 3つの整数値を入力して,最大値を求め,出力 するプログラムを作りなさい。 – 手順: 3つの変数,a, b, cの値を入力する。 はじめにデータaを最大値maxと仮定する。 データbとmaxを比較して,bがmaxより大きい場合はbを maxとする。そうでない場合は何も行わない。 データcとmaxを比較して,cが大きい場合はcをmaxとする。 そうでない場合は何も行わない。 入力データと,最大値を表示する。 ensyu35.cを完成させなさい。 解説(復習) a b c どれが一番大きいのだろう?? とりあえずは,最大値が入る箱を用意しておいて,っと。。 分からないから,仮に a MAX a が最大としよう。 a このMAXは仮の値だから,他の値と比較しないと。 MAX MAX 解説(復習) では,最初に b if a MAX b と比較しよう。 MAX箱の中身は の方が大きい! の方が大きい! b にしよう! a MAX b MAX そのままで変化無し。 解説(復習) 最後に,残った c if c と比較しよう。 MAX箱の中身は の方が大きい! a or b MAX c にしよう! c MAX a or b の方が大きい! MAX そのままで変化無し。 if文を2回繰り返す事になりますね。今日の繰り返しの学習の後,もう一度考えましょう 繰り返し処理の必要性 先ほどの,「3つの数値の中から最大値を求める」処理 の場合,同じ内容のif文を2回繰り返しました。 このように,プログラムでは,同じ処理を繰り返す,とい うことが多くあります。 そのたびに何回も同じ処理を書く事はとても面倒ですし, 効率的ではありません。 というわけで。 1回目: 処理1;処理2; ・・・; 2回目: 処理1;処理2; ・・・; 3回目: 処理1;処理2; ・・・; ・・・・・ n回目: 処理1;処理2; ・・・; と書くよりも この処理をn回繰り返しなさい。{ 処理1;処理2; ・・・; } と書ける方が便利です! for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { int i; for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } ここが,繰り返しを 表しているfor文に なります。 for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { int i; { }でかこまれた for(i=1; i<=10; i++){ printf("Hello, world\n"); 処理が繰り返されます } return 0; } for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { それでは,このfor文の int i; 意味を考えましょう。 for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { 繰り返しの回数を指定する変数を用意します。 int i; “制御変数”と呼ばれます。 for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { int i; その変数の初期値を指定します。 for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { int i; 繰り返し処理が終わる条件を指定します。 for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } for文を使ったプログラム 繰り返す回数を指定して実行します。 // ensyu37.c "Hello, world"の表示を10回繰り返すプログラム #include <stdio.h> int main(void) { int i; 繰り返しの度に変数値が変化する量を指定します。 for(i=1; i<=10; i++){ printf("Hello, world\n"); } return 0; } 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文を使ったプログラム for文の途中終了 – 繰り返し処理の途中で, break; と書いておくと,その時点で繰り返しを途中 終了します。 for(i=0; i<=10; i++){ ・・・ if(条件){ 条件を満たせば,10回繰り返す break; ことなく途中で繰り返しを終了す } る例です。 ・・・ } for文を使ったプログラム 制御変数の利用 – 制御変数を,繰り返し回数の管理だけでなく, 処理にも使う事で,いろんなプログラムを作 る事ができます。 – ensyu38.cを見てみましょう。 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 を完成させなさい。 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を完成させなさい。
© Copyright 2024 ExpyDoc