プログラミング論 第十三回 何度も繰り返して処理させよう(繰り返し文) 本日の内容 繰り返し処理 – while文を使ったプログラム – do-while文を使ったプログラム – 配列を使った繰り返し 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を配列を用いて書き直してみ ましょう。 データの並べ替えを考えてみよう まず,「データが大きい順に並んでいる」 という状態は,どういう状態かを考えまし ょう。 その状態を,「繰り返し」や「分岐」で簡潔 に表現できないか,を考えます。 次に,「その状態になっていなかったら, どのような処理をすればよいか?」を考え ましょう。 データの並べ替えを考えてみよう ~定義~ データがn個あるとき,「データが大きい順 に並んでいる」状態は次のように定義でき ます。 – [0]~[n-1]:[0]番目のデータが最も大きい – [1]~[n-1]:[1]番目のデータが最も大きい – [2]~[n-1]:[2]番目のデータが最も大きい ・・・ – [n-2]~[n-1]:[n-2]番目のデータが最も大きい データの並べ替えを考えてみよう ~繰り返しで表現できそうな場所は?~ – [0]~[n-1]:[0]番目のデータが最も大きい – [1]~[n-1]:[1]番目のデータが最も大きい – [2]~[n-1]:[2]番目のデータが最も大きい ・・・ – [n-2]~[n-1]:[n-2]番目のデータが最も大きい データの並べ替えを考えてみよう ~繰り返しで表現できそうな場所は?~ – [0]~[n-1]:[0]番目のデータが最も大きい – [1]~[n-1]:[1]番目のデータが最も大きい – [2]~[n-1]:[2]番目のデータが最も大きい ・・・ – [n-2]~[n-1]:[n-2]番目のデータが最も大きい 繰り返しでの表現? iを0~n-2まで変化させながら, [i]~[n-1]の中で[i]番目のデータが最も大きい がすべて成り立つならば,大きい順に並んでい る,と言える。 データの並べ替えを考えてみよう ~並んでいない場合(矛盾)の処理~ iを0~n-2まで変化させながら, [i]~[n-1]の中で[i]番目のデータが最も大きい がすべて成り立つならば,大きい順に並んでい る,と言える。 [i]番目が最も大きくない場合は, [i]~[n-1]で最大値を探しだし, その最大値と[i]番目のデータを交換する。 データの並べ替えを考えてみよう まずは,「データを交換するプログラム」を考 えてみましょう。 (sort1.c) 次に,並べ替えを行うプログラムを考えてみ ましょう。 (sort2.c) 他の方法を考えてみましょう。 中間テストについて 日時:11月1日(火) 場所:4-302(PCは使わない,筆記のみ) 範囲など: – 繰り返し(for文, while文)まで – 講義で利用したプログラムリストから出題 ただし,ensyuで始まるプログラムのみ – 穴埋め,結果予測,フローチャートからのプ ログラム作成,新規プログラム作成,の出題 形式 – 重要な関数 printf, scanf, if, for, while
© Copyright 2024 ExpyDoc