第8回 繰り返し (6/18)

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


前回の演習の答え

1.西暦を入力すると,うるう年かどうか判定するプログラム

  ヒント:うるう年は「4で割り切れかつ100では割り切れない年,もしくは,400で割り切れる年」

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

1. 西暦を入力する

2. うるう年かどうか判定する

となる.2の内容を詳細に検討しよう.うるう年かどうかを判定するには,どうしたら良いかな?

 ((4で割り切れる) AND (100では割り切れない)) OR (400で割り切れる)

2.1 うるう年か

2.1T 真のとき 「うるう年です」
2.1F 偽のとき 「うるう年ではありません」

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


解答例:

#include <stdio.h>

void main()
{
    int n;

    printf("西暦を入力してください"); scanf("%d", &n);

    if(((n%4 == 0) && (n%100 != 0)) || (n%400 == 0))
        printf("%d年はうるう年です\n", n);
    else
        printf("%d年はうるう年ではありません\n", n);
}

2.西暦を入力すると,和暦を答えるプログラム

  ヒント:

明治 1868-1911
大正 1912-1925
昭和 1926-1988
平成 1989-2003

これも,プログラミングにかかる前に,手順を確認しておこう.

1. 西暦を入力する

2.1 西暦が
2.1A 1868-1911 「明治」
2.1B 1912-1925 「大正」
2.1C 1926-1988 「昭和」
2.1D 1989-2003 「平成」


解答例:

#include <stdio.h>

void main()
{
    int n;

    printf("西暦を入力してください"); scanf("%d", &n);

    if((n >= 1868) && (n <= 1911))
        printf("%d年は明治%d年です\n", n, n-1867);
    else if((n >= 1912) && (n <= 1925))
        printf("%d年は大正%d年です\n", n, n-1911);
    else if((n >= 1926) && (n <= 1988))
        printf("%d年は昭和%d年です\n", n, n-1925);
    else if((n >= 1989) && (n <= 2003))
        printf("%d年は平成%d年です\n", n, n-1988);
}

先週のプログラムは,実は先々週のプログラムとほとんど一緒で,条件式が少し変化しただけです.気がついたかな?

最後の問題は,来週に回します.


さて,「1から100の和を求めるプログラムを作れ」という課題が与えられたら,どうやってプログラムを組むか考えてみよう.

sum = 1+2+3+4+...+100;

とすれば,とりあえず答えは出るものの,100が10000になったら大変なことになる.また,一般にnまでの和とするにはどうしたらよいだろう?

この計算を電卓でやる手順を書いてみよう.

最初に初期化を行って,後はデータ入力と前の値への加算を繰り返していることがわかる.これを手順としてまとめると,

1 合計をもとめる変数を,クリヤーする

2 以下を100回繰り返す

  2-1 データを入力する
  2-2 入力したデータをこれまでの合計に加算する

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

1 合計をもとめる変数を,クリヤーする

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

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

  2-1 合計にカウンタの値を加算する
  2-2 カウンタの値に1加える


処理を指定回数だけ繰り返す手順を表すには,for文を用いる.上記の手順で,合計をもとめる変数を sum,カウンタを i とすると,

#include <stdio.h>

void main()
{
    int i, sum;

    sum = 0;

    for(i=0; i<=100; i++){
        sum += i;                      /* sum = sum + i; と同じ */
    }

    printf("1から100までの合計は%dです", sum);
}

となる.ここで,i++ は,i の値を 1 増やすことを表し,i = i + 1 と同じです.


一般に書き表すと,

for(式1;式2;式3) 文1

式1 初期値設定 カウンタの初期値を設定する
式2 反復条件 繰り返しを続ける条件を書く この条件式がの間は繰り返す
式3 付加実行式 繰り返しを行う都度に実行したいことを書く
文1 実行文 繰り返し実行する文


演習

1. 1からキーボードから入力した値までの和を求めるプログラム

2. 先週作成したうるう年判定プログラムは一度実行すると終了してしまう.for文を使って西暦0年から2003年まで繰り返す様にする

2’. さらにすすんで,西暦0年から2003年までの間の,うるう年を答える様にする