第9回 繰り返し (6/16)

条件分岐,繰り返しは,マスターできましたか?

今回は,繰り返しのバリエーションを増やします.


前々回の演習の答え

1. 整数nを入力すると,n!を一回だけもとめる. 注意:0!=1

まず,問題が与えられたら,プログラムの実行手順を考えよう

1 階乗を求める数 n を入力する

2 繰り返しの回数(カウンタ)を,0にする

3 カウンタの値が n を超えるまで,以下を繰り返す

  2-1 前の計算で求めた値に,(カウンタの値+1)を乗算する
  2-2 カウンタの値に1加える

となる.

和の場合と異なり0をかけてしまうと,いつまでも答えが0になってしまう点を注意する.また,n=0の場合の取り扱いを考慮する.

これを,プログラムにしてみよう.


解答例:

#include <stdio.h>



void main()

{

    int i, n, kaijo = 1;



    printf("n の階乗を求めます.nを入力してください.n = "); scanf("%d", &n);





    for(i=0; i<n; i++){

        kaijo *= i+1;

    }



    printf("%d の階乗は,%dです.\n", n, kaijo);



}


2. 整数nを入力すると,奇数か偶数かの判定を繰り返し,0以下の整数が入力されたら終了する

まず,問題が与えられたら,プログラムの実行手順を考えよう.繰り返しの判定条件,どうやって奇数偶数を判断するかがポイントです.

1 整数 n を入力する

2 整数 n が0より大きい場合,以下を繰り返す

  2-1 n は奇数か,偶数か

となる.

これを,プログラムにしてみよう.


解答例:

#include <stdio.h>



void main()

{

    int n;



    printf("奇数偶数を判定する数 n を入力してください n = "); scanf("%d", &n); 



    for( ; n > 0; ){

        if(n%2 == 0){

            printf("%d は偶数です\n", n);

        }else{

            printf("%d は奇数です\n", n);

        }



        printf("奇数偶数を判定する数 n を入力してください n = "); scanf("%d", &n);

    }



    printf("終わります\n");



}


nの入力をする部分が2回出てくる.もう少しスマートにプログラムできないかな?? → 今日の課題


3. まずデータの件数を入力し,続いてその件数だけ実験データを入力し,実験データの合計と平均値を求める.

   データの例: 10,20,30,40,50 の5件なら,合計150,平均30.0

今度は,繰り返しが終わってから,さらに計算が必要です.

1 データの件数 n を入力する

2 繰り返しの回数(カウンタ)を,0に,合計を0にする.

3 カウンタの値が n を超えるまで,以下を繰り返す

  2-1 実験データを入力する
  2-2 合計に実験データを加える
  2-3 カウンタの値に1加える

4 求まった合計をデータの数 n で割り,平均点を求める

となる.

これを,プログラムにしてみよう.


解答例:

#include <stdio.h>



void main()

{

    int i, n, data, sum = 0;

    float ave;



    printf("入力するデータの数を入力してください n = "); scanf("%d", &n); 



    for(i=0; i<n ; i++){

        printf("%d 番目のデータ  = ", i+1); scanf("%d", &data);

        sum += data;

    }



    ave = (float)sum / (float)n;



    printf("%d 個のデータの合計は %d ,平均は %f です\n", i, sum, ave);



}


二重ループ

for文を二つ組あせて使うと,どうなるか試してみよう.

例:

#include <stdio.h>



void main()

{

    int i, j;



    for(j=1; j<=9; j++){

        for(i=1; i<=9; i++){

            printf("%d×%d=%d\n", j, i, j*i);

        }

    }

}


while文

繰り返しの回数が,あらかじめわかっていない場合は,while文を用いるとプログラムが見やすくなります.while文は,ある条件が成り立っている間は,繰り返しを続けます.

主に,キーボードから**が入力されるまで繰り返すとか,計算結果が**になるまで繰り返すなどの場合に用います.

前判定の繰り返し

while(式)

  文1

後判定の繰り返し

do

  文1

while(式)

前判定(while文)と後判定(do-while文)の違いは,while文は文の実行よりも先に条件判断を行うので,最初に条件が成立しなければ,文は一度も実行されないことがあるのに対し,do-while文では,文が必ず一度は実行されます.

たとえば,0が入力されるまで,入力された数字を加えるプログラムは,次のようになります.

例:

#include <stdio.h>



void main()

{

    int n, sum;



    sum = 0;



    do{

        scanf("%d", &n);

        sum += n;

    } while(n!=0);



    printf("合計は%dです\n", sum);

}


nの階乗を求めるプログラムをwhile文を用いて書いてみると,以下のようになります.

#include <stdio.h>



void main()

{

    int i, n, kaijo = 1;



    printf("n の階乗を求めます.nを入力してください.n = "); scanf("%d", &n);



    i = 0;



    while(i<n){

        kaijo *= i+1;

        i++;

    }



    printf("%d の階乗は,%dです.\n", n, kaijo);



}


演習

1. A,B が1桁の正整数のとき,(A * 10 + B) ― (B * 10 + A) = 45となる,A,Bの組み合わせを求めよ.

2. 年利5%の複利(1年経つごとに利子を元金に繰り入れて,その加算額を次期の元金とする)の定期預金に1万円預けると,元利合計が10万円を超えるのは何年後になるかを求めよ.