プログラミング実習

プログラミング論
第十三回
何度も繰り返して処理させよう(繰り返し文)
本日の内容

繰り返し処理
– 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