C言語(4) くり返しと分岐の練習問題 解答例と解説

スポンサーリンク

練習問題の解答

練習1

実行結果が以下のように表示されるプログラムを作ってください。

I have a pen.

解答例

#include <stdio.h>

void main()
{
    printf("I have a pen.¥n");
}

解説

Hello Worldを表示するプログラムとほとんど同じですね。

printf関数の表示内容を”Hello World!¥n”から”I have a pen.¥n”に書き換えただけですね。

練習2

実行結果が以下のように表示されるプログラムを作ってください。

I have 2 pens.
I have 4 pens.
I have 6 pens.
I have 8 pens.
I have 10 pens.

解答例

#include <stdio.h>
  
void main()
{
    int a;
    for(a = 2; a <= 10; a += 2)
    {
        printf("I have %d pens.¥n", a);
    }
}

解説

数値が2から始まり2ずつ増えるようにするためにfor文でくり返しをしています。

まずaの最初の値2をfor文の①の場所に a = 2 と書きます。

次に10になるまでくり返したいので、for文の②の場所にループ条件 a <= 10 を書きます。

くり返す際にaは2ずつ増やしていきたいので、for文の③の場所に a += 2 を書きます。

これは a = a + 2 と同じで、「aに2を足した値(=の右側)を新たにa(=の左側)に代入する」という意味になります。

C言語で=は「等しい」の意味ではなく、「右の値を左に代入する」という意味になりますので注意してください。

そして、for文の中身として前の問題でも出てきたprintf関数を使います。

ここで表示する内容の部分に %d が含まれていることがポイントです。

%dは整数を表示するための記号で、%dの部分をカンマ(,)の次に登場するものの値で置き換えて表示するという意味になります。

カンマの後ろに登場するのはaなので、aの値を%dの部分に当てはめて表示することになります。

これでくり返しの最中に2ずつ増えていく変数aの値を表示できる訳です。

こんな難しそうな書き方をしなくても次のようにすればできるじゃないか!と思うかもしれません。 

#include <stdio.h>

void main()
{
    printf("I have 2 pens.¥n");
    printf("I have 4 pens.¥n");
    printf("I have 6 pens.¥n");
    printf("I have 8 pens.¥n");
    printf("I have 10 pens.¥n");
}

確かにこれでも正解です。しかし、あまり良いプログラムとは言えません。

例えば、表示する数値が1000までだったらどうでしょう?

printfの行をたくさん書かないといけませんね。

たくさん書いているうちに間違えてしまうかもしれません。

for文を使ったプログラムだとfor文の②の部分を a <= 1000 としてあげるだけで1000まで表示するプログラムになります。

このように、プログラミングでは数値などを変えることはよくあって、変更をしやすく書いたり、似たような処理はできる限り共通の処理として書いておくことが大事です。

練習3

実行結果が以下のように表示されるプログラムをforとifを使って作ってください。 

1 is an odd number.
2 is an even number.
3 is an odd number.
4 is an even number.
5 is an odd number.

解答例

#include <stdio.h>
  
void main()
{
    int a;
    for(a = 1; a <= 5; a++)
    {
        if(a % 2 == 1)
        {
            printf("%d is an odd number.¥n", a);
        }
        else
        {
            printf("%d is an even number.¥n", a);
        }
    }
}

解説

奇数の時にodd、偶数の時にevenと表示したいので、くり返しの中で偶数か奇数かを判別して分岐しています。

奇数とは2で割った余りが1となる数なので、余りを計算する記号%を使って if(a % 2 == 1) として、「aを2で割った余りが1に等しいとき」という条件の分岐を作ります。

ifの条件が成り立つ時の処理として、奇数(odd)用のprintf文を書いています。

elseの方はifの条件が成り立たない時の処理を書くので、偶数(even)用のprintf文を書いています。

これでforループの最中にaの値が1から5まで増えていき、odd→even→odd→evenと表示の処理が切り替わりながら進んでいきます。 

練習4

以下の実行例のように、1から始まる整数を -> の左側に、その整数の2乗の値を -> の右側に順に表示し、2乗の値(右側)が1000を超えたらそこで終了するプログラムをwhileを使って作ってください。 

