第5回 繰り返し (5/14)


第3回の演習の解答例



繰り返し処理(while文の書き方)

コンピュータは同じ処理を何度も繰り返し実行するのが得意である.今週から,「繰り返し」について学習する.

C言語では処理を繰り返す仕組みとして while文,for文 が用意されている.

まず while文 を説明する.

while文のフローチャートは,

while ( 条件式 ) {   文1; }

と書き,条件式が「真」である間,文1の処理を実行する.

while文を用いると,同じ処理を実行し続けることがわかる.



カウンタを用いた繰り返し処理の制御(while文)

たとえば,「画面に 1 を 10 行表示するプログラム」を組む場合。


#include <stdio.h>

void main()
{
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
    printf("1¥n");
}

とすれば,とりあえず結果は得られるものの,
10が10000になったらプログラムを入力するのが大変なことになってしまう.

このプログラムでは 1 を表示するという行を何度も繰り返している.
そこでwhile文を用いて1を表示させ続けるには,


#include <stdio.h>

void main()
{
    while (1) {         /* 無限ループ(注)プログラムが止まらなくなるので注意 */

        printf ( "1¥n" );     

    }
}

しかし、このプログラムのままでは永遠にprintf()を実行してしまい問題がある.
  (注)プログラムの停止方法は無限ループの項を参照すること

では,作業を決まった回数だけ繰り返すにはどうしたらよいだろう?

ここで,いま何回目の計算を行っているのかを覚えておくためにカウンタ変数という考え方を導入しよう.
つまり,

1-1 カウンタ変数を宣言する

1-2 カウンタの値を 0 にクリアする

2 カウンタの値が 決まった値以下では以下の処理を繰り返す

 2-1 実行文を実行する
 2-2 カウンタの値に 1 加える


表の処理をフローチャートにまとめると

5_2.png

while

式1;
while ( 式2 ) {
文1;
式3;
}

式1 初期値設定 繰り返し実行の直前に1度だけ実行される.カウンタの初期値設定などに使う.
式2 反復条件 繰り返しを継続する条件を書く.この条件式がの間は繰り返す
式3 付加実行式 繰り返しを1度行うごとに実行したいことを書く.
文1 実行文 繰り返し実行する文

となる.カウンタを用いることにより実行回数の制御が出来きることがわかる.

今度は,実際にwhile文 を用いるたプログラムを見てみよう,

上記の10回だけ画面に1を表示するプログラムにwhile文を用いる.


#include <stdio.h>

void main()
{
    int i;	/*カウンタ変数の宣言*/

    i = 0;    /* (式1)カウンタの値を0に.重要!これを行わないと i に何が入っているかわからない! */

    while (i < 10 ) {         /* (式2)カウンタの値が10未満( 0 ,1,2, ... , 9 ) の場合,以下を繰り返す */

        printf ( "1¥n" );      /*(文1) 繰り返したい処理.(ここでは画面に1を表示) */

        i++;                /* (式3)カウンタの値に1加える */

    }
}

となる.

ここで,i++ は,i の値を 1 増やすことを表し,i = i + 1 と等価である.繰り返しでよく使う演算子.

変数 i を while 文でカウンタとして利用するときは,繰り返し文の前にゼロクリア(初期化)を忘れないように!!!

i=0;から始めるとすると,
while ( i < 10 ) では,i は 0 から 9 まで変化するので10回の反復になるが,
while ( i <= 10 ) では,i は 0 から 10 まで変化するので 11 回の反復になるので注意!



応用

練習で作成したプログラムを利用して,画面に 1 から n までの数字を表示してみよう.


#include <stdio.h>

void main()
{
    printf("1¥n");
    printf("2¥n");
    ・・・;
    printf("n¥n");
}

また元に戻ってはしょうがないので, while文 を使うことを考える.

このプログラムをよく見ると,printf 文 を何回も繰り返していますが,中身が毎回変化している.
そこで,前のプログラムで用いたカウンタ(繰り返しの回数を数えている変数 i )をうまく利用すると,


#include <stdio.h>

void main()
{
    int i, n;

    printf ("n= " );
    scanf ( "%d", &n );

    i = 0;         /* カウンタの値を0に */

    while ( i < n ) {         /* カウンタの値が n 以下の場合,以下を繰り返す */

        printf ( "%d¥n", i );     /* 画面にカウンタの値を表示する */

        i++;                   /* カウンタの値に1加える */
    }
}

無限ループ

繰り返しを無限に繰り返し,プログラムが終了しなくなってしまうことを,無限ループと呼ぶ.

たとえば,while文 で判定する式が偽に成り得ない(常に真)となると,その繰り返しは終了しなくなる.

しかしながら計算手法によっては,意図的にこのような繰り返しを行う場合もある.

例:


    while(1) {    /*  これは無限ループ  */
        ・・・・;
    }

プログラムが意図せずこのような状態になったら,キーボードから [ctrl] + [c] (コントロールキーを押しながらcを押す)と入力して,プログラムを強制終了させることができる.


演習課題 (提出)

(1)1から,入力した値 n までの和を求めるプログラムを,while文を用いて作成せよ

(2)以前作成した肥満度判定プログラムの発展問題は一度実行すると終了してしまう
   while文を使って体重の値に0が入力されるまで,肥満度判定を何度も繰り返す様にプログラムを改良せよ

(3)以前作成した九九の九の段を表示するプログラムを作成せよ

   ヒント:カウンタを上手に使うとプログラムがシンプルに作成できる

(4)一万円を年利1.0%の定期預金に預けた場合のn年後の預金額を計算せよ
   以下の複利計算の公式を利用し,計算年数nはキーボードから入力した値を使用せよ
   ここでは,Aを預金額,rを年利とする

発展問題

(5)掛け算の九九を一から九の段まですべて表示するプログラムを作成せよ

授業終了時までのプログラムと完成した提出用プログラムをoh-meijiシステムを使って提出すること
授業終了時に送るのは出席の確認用である.完成した課題は提出用の回に送ること
(提出用の回に提出しないと,採点を行わない)