第5回 繰り返し を もう一度繰り返そう!

プログラムを考える手順を,もう一度 確認しよう。

  1. プログラム全体の流れを考える
  2. 登場するデータを考える
  3. データ入力
  4. データ処理
  5. データ出力

プログラム,特に繰り返しを考えるには,どの部分を繰り返すのか,どうやったら繰り返しを終えるのかを考えることが,大事です。前回のじゃんけんでは,繰り返すのはじゃんけん,勝負がついたら終了,と考えます。

今週は,もう一度繰り返しを見直しましょう。


条件分岐 と 繰り返し

条件分岐は、ある条件が成立すると、次の文を実行する。


if ( 条件式 ) {
    文1;
}
 
		

繰り返しは、ある条件が成立する間、次の文を実行し続ける。


while ( 条件式 ) {
    文1;
}
 
		

条件が成立する間は、ずーっと繰り返すので、繰り返し実行される「文1」で、条件が変わるように 考えておかないと、一生虎の穴から抜け出せなくなります。この状態を無限ループと呼びます。

「条件式」は,計算あるいは論理演算の結果が,

「1」:真(成立)

「0」:偽(不成立)

です。


課題が与えられたら、まず初めにやること

最初にも書いたように、まずプログラム全体の流れを考えます。 作業を順番に書いていき、繰り返し出てくる部分をまとめられないか考えます。たとえば,「キーボードから0が入力されるまで、入力された値を画面に表示するプログラム」を組んでみましょう。

手順を日本語で考えると、

(1) データを入力する。
(2) データが0なら終了。
(3) 入力データを表示する。
(4) データを入力する。
(5) データが0なら終了。
(6) 入力データを表示する。
(7) ....

繰り返している部分がありますね。 繰り返している部分を整理すると,

(1) データを入力する。
(2) データが0なら終了。
(3) 入力データを表示する。
(4) データを入力する。
(5) (2)へ

となります。繰り返しているのは,(2)?(5)。「データを入力する」が繰り返しの中に含まれている事に注意してください。(繰り返しデータを入力しないと,いつまでたっても終わりません。)
「データが0なら終了」を言い換えると、「テータが0でなければ実行する」となります。これを、条件式にすると、「(入力したデータ)!= 0」となりますね。ここまでを、プログラムにしてみると、


#include <stdio.h>
 
void main()
{
    /* 変数の定義 */
    int a;
 
    /* データの入力 */
    scanf("%d", &a);
 
    /* 繰り返し */
    while(a != 0){
        printf("入力されたデータ=%d\n", a);
        scanf("%d", &a);
    }
}

前に判定するか,後で判定するか

上の例では,繰り返し実行される部分のに,繰り返すかどうかの判定がなされました。このため,「データを入力する」という部分が二回出てきます。まずデータを入力してから,繰り返すかどうかをで判定するには,どうしたらよいでしょうか。

前判定(while 文)


while ( 条件式 ) {
    文1;
}
 
		

後判定(do?while 文)


do{
    文1;
}while ( 条件式 );
 
		

#include <stdio.h>
 
void main()
{
    /* 変数の定義 */
    int a;
 
    /* 繰り返し */
    do{
        /* データの入力 */
        scanf("%d", &a);
        printf("入力されたデータ=%d\n", a);
    }while(a != 0);
}

回数のわかっている繰り返し

同じ作業を10回繰り返すなど、繰り返しの回数が最初からわかっている場合,実行した回数を数える必要があります。1を10回表示するというプログラムを例に,回数を数えるようにしてみましょう。

(1) 回数を0にする。
(2) 1を表示する。
(3) 回数に1加える。
(4) 1を表示する。
(5) 回数に1加える。
....
(20) 1を表示する。
(21) 回数に1加える。
(22) 回数が10になったのでおしまい。

こうすると、「1を表示する」と「回数に1加える」を繰り返していることがわかります。繰り返しを使うと,

(1) 回数を0にする。
(2) 回数が10になったら終了。
(3) 1を表示する。
(4) 回数に1を加える。
(5) (2) へ。

この処理を,まとめると

5_2.png

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

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


演習課題 (Oh-Meiji で提出)

繰り返し

(1)キーボードからゼロが入力されるまでに入力された数の和を求めるプログラムを作りなさい。

(2)キーボードから,二つの正整数を入力すると,はじめの数÷あとの数 を計算し,商とあまりを求めるプログラムを,引き算だけで実現しなさい。

回数のわかっている繰り返し

(3)キーボードから10個の整数を入力すると,それらの数の和と平均値を求めるプログラムを作りなさい。平均値は,実数で表示すること。

繰り返し回数を利用して計算する繰り返し

(4)キーボードから正の整数を入力すると,入力した数の階乗(n!)を計算するプログラムを作成せよ。

(5)かけ算九九を,見栄え良く表示するプログラムを作成しなさい。

 

今週の目標は,(1),(3),(4)。 これを,まずこなしてください。

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

演習:解答例