1 -> 1
2 -> 4
3 -> 9
4 -> 16
  : (省略)

解答例

#include <stdio.h>

void main()
{
    int a, answer;
    a = 1;
    answer = 0;
    while(answer <= 1000)
    {
        answer = a * a;
        printf("%d -> %d¥n", a, answer);
        a++;
    }
}

解説

まずaに1を代入し、whileループの最後の a++; でaに1を足しています。a++; は a = a + 1; と同じ意味です。

whileループのくり返し条件はaが1000以下であることとしています。

whileループの中身で answer = a * a; としてaの2乗をanswerに代入しています。

aとanswerの2つの変数を表示するために printf(“%d -> %d¥n”, a, answer); として”~”の中に%dを2つ書き、そのあとにaとanswerをカンマ区切りで書いています。 

もう1点、ここで新しい内容を説明します。

aの初期値を代入している a = 1; の次の行で、answer = 0; としてanswerにも初期値0を代入しています。

while文のくり返し条件としてanswerを使っていますが、もしanswerに初期値を与えていない場合、answerの値はどうなっているのでしょう?

実は何らかの値になってしまい、実行するたびに動作が異なるといったことが起きてしまいます。

もし、その何らかの値が1000よりも大きかった場合、最初のループ条件が成立しないので、ループの中身は一度も実行されずにプログラムが終了してしまいます。

これを防ぐためにanswerに初期値を与えています。

練習5

100以下の素数を空白区切りで表示するプログラムを作ってください。

素数とは「1より大きい整数で、1と自分自身でしか割り切れない数」のことです。

2 3 5 7 ...(省略)... 97

解答例

#include <stdio.h>

void main()
{
    int a, b, check;
    for(a = 2; a <= 100; a++)
    {
        check = 0;
        for(b = 2; b < a; b++)
        {
            if(a % b == 0)
            {
                check = 1;
                break;
            }
        }
        if(check == 0)
        {
            printf("%d ", a);
        }
    }
    printf("¥n");
}

解説

ある整数が素数かどうかを調べるために、他の整数では割り切れないことをチェックします。

当然、その数より大きい数では割り切れないので、自分自身より小さい数で割り切れるかどうかをチェックします。 

最初のforループでaを2から100まで変化させるくり返しをしています。

forループの中にさらにforループを作っているのがこのプログラムのポイントです。

2つ目のforループでは、aが他の数で割り切れるかチェックするために、割る数bを2からa未満の整数として変化させ、aがbで割り切れるか if(a % b == 0) としてチェックしています。

もし割り切れるbが存在するならその時のaは素数ではないということになります。

このチェック結果を表すためにcheckという変数を作っています。

2つ目のループを開始する前にcheckに0を入れておき、割り切れる場合はcheckに1を代入します。

割り切れる数が1つでも見つかったら、素数でないことが確定し、それ以降の数をチェックする必要がないので、forループから出るために break; を使用します。

これで2つ目のループ(bを変化させているループ)の次の行に処理が進みます。

if(check == 0) でcheckの値が0かどうかを確認し、0なら割り切れる数が見つからなかったということなのでaの値を表示しています(1なら割り切れる数があって素数ではないため何もしない)。

プログラム最後の printf(“¥n”); は改行を表示しています。

いかがでしたでしょうか? 練習5は難しかったかもしれませんが、こんな風にループと分岐を使えると色々なプログラムを書けるようになると思います。

まとめ

変数の使い方、表示のしかた、四則演算、分岐とループを学び、それらを使ったプログラミングに挑戦していただきました。

この内容を理解して使いこなせるようになったら、プログラミングの基礎はできたと言えます。

中には難しい問題もあったので、理解できなかった方もいるかもしれません。

私のサイト以外でもプログラミングの基礎を教えてくれるサイトはあります。

また、以下のようなプログラミング教室もあります。

どれも無料体験ができますので、試してみるのも良いと思います。

子供向け:
オーダーメイド型子ども向けプログラミング・ロボット教室【LITALICOワンダー】

大人向け:
世界最大級のオンライン学習サイトUdemy

ご自身に合った学習方法を見つけていただけたらと思います。

プログラミングを学んだら、電子工作に活かすことができるので、ものづくりを楽しみましょう!

タイトルとURLをコピーしました