プログラミング実習

プログラミング論
第十二回
何度も繰り返して処理させよう(繰り返し文)
本日の内容

繰り返し処理
– 繰り返し処理の必要性
– 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を完成させなさい。