第13回 前期の復習 (7/16)

今週は,前期に学習した内容を復習し,演習問題の解説をします.

わからないことがあったら,どんどん質問して,必ず自分でプログラムを組めるようにしよう.


問題

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


答え

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

1. 西暦をカウンターとし,0にする

2. 西暦が2003になるまで,以下を繰り返す

   2-1 西暦がうるう年かどうか判定する

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


解答例:

#include <stdio.h>

void main()
{
    int seireki;

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

問題

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


答え

A,B ともに1桁の正整数であるから,それぞれ0から9の間の数を取る.どの組み合わせの時45になるかを毎回計算しながら,確かめていけばよい.

1. Aを0にする

2. Aが9になるまで,以下を繰り返す

   2-1 Bを0にする

   2-2 Bが9になるまで,以下を繰り返す

      2-2-1 式が成り立つか判定しする

        2-2-1T 成り立つとき,AとBの値を表示する

        2-2-1F 成り立たないとき,なにもしない

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


解答例:

#include <stdio.h>

void main()
{
    int a, b;

    for(a=0; a<=9; a++){
        for(b=0; b<=9; b++){
            if((a*10+b)-(b*10+a)==45)
                printf("A=%d B=%d\n", a, b);
        }
    }
}

問題

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


答え

この問題では,毎年元利合計金額を計算しその額が10万円を超えるまでの年数を数える.何年繰り返すかは,プログラム作成時点ではわかっていないので,whileループを使ってみよう.

1. 預けた年数を0,元利合計を1万円にする

2. 元利合計が10万円を超えるまで,以下を繰り返す

   2-1 年数に1加える

   2-2 前の年の元利合計に,利息分を上乗せする

3. かかった年数を表示する

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


解答例:

#include <stdio.h>

void main()
{
    int year, sum;

    year = 0;
    sum = 10000;

    while(sum<100000){
        year++;
        sum *= 1.05;
    }

    printf("%d年後です", year);
}

問題

n!をもとめる. 注意:0!=1


答え

1 n乗をもとめる変数を,1にする

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

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

  3-1 階乗にカウンタの値を乗算する
  3-2 カウンタの値に1加える


解答例:

#include <stdio.h>

void main()
{
    int factorial, i, n;

    printf("nの階乗をもとめます.n="); scanf("%d", &n);

    factorial = 1;
    for(i=1; i<=n; i++){
        factorial *= i;
    }

    printf("%dの階乗は%dです", n, factorial);
}

問題

xのn乗をもとめる. 注意:xの0乗は1


答え

これは,階乗のプログラムを理解していれば簡単ですね.

1 n乗をもとめる変数を,1にする

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

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

  3-1 xを乗算する
  3-2 カウンタの値に1加える


解答例:

#include <stdio.h>

void main()
{
    int kai, i, x, n;

    printf("xのn乗を求めます\n");
    printf("x="); scanf("%d", &x);
    printf("n="); scanf("%d", &n);

    kai = 1;

    for(i=0; i<n; i++){
        kai *= x;
    }

    printf("%dの%d乗は、%dです\n", x, n, kai);

}

問題

nが素数かどうか判定する. 素数とは,1と自分自身以外には約数を持たない数.1は素数ではない.


答え

素数かどうかを判定するには,nを2からn/2までの数で割ってみて割ることができた回数を数え,一回もわることができなかったら素数と判定すればよい.

1 もとめる値を入力する

2 値は1か

 2T 素数ではない

 2F-1 わる数を2にする

 2F-2 わる数がn/2を超えるまで,以下を繰り返す

  2F-2-1 わることのできた回数を0にする

  2F-2-2 入力された値をわる数でわったあまりが0か

   2F-2-2-T わることのできた回数に1加える

  2F-2-3 わる数に1加える

 2F-3 わることのできた回数は0か

  2F-3-T 素数

  2F-3-F 素数ではない


解答例:

#include <stdio.h>

void main()
{
    int yaku, i, n;

    printf("nが素数かどうか判定します.n="); scanf("%d", &n);

    if(n == 1){
        printf("素数ではありません");
    }else{
        yaku = 0;

        for(i=2; i<=n/2; i++){
            if(n%i == 0) yaku++;
        }

        if(yaku == 0){
            printf("素数です"); 
        }else{
            printf("素数ではありません");
        }
    }
}