No.14

プログラミング論
第十四回
何度も繰り返して処理させよう(繰り返し文)
本日の内容

繰り返し処理
– 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を配列を用いて書き直してみ
ましょう。