第5章 演習問題 解答例

5.1 if文

a5-1-1.c

入力した整数値が0より小さければ「負の値を入力しました。」と表示してください。

/* a5-1-1.c */
#include <stdio.h>

int main(void)
{
    int n;

    printf("整数値を入力してください。> ");
    scanf("%d", &n);

    if (n < 0) {
        printf("負の値を入力しました。\n");
    }

    return 0;
}

[Back]

a5-1-2.c

入力した整数値が偶数なら「偶数です。」と表示してください。

/* a5-1-2.c */
#include <stdio.h>

int main(void)
{
    int n;

    printf("整数値を入力してください。> ");
    scanf("%d", &n);

    if (n % 2 == 0) {
        printf("入力値は偶数です。\n");
    }

    return 0;
}

[Back]

a5-1-3.c

点数を入力し、0点以上100点以下ではない場合には「入力エラーです。」と表示してください。

/* a5-1-3.c */
#include <stdio.h>

int main(void)
{
    int ten;

    printf("点数を入力してください。> ");
    scanf("%d", &ten);

    if (ten < 0 || ten > 100) {
        printf("入力エラーです。\n");
    }

    return 0;
}

「0点以上100点以下ではない場合」は、「0点より小さいか、あるいは100点より大きい」に書き換えることができます。
!演算子を使って、
if (!(ten >= 0 && ten <= 100)) {
    printf("入力エラーです。\n");
}
としてもいいですね。

[Back]

a5-1-4.c

入力した整数値が偶数なら「偶数です。」、奇数なら「奇数です。」と表示してください。

/* a5-1-4.c */
#include <stdio.h>

int main(void)
{
    int n;

    printf("整数値を入力してください。> ");
    scanf("%d", &n);

    if (n % 2 == 0) {
        printf("入力値は偶数です。\n");
    }
    if (n % 2 != 0) {
        printf("入力値は奇数です。\n");
    }

    return 0;
}

このプログラムは、5.1.2で学習する「if〜else〜」を使うともっと効率のよい制御ができます。

[Back]

a5-1-5.c

年齢を入力し、20歳以上なら「選挙権があります。投票に行きましょう。」と表示し、それ以外なら「選挙権がありません。」と表示してください。

/* a5-1-5.c */
#include <stdio.h>

int main(void)
{
    int age;

    printf("年齢を入力してください。> ");
    scanf("%d", &age);

    if (age >= 20) {
        printf("選挙権があります。投票に行きましょう。\n");
    }
    else {
        printf("選挙権がありません。\n");
    }

    return 0;
}

[Back]

a5-1-6.c

年齢を入力し、20歳以上60歳未満なら「国民年金に加入しなければなりません。」と表示し、それ以外なら、「国民年金に加入する必要はありません。」と表示してください。

/* a5-1-6.c */
#include <stdio.h>

int main(void)
{
    int age;

    printf("年齢を入力してください。> ");
    scanf("%d", &age);

    if (age >= 20 && age < 60) {
        printf("国民年金に加入しなければなりません。\n");
    }
    else {
        printf("国民年金に加入する必要はありません。\n");
    }

    return 0;
}

60歳は加入の必要がないので「if (age >= 20 && age < 60) {」となります。

[Back]

a5-1-7.c

入力した整数値の絶対値を表示してください。

/* a5-1-7.c */
#include <stdio.h>

int main(void)
{
    int n;

    printf("整数値を入力してください。> ");
    scanf("%d", &n);

    if (n >= 0) {
        printf("%dの絶対値は%dです。\n", n, n);
    }
    else {
        printf("%dの絶対値は%dです。\n", n, -n);
    }
    return 0;
}

入力値が負の場合に-単項演算子(P.95参照)を使用して符号を反転しています。

[Back]

a5-1-8.c

2つの整数値を入力し、大きなほうを表示してください。

/* a5-1-8.c */
#include <stdio.h>

int main(void)
{
    int n1, n2;

    printf("整数値を2個入力してください。\n");
    printf("> ");
    scanf("%d", &n1);
    printf("> ");
    scanf("%d", &n2);

    if (n1 >= n2) {
        printf("%dと%dのうち大きいほうは%dです。\n", n1, n2, n1);
    }
    else {
        printf("%dと%dのうち大きいほうは%dです。\n", n1, n2, n2);
    }
    return 0;
}

[Back]

a5-1-9.c

整数値を3個入力し、いちばん大きな値を表示してください。

/* a5-1-9.c */
#include <stdio.h>

int main(void)
{
    int a, b, c;

    printf("整数値を3個入力してください。\n");
    printf("> ");
    scanf("%d", &a);
    printf("> ");
    scanf("%d", &b);
    printf("> ");
    scanf("%d", &c);

    if (a >= b && a >= c) {
        printf("いちばん大きな値は%dです。\n", a);
    }
    else if (b >= a && b >= c) {
        printf("いちばん大きな値は%dです。\n", b);
    }
    else {
        printf("いちばん大きな値は%dです。\n", c);
    }

    return 0;
}

[Back]

a5-1-10.c

半角文字を入力し、英大文字、英小文字、数字、その他を調べて表示してください。なお、文字コードはASCIIとします。

/* a5-1-10.c */
#include <stdio.h>

int main(void)
{
    char ch;

    printf("文字を入力してください。> ");
    scanf("%c", &ch);

    if (ch >= 'A' && ch <= 'Z') {
        printf( "英大文字です。\n" );
    }
    else if (ch >= 'a' && ch <= 'z') {
        printf( "英小文字です。\n" );
    }
    else if (ch >= '0' && ch <= '9') {
        printf("数字です。\n");
    }
    else {
        printf("英字でも数字でもありません。\n");
    }

    return 0;
}

上記の方法により大文字や小文字を判別できるのは、ASCIIのように大文字や小文字のコードが連続して並んでいる場合に限られます。学習が進んだ段階では、6章で学習するisupper関数(英大文字の判定)、islower関数(英小文字の判定)、isdigit関数(数字の判定)を用いるようにしてください。

[Back]

a5-1-11.c

身長と体重を入力してローレル指数を算出し、表に従って判定結果を表示してください。

ローレル指数 結果
100未満 やせすぎ
100以上115未満 やせている
115以上145未満 普通
145以上160未満 太っている
160以上 太りすぎ

なお、ローレル指数は次の式で求めます。
 ローレル指数 = 体重(kg)÷身長3(cm)×107

/* a5-1-11.c */
#include <stdio.h>

int main(void)
{
    double rohrer, height, weight;

    printf("身長を入力してください。> ");
    scanf("%lf", &height);
    printf("体重を入力してください。> ");
    scanf("%lf", &weight);

    rohrer = weight / (height * height * height) * 10000000;

    if (rohrer < 100) {
        printf("あなたはやせすぎです。\n");
    }
    else if (rohrer < 115) {
        printf("あなたはやせています。\n");
    }
    else if (rohrer < 145) {
        printf("あなたは普通です。\n");
    }
    else if (rohrer < 160) {
        printf("あなたは太っています。\n");
    }
    else {
        printf("あなたは太りすぎです。\n");
    }

    return 0;
} 

[Back]

a5-1-12.c

国語の平均点は73点です。数学の平均点は61点です。科目と点数を入力して、平均点以上か未満かを判定してください。

/* a5-1-12.c */
#include <stdio.h>

int main(void)
{ 
    char subject;
    int ten;

    printf("科目を入力してください。(k:国語 s:数学)> ");
    scanf("%c", &subject);
    printf("点数を入力してください。 > ");
    scanf("%d", &ten);

    if (subject == 'k') {
        if (ten >= 73 && ten <= 100) {
            printf("国語の点数は平均点以上です。\n");
        }
        else if (ten >= 0 && ten < 73) {
            printf("国語の点数は平均点未満です。\n");
        }
        else {
            printf("点数の入力エラーです。\n");
        }
    }
    else if (subject == 's') {
        if (ten >= 61 && ten <= 100) {
            printf("数学の点数は平均点以上です。\n");
        }
        else if (ten >= 0 && ten < 61) {
            printf("数学の点数は平均点未満です。\n");
        }
        else {
            printf("点数の入力エラーです。\n");
        }
    }
    else {
        printf("科目の入力エラーです。\n");
    }

    return 0;
}

ネスト構造は処理がわかりづらくなります。字下げをしっかりと行い、見やすいプログラムを作成してください。

[Back]

a5-1-13.c

性別と学歴で採用人数の異なる会社があります。性別と学歴を入力し、採用人数を表示してください。

高卒専門卒大卒以上
1人3人5人
1人1人2人
/* a5-1-13.c */
#include <stdio.h>

int main(void)
{
    int sex, s_career;

    printf("性別を入力してください。(1:男 2:女)> ");
    scanf("%d", &sex);
    printf("学歴を入力してください。(1:高卒 2:専門卒 3:大卒以上)> ");
    scanf("%d", &s_career);

    if (sex == 1) {
        if (s_career == 1)  {
            printf("採用人数は1人です。\n");
        }
        else if (s_career == 2) {
            printf("採用人数は3人です。\n");
        }
        else if (s_career == 3) {
            printf("採用人数は5人です。\n");
        }
        else {
            printf("学歴の入力エラーです。\n");
        }
    }
    else if (sex == 2) {
        if (s_career == 1)  {
            printf("採用人数は1人です。\n");
        }
        else if (s_career == 2) {
            printf("採用人数は1人です。\n");
        }
        else if (s_career == 3) {
            printf("採用人数は2人です。\n");
        }
        else {
            printf("学歴の入力エラーです。\n");
        }
    }
    else {
        printf("性別の入力エラーです。\n");
    }

    return 0;
}

このプログラムは、5.2節で学習する「switch文」を使って処理を振り分けてもいいですね。

[Back]

5.2 switch文

a5-2-1.c

入力した文字が、「a」なら「apple」、「b」なら「banana」、「c」なら「cherry」、それ以外なら「tomato」と表示してください。

/* a5-2-1.c */
#include <stdio.h>

int main(void)
{
    char ch;

    printf("アルファベットを入力してください。> ");
    scanf("%c", &ch);

    switch (ch) {
        case 'a':
            printf("apple\n");
            break;
        case 'b':
            printf("banana\n");
            break;
        case 'c':
            printf("cherry\n");
            break;
        default:
            printf("tomato\n");
            break;
    }

    return 0;
}

[Back]

a5-2-2.c

キーボードから入力した整数値を3で割り、
割り切れれば「〜は3で割り切れます。」
余りが1なら「〜を3で割った余りは1です。」
余りが2なら「〜を3で割った余りは2です。」
と表示してください(〜には入力した整数値が表示されます)。

/* a5-2-2.c */
#include <stdio.h>

int main(void)
{
    int n;

    printf("整数値を入力してください。> ");
    scanf("%d", &n);

    switch (n % 3) {
        case 0:
            printf("%dは3で割り切れます。\n", n);
            break;
        case 1:
            printf("%dを3で割った余りは1です。\n", n);
            break;
        default:
            printf("%dを3で割った余りは2です。\n", n);
            break;
    }

    return 0;
}

[Back]

a5-2-3.c

4月1日時点の満年齢を入力し、
7、8、9ならば「小学校低学年です。」
10、11、12ならば「小学校高学年です。」
13、14、15ならば「中学生です。」
それ以外なら「義務教育年齢ではありません。」
と表示してください。

/* a5-2-3.c */
#include <stdio.h>

int main(void)
{
    int age;

    printf("4月1日時点の満年齢を入力してください。> ");
    scanf("%d", &age);

    switch (age) {
        case 7:
        case 8:
        case 9:
            printf("小学校低学年です。\n");
            break;
        case 10:
        case 11:
        case 12:
            printf("小学校高学年です。\n");
            break;
        case 13:
        case 14:
        case 15:
            printf("中学生です。\n");
            break;
        default:
            printf("義務教育年齢ではありません。\n");
            break;
    }
    
    return 0;
}

[Back]

a5-2-4.c

計算方法(+、-、*、/)と2個の整数値を入力し計算を行ってください。ただし、除算を指定した場合には0で割り算をしないように制御してください。

/* a5-2-4.c */
#include <stdio.h>

int main(void)
{
    char calculation;
    int n1, n2;

    printf("計算方法(+、-、*、/)を入力してください。> ");
    scanf("%c", &calculation);
    printf("整数値を2個入力してください。\n");
    printf("> ");
    scanf("%d", &n1);
    printf("> ");
    scanf("%d", &n2);

    switch (calculation) {
        case '+':
            printf("%d + %d = %d\n", n1, n2, n1 + n2);
            break;
        case '-':
            printf("%d - %d = %d\n", n1, n2, n1 - n2);
            break;
        case '*':
            printf("%d * %d = %d\n", n1, n2, n1 * n2);
            break;
        case '/':
            if (n2 != 0) {
                printf("%d / %d = %d\n", n1, n2, n1 / n2);
            }
            else {
                printf("0で割ることはできません\n");
            }
            break;
        default:
            printf("計算方法の入力エラーです\n");
            break;
    }

    return 0;
}

[Back]

5.3 for文

a5-3-1.c

1から10までを順番に表示してください。

/* a5-3-1.c */
#include <stdio.h>

int main(void)
{
    int i;

    for (i = 1; i <= 10; i++) {
        printf("%d ", i);
    }

    return 0;
}

[Back]

a5-3-2.c

10から2まで偶数のみを降順に表示してください。

/* a5-3-2.c */
#include <stdio.h>

int main(void)
{
    int i;

    for (i = 10; i >= 2; i-=2) {
        printf("%d ", i);
    }

    return 0;
}

[Back]

a5-3-3.c

32以下の2のべき乗を昇順に表示してください。

/* a5-3-3.c */
#include <stdio.h>

int main(void)
{
    int i;

    for (i = 2; i <= 32; i*=2) {
        printf("%d ", i);
    }

    return 0;
}

[Back]

a5-3-4.c

半径1.0以上2.0以下まで0.1刻みで円の面積を表示してください。

/* a5-3-4.c */
#include <stdio.h>

int main(void)
{
    int i;
    double x;

    for (i = 10; i <= 20; i++) {
        x = i / 10.0;
        printf("%f\n", x * x * 3.14159);
    }

    return 0;
}

次のようにdouble型の変数xを直接インデックス変数にすると誤差を生じる可能性があります。

 for (x = 1.0; x <= 2.0; x += 0.1) /* 誤差を生じる可能性がある */

誤差を防ぐためにインデックス変数は整数型を用いましょう。

[Back]

a5-3-5.c

開始の数から終了の数までの和を求めてください。

/* a5-3-5.c */
#include <stdio.h>

int main(void)
{
    int i, start, end, sum = 0;
    
    printf("開始 > ");
    scanf("%d", &start);
    printf("終了 > ");
    scanf("%d", &end);
    
    for (i = start; i <= end; i++) {
        sum += i;
    }
    printf("%d から %d までの和は %d です。", start, end, sum);

    return 0;
}

[Back]

a5-3-6.c

要素数5のint型配列へ先頭から順に5〜1の値を代入してください。

/* a5-3-6.c */
#include <stdio.h>

int main(void)
{
    int i, array[5];
    
    for (i = 0; i < 5; i++) {
        array[i] = 5 - i;
        printf("array[%d] = %d\n", i, array[i]);
    }
    return 0;
}

[Back]

a5-3-7.c

要素数10のdouble型配列へ先頭から順に0.1〜1.0の値を代入してください。

/* a5-3-7.c */
#include <stdio.h>

int main(void)
{
    int i;
    double array[10];
    
    for (i = 0; i < 10; i++) {
        array[i] = (i + 1) / 10.0;
        printf("array[%d] = %.1f\n", i, array[i]);
    }
    return 0;
}

「(i + 1) / 10」は「(int型+int型) / int型」なので小数点以下の演算ができません。浮動小数点型の結果を得るために「10.0」で除算し、「(i + 1) / 10.0」としています。

[Back]

a5-3-8.c

配列に格納された5人の学生の点数(78、68、90、45、81)の合計点と平均点を求めてください。

/* a5-3-8.c */
#include <stdio.h>

int main(void)
{
    int i, ten[5] = {78, 68, 90, 45, 81}, sum = 0;
    double avg;
    
    for (i = 0; i < 5; i++) {
        sum += ten[i];
    }
    printf("合計点 = %d\n", sum);
    printf("平均点 = %.1f\n", sum / 5.0);
    
    return 0;
}

[Back]

a5-3-9.c

配列に格納された5人の学生の点数(78、68、90、45、81)の最高点と最低点を求めてください。

/* a5-3-9.c */
#include <stdio.h>

int main(void)
{
    int i, ten[5] = {78, 68, 90, 45, 81}, max, min;

    max = min = ten[0];
    
    for (i = 1; i < 5; i++) {
        if (max < ten[i]) {
            max = ten[i];
        }
        if (min > ten[i]) {
            min = ten[i];
        }
    }
    printf("最高点 = %d\n", max);
    printf("最低点 = %d\n", min);
    
    return 0;
}

[Back]

a5-3-10.c

要素数7のint型配列に整数値を入力し、その要素を逆順に入れ替えてください。

/* a5-3-10.c */
#include <stdio.h>

int main(void)
{
    int i, array[7], work;

    for (i = 0; i < 7; i++) {
        printf("%d番目 > ", i);
        scanf("%d", &array[i]);
    }
    for (i = 0; i < 3; i++) {
        work = array[i];
        array[i] = array[6 - i];
        array[6 - i] = work;
    }
    printf("入れ替え後\n");
    for (i = 0; i < 7; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }

    
    return 0;
}

[Back]

a5-3-11.c

実行結果例のように1〜7までの数字を4行表示してください。

【実行結果例】

1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7
/* a5-3-11.c */
#include <stdio.h>

int main(void)
{
    int i,n;

    for (n = 1; n <= 4; n++) {
        for (i = 1; i <= 7; i++) {
            printf("%d ", i);
        }
        printf("\n");
    }
    
    return 0;
}

[Back]

a5-3-12.c

実行結果例のように数字を三角形に表示してください。

【実行結果例】

1 
2 2 
3 3 3 
4 4 4 4 
5 5 5 5 5
/* a5-3-12.c */
#include <stdio.h>

int main(void)
{
    int i,n;

    for (n = 1; n <= 5; n++) {
        for (i = 1; i <= n; i++) {
            printf("%d ", n);
        }
        printf("\n");
    }
    
    return 0;
}

[Back]

a5-3-13.c

実行結果例のように数字を逆三角形に表示してください。

【実行結果例】

1 2 3 4 5 
1 2 3 4 
1 2 3 
1 2 
1
/* a5-3-13.c */
#include <stdio.h>

int main(void)
{
    int i,n;

    for (n = 5; n >= 1; n--) {
        for (i = 1; i <= n; i++) {
            printf("%d ", i);
        }
        printf("\n");
    }
    
    return 0;
}

[Back]

a5-3-14.c

0〜9までの3つの整数の和が入力した合計値になる組み合わせは何通りあるか求めてください。

/* a5-3-14.c */
#include <stdio.h>

int main(void)
{
    int a, b, c, n, count = 0;
    
    printf("合計値を入力してください。 > ");
    scanf("%d", &n);

    for (a = 0; a <= 9; a++) {
        for (b = 0; b <= 9; b++) {
            for (c = 0; c <= 9; c++) {
                if (a + b + c == n) {
                    printf("(%d, %d, %d)\n", a, b, c);
                    count++;
                }
            }
        }
    }
    printf("合計値が%dになる組み合わせは%d通りです。\n", n, count);
    return 0;
}

[Back]

a5-3-15.c

実行結果例のように九九の表を表示してください。

【実行結果例】

   * * * 九九の表 * * *
   |  1  2  3  4  5  6  7  8  9
--------------------------------
1  |  1  2  3  4  5  6  7  8  9
2  |  2  4  6  8 10 12 14 16 18
3  |  3  6  9 12 15 18 21 24 27
4  |  4  8 12 16 20 24 28 32 36
5  |  5 10 15 20 25 30 35 40 45
6  |  6 12 18 24 30 36 42 48 54
7  |  7 14 21 28 35 42 49 56 63
8  |  8 16 24 32 40 48 56 64 72
9  |  9 18 27 36 45 54 63 72 81
/* a5-3-15.c */
#include <stdio.h>

int main(void)
{
    int i, x, y;

    printf("   * * * 九九の表 * * *\n");
    printf("   |");
    for (i = 1; i <= 9; i++) {
        printf("%3d", i);
    }

    printf("\n--------------------------------\n");

    for (x = 1; x <= 9; x++) {
        printf("%d  |", x);
        for (y = 1; y <= 9; y++) {
            printf("%3d", x*y);
        }
        printf("\n");
    }
    return 0;
}

[Back]

a5-3-16.c

実行結果例のように、配列の要素それぞれに格納された数値と同じ数の*を表示して横棒グラフを作ってください。

【実行結果例】

 6|******
 8|********
13|*************
20|********************
17|*****************
15|***************
 8|********
 5|*****
 3|***
 1|*
/* a5-3-16.c */
#include <stdio.h>
#define N 10

int main(void)
{
    int array[N] = {6, 8, 13, 20, 17, 15, 8, 5, 3, 1};
    int i, j;

    for (i = 0; i < N; i++) {
        printf("%2d|", array[i]);
        for (j = 0; j < array[i]; j++)
            printf("*");
        printf("\n");
    }
    
    return 0;
}

[Back]

5.4 while文

a5-4-1.c

整数値を2つ入力し、その数字が異なるまで、入力処理を続けてください。

/* a5-4-1.c */
#include <stdio.h>

int main(void)
{
    int n1 = 0, n2 = 0;

    while (n1 == n2) {
        printf("数字を2つ入力してください。> ");
        scanf("%d%d", &n1, &n2);
    }
    printf("値が異なります。\n");

    return 0;
}

[Back]

a5-4-2.c

1024以下の2のべき乗を求めてください。

/* a5-4-2.c */
#include <stdio.h>

int main(void)
{
    int n = 2, cnt = 1;

    while (n <= 1024) {
        printf("2の%d乗は%d\n", cnt, n);
        n *= 2;
        cnt++;
    }

    return 0;
}

[Back]

a5-4-3.c

文字列を入力し、縦に表示してください。

/* a5-4-3.c */
#include <stdio.h>

int main(void)
{
    char str[100];
    int i;

    printf("文字列を入力してください。> ");
    scanf("%99s", str);

    i = 0;
    while (str[i] != '\0') {
        printf("%c\n", str[i]);
        i++;
    }

    return 0;
}

[Back]

a5-4-4.c

同じ長さの文字列を2つ入力し、同じ文字列なら、「等しい文字列を入力しました。」、異なるなら「異なる文字列を入力しました。」と表示してください。

/* a5-4-4.c */
#include <stdio.h>

int main( void )
{
    char str1[100], str2[100];
    int flg = 0;
    int i = 0;

    printf("同じ長さの文字列を2つ入力してください。\n");
    printf("> ");
    scanf("%99s", str1);
    printf("> ");
    scanf("%99s", str2);

    while (str1[i] != '\0') {
        if (str1[i] != str2[i]) {
            flg = 1;    /* 異なる場合チェック */
        }
        i++;
    }
    if (flg == 0) {
        printf("等しい文字列を入力しました。\n");
    }
    else {
        printf("異なる文字列を入力しました。\n");
    }

    return 0;
}

このプログラムは文字列を先頭から順番に比較し、異なる場合には変数flgを1にしています。全文字列の比較が終了した時点で再度flgを確認し、0のままなら一度も異なる文字がなかったことになります。このように、状態の有無を一時的に記憶する変数をフラグと呼びます。

a5-4-4.cでは、"ABC"と"ABCD"のように、文字列が途中まで等しく長さが異なる場合にも、等しい文字列だと判定します。これは、文字列1が'\0'になった時点で、文字列2に文字が残っていても比較処理が終了するためです。終了時まで異なる文字が出現しないのでフラグは0のままなのです。正しく比較を行うためには5.6で学習するbreakを使うといいでしょう。同様の問題をa5-6-3.cとして用意しています。

[Back]

a5-4-5.c

1から10までを順番に表示してください。

/* a5-4-5.c */
#include <stdio.h>

int main(void)
{
    int i;

    i = 1;
    while (i <= 10) {
        printf("%d ", i);
        i++;
    }

    return 0;
}

[Back]

a5-4-6.c

10から2まで偶数のみを降順に表示してください。

/* a5-4-6.c */
#include <stdio.h>

int main(void)
{
    int i;

    i = 10;
    while (i >= 2) {
        printf("%d ", i);
        i-=2;
    }

    return 0;
}

[Back]

a5-4-7.c

32以下の2のべき乗を昇順に表示してください。

/* a5-4-7.c */
#include <stdio.h>

int main(void)
{
    int i;

    i = 2;
    while (i <= 32) {
        printf("%d ", i);
        i*=2;
    }

    return 0;
}

[Back]

a5-4-8.c

実行結果例のように数字を山形に表示してください。

【実行結果例】

1
12
123
1234
12345
123456
1234567
/* a5-4-8.c */
#include <stdio.h>

int main(void)
{
    int i,n;

    n = 1;
    while (n <= 7) {
        i = 1;
        while (i <= n) {
            printf("%d", i);
            i++;
        }
        printf("\n");
        n++;
    }
    
    return 0;
}

[Back]

a5-4-9.c

二次元配列に初期化された以下の要素の合計を行ごとに表示してください。
{ {12, 3, 5, 7, -1}, {7, 61, -1}, { 89, 55, 27, -1}, {-1} };
ただし、各行の要素のストッパーは-1であり、行の先頭に-1が格納されている場合は処理を終了します。

/* a5-4-9.c */
#include <stdio.h>

int main(void)
{
    int array[4][5] = { {12, 3, 5, 7, -1}, {7, 61, -1}, { 89, 55, 27, -1}, {-1} };
    int i, j, sum;

    i = 0;
    while (array[i][0] != -1) {
        sum = 0;
        j = 0;
        while (array[i][j] != -1) {
            printf("%d ", array[i][j]);
            sum += array[i][j];
            j++;
        }
        printf("の合計は %d\n", sum);
        i++;
    }

    return 0;
}

[Back]

a5-4-10.c

二次元配列に初期化された複数の文字列を逆さまに表示してください。

/* a5-4-10.c */
#include <stdio.h>

int main(void)
{
    char str[3][8] = {"cabbage", "carrot", "onion"};
    int i, n;

    for (i = 0; i < 3; i++) {
        n = 0;
        while (str[i][n] != '\0') {
            n++;
        }
        while (n > 0) {
            n--;
            printf("%c", str[i][n]);
        }
        printf("\n");
    }

    return 0;
}

まず、文字列終了の'\0'まで添字のnを進めます。そのあと、nを戻しながら文字を表示します。

[Back]

5.5 do〜while文

a5-5-1.c

整数型変数data1に1000が初期化されています。変数data2に整数値を入力し、data1からdata2を引き、data1が0以下になるまで結果を確認しながら繰り返してください。

/* a5-5-1.c */
#include <stdio.h>

int main(void)
{
    int data1 = 1000;
    int data2;

    do {
        printf("整数値を入力 > ");
        scanf("%d", &data2);
        data1 -= data2;
        printf("data1 = %d\n", data1);
    } while (data1 > 0);
    printf("処理終了\n");

    return 0;
}

[Back]

a5-5-2.c

正しい答えを入力するまで計算式を表示するプログラムを作成してください。

/* a5-5-2.c */
#include <stdio.h>

int main(void)
{
    int a = 987, b = 6543, c;

    do {
        printf("%d + %d の答えは?\n", a, b);
        printf("> ");
        scanf("%d", &c);
    } while (c != a + b);
    printf("正しい結果を入力しました。\n");

    return 0;
}

[Back]

a5-5-3.c

誕生月を入力し誕生石を答えるプログラムを、継続を希望する間続けるプログラムを作成してください。

/* a5-5-3.c */
#include <stdio.h>

int main(void)
{
    int birth, yn;

    do {
        printf("あなたの生まれ月を入力してください。> ");
        scanf("%d", &birth);
        switch (birth) {
            case 1: printf("あなたの誕生石は「ガーネット」です。\n");
                    break;
            case 2: printf("あなたの誕生石は「アメジスト」です。\n");
                    break;
            case 3: printf("あなたの誕生石は「アクアマリン」です。\n");
                    break;
            case 4: printf("あなたの誕生石は「ダイアモンド」です。\n");
                    break;
            case 5: printf("あなたの誕生石は「エメラルド」です。\n");
                    break;
            case 6: printf("あなたの誕生石は「ムーンストーン」です。\n");
                    break;
            case 7: printf("あなたの誕生石は「ルビー」です。\n");
                    break;
            case 8: printf("あなたの誕生石は「ペリドット」です。\n");
                    break;
            case 9: printf("あなたの誕生石は「サファイア」です。\n");
                    break;
            case 10: printf("あなたの誕生石は「オパール」です。\n");
                    break;
            case 11: printf("あなたの誕生石は「トパーズ」です。\n");
                    break;
            case 12: printf("あなたの誕生石は「トルコ石 」です。\n");
                    break;
            default: printf("入力エラーです。\n");
                    break;
        }
        printf("続けますか?(1:yes / 2:no) > ");
        scanf("%d", &yn);
    } while (yn == 1);

    return 0;
}

[Back]

5.6 break文

a5-6-1.c

あらかじめ決めた数を当てるゲームのプログラムを次の要領で作成してください。
5回以内に当たれば、数字を入力した回数を表示します。5回以内に当たらなければ、当たりの数字を表示します。

/* a5-6-1.c */
#include <stdio.h>
#define HITNO 5

int main(void)
{
    int i, no;

    printf("数当てゲームです。\n");
    for (i = 1; i <= 5; i++) {
        printf("1〜10の整数値を入力してください。> ");
        scanf("%d", &no);
        if (no == HITNO)
            break;
    }
    if (i <= 5) {
        printf("%d回目で当たりです。\n", i);
    }
    else {
        printf("残念でした。当たりは%dです。\n", HITNO);
    }

    return 0;
}

[Back]

a5-6-2.c

3回買い物をしてお小遣いを使うプログラムを作成してください。ただし、お小遣いを使い切ったり、足りなくなったりしたときには、買い物を中止してください。

/* a5-6-2.c */
#include <stdio.h>

int main(void)
{
    int money = 1000, pay, i;

    printf("お小遣いを%d円持っています。\n", money);
    for (i = 1; i <= 3; i++) {
        printf("いくら使いますか? > ");
        scanf("%d", &pay);
        money -= pay;
        if (money <= 0)
            break;
    }
    if (money > 0) {
        printf("お小遣いは%d円余りました。\n", money);
    }
    else if (money == 0){
        printf("お小遣いは使い切りました。\n");
    }
    else {
        printf("お小遣いは%d円足りなくなりました。\n", -money);
    }

    return 0;
}

[Back]

a5-6-3.c

文字列を2つ入力し、この2つの文字列が同じ文字列ならば「等しい文字列を入力」と表示し、異なるならば「異なる文字列を入力」と表示してください。

/* a5-6-3.c */
#include <stdio.h>

int main(void)
{
    char str1[100], str2[100];
    int i = 0;

    printf("文字列を2個入力してください。\n");
    printf("> ");
    scanf("%99s", str1);
    printf("> ");
    scanf("%99s", str2);

    while (str1[i] != '\0') {
        if (str1[i] != str2[i])
            break;
        i++;
    }
    if (str1[i] != str2[i]) {
        printf("異なる文字列を入力しました。\n");
    }
    else {
        printf("等しい文字列を入力しました。\n");
    }

    return 0;
}

ループを終了するのは、文字列すべてを比較した場合('\0'まで文字列の比較をした場合)と、異なる文字の出現によって途中で繰り返しをbreakした場合の2通りです。このとき変数iは繰り返しを終えたときの添字を保持しています。そこで再び添字の指す文字を比較すれば最後まで文字列を比較したか(ともに'\0'を指す場合)と異なる文字の出現で繰り返しを終えたのかを判断することができます。
仮に"ABC"と"ABCD"のように文字列が途中まで等しく長さが異なる場合にも、'\0'と'D'を比較することになるので異なる文字列だと判定することができます。

[Back]

5.7 continue文

a5-7-1.c

実行結果例のように繰り返し整数値を2個入力し、割り算の商と余りを表示してください。ただし、割る数に0が入力された場合には計算をスキップし、次の入力をしてください。

【実行結果例】

整数値を2個入力してください。
> 563
56 ÷ 3 = 18 余り 2
続けますか?(1:yes 2:no)> 1
整数値を2個入力してください。
> 780
0では割り算はできません。
整数値を2個入力してください。
> 78-8
78 ÷ -8 = -9 余り 6
続けますか?(1:yes 2:no)>2
/* a5-7-1.c */
#include <stdio.h>

int main(void)
{
    int x, y, yn = 1;

    do {
        printf("整数値を2個入力してください。\n");
        printf("> ");
        scanf("%d", &x);
        printf("> ");
        scanf("%d", &y);
        if (y == 0) {
            printf("0では割り算はできません。\n");
            continue;
        }
        printf("%d ÷ %d = %d 余り %d\n", x, y, x / y, x % y);
        printf("続けますか?(1:yes 2:no)> ");
        scanf("%d", &yn);
    } while (yn == 1);

    return 0;
}

[Back]

a5-7-2.c

P.172のa5-5-3.cを、2次元配列jewel[12][20]を使って宝石名を管理するように書き換えてください。このとき、配列要素を超えてアクセスできないようにしてください。

/* a5-7-2.c */
#include <stdio.h>

int main(void)
{
    int birth, yn = 1;
    char jewel[12][20] = { 
        "ガーネット", "アメジスト", "アクアマリン", "ダイアモンド",
        "エメラルド", "ムーンストーン", "ルビー"," ペリドット",
        "サファイア", "オパール", "トパーズ", "トルコ石"
    };

    do {
        printf("あなたの生まれ月を入力してください。> ");
        scanf("%d", &birth);
        if (birth < 1 || birth > 12) {
            printf("生まれ月の入力エラーです。\n");
            continue;
        }
        printf("あなたの誕生石は「%s」です。\n", jewel[birth - 1]);
        printf("続けますか?(1:yes / 2:no) > ");
        scanf("%d", &yn);
    } while (yn == 1);

    return 0;
}

[Back]


Copyright© 2006,2012 Tomoko Sugawara. All Rights Reserved.