第3章 演習問題 解答例

3.1 定数

a3-1-1.c

コメントを参考に次のプログラムの空欄部を埋めて、プログラムを完成してください。

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

int main(void)
{
    int a, b, c;
    double x;
    char ch1, ch2;
    char str[] = "SUN";       // 文字列リテラルSUNを代入

    a = 1000;                 // 10進定数 1000 を代入
    b = 0xabc;                // 16進定数 abc を代入
    c = 0777;                 // 8進定数 777 を代入
    x = 0.01;                 // 浮動小数点定数 0.01 を代入

    ch1 = 'A';                // 文字定数 A を代入
    ch2 = '8';                // 文字定数 8 を代入

    printf("str = %s\n", str);
    printf("a = %d\n", a);
    printf("b = %x\n", b);
    printf("c = %o\n", c);
    printf("x = %.2f\n", x);
    printf("ch1 = %c\n", ch1);
    printf("ch2 = %c\n", ch2);

    return 0;
}

[Back]

3.2 変数

a3-2-1.c

コメントを参考に次のプログラムの空欄部を埋めて、プログラムを完成してください。

/* a3-2-1.c */
int main(void)
{
    int a, b, c;      // 整数型の変数 a, b, c を宣言する
    double x;         // 倍長浮動小数点型の変数 x を宣言する
    float y;          // 単長浮動小数点型の変数 y を宣言する
    char ch1, ch2;    // 文字型の変数 ch1, ch2 を宣言する

    return 0;
}

このプログラムはprintfを使っていないので<stdio.h>のインクルードの必要はなく、実行結果もありません。また、変数を宣言しただけで使っていないのでコンパイル時に警告が出る場合があります。

[Back]

a3-2-2.c

次のプログラムで変数名として使えないものを答えてください。

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

int main(void)
{
    int 1answer, return, _1_2_3, INT, No.1;
    char moji1, char2, question?;
    double x_y, z-1, stdio;

    return 0;
}

1answer : 数字からは始めることができません。
return : return は予約語です。予約語は使うことができません。
No.1 : '.' が使われています。英字、数字、下線以外の文字は使えません。
question? : '?' が使われています。英字、数字、下線以外の文字は使えません。
z-1 : '-' が使われています。英字、数字、下線以外の文字は使えません。

[Back]

a3-2-3.c

次のプログラムの実行結果を考えてください。

/* a3-2-3.c */
#include <stdio.h>
int main(void)
{
    int a = 10, b = 20, c;
    double x = 0.2;
    float y;
    char c1 = 12, c2 = 34;

    c = a + b;
    a = a + 55;
    y = 3.1;
    x = x + y;
    c2 = c2 - c1;

    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    printf("x = %.1f\n", x);
    printf("y = %.1f\n", y);
    printf("c1 = %d\n", c1);
    printf("c2 = %d\n", c2);

    return 0;
}
【実行結果】

a = 65
b = 20
c = 30
x = 3.3
y = 3.1
c1 = 12
c2 = 22

[Back]

3.3 配列

a3-3-1.c

コメントを参考に空欄部を埋めてプログラムを完成してください。このプログラムは配列array2の要素を配列array1に逆順に代入します。

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

int main(void)
{
    // 要素数5の整数型配列array1を宣言
    int array1[5];
    // 整数型配列array2を 1, 2, 3, 4, 5 で初期化
    int array2[5] = {1, 2, 3, 4, 5};

    // array2の要素を逆順にarray1に代入
    array1[0] = array2[4];
    array1[1] = array2[3];
    array1[2] = array2[2];
    array1[3] = array2[1];
    array1[4] = array2[0];

    // array1の要素を表示
    printf( "array1[0] = %d\n", array1[0] );
    printf( "array1[1] = %d\n", array1[1] );
    printf( "array1[2] = %d\n", array1[2] );
    printf( "array1[3] = %d\n", array1[3] );
    printf( "array1[4] = %d\n", array1[4] );

    return 0;
}

[Back]

a3-3-2.c

コメントを参考に空欄部を埋めてプログラムを完成してください。このプログラムは配列arrayの要素を上下逆に入れ替えます。

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

int main(void)
{
    // 整数型変数tempを宣言
    int temp;
    // 整数型配列arrayを 1, 2, 3, 4, 5 で初期化
    int array[5] = {1, 2, 3, 4, 5};

    // arrayの要素を逆順にarrayに代入
    temp = array[0];
    array[0] = array[4];
    array[4] = temp;
    temp = array[1];
    array[1] = array[3];
    array[3] = temp;

    // arrayの要素を表示
    printf("array[0] = %d\n", array[0]);
    printf("array[1] = %d\n", array[1]);
    printf("array[2] = %d\n", array[2]);
    printf("array[3] = %d\n", array[3]);
    printf("array[4] = %d\n", array[4]);

    return 0;
}

array[0] = array[4]; とするとarray[0]が上書きされてしまいます。上書きする前にtemp = array[0];のように作業用の変数に要素を退避します。

[Back]

3.4 多次元配列

a3-4-1.c

プログラムs3-4-1.cを修正して科目ごとの合計点を求めてください。空欄部を埋めてプログラムを完成してください。

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

int main(void)
{
    // テストの点数 国語 数学 英語
    int ten[][3] = { {89, 65, 65},
                     {67, 88, 81},
                     {61, 45, 55},
                     {72, 95, 91} };
    int sum[3];

    // 各科目の合計点を求める
    sum[0] = ten[0][0] + ten[1][0] + ten[2][0] + ten[3][0];
    sum[1] = ten[0][1] + ten[1][1] + ten[2][1] + ten[3][1];
    sum[2] = ten[0][2] + ten[1][2] + ten[2][2] + ten[3][2];

    printf("国語の合計点 = %d\n", sum[0]);
    printf("数学の合計点 = %d\n", sum[1]);
    printf("英語の合計点 = %d\n", sum[2]);

    return 0;
}

[Back]

3.5 文字と文字列

a3-5-1.c

コメントを参考に空欄部を埋めてプログラムを完成してください。このプログラムは、char型配列strに格納されている英大文字を英小文字に変換します。ただし、文字コードはASCIIとします。

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

int main(void)
{
    // char型配列を"PEACH"で初期化
    char str[] = "PEACH";

    // 大文字 → 小文字 変換
    str[0] = str[0] + 'a' - 'A';
    str[1] = str[1] + 'a' - 'A';
    str[2] = str[2] + 'a' - 'A';
    str[3] = str[3] + 'a' - 'A';
    str[4] = str[4] + 'a' - 'A';

    printf("str = %s\n", str);

    return 0;
}

ASCIIでは 'A' 〜 'Z' のコードは 65 〜 90、'a' 〜 'z' のコードは 97 〜 122になります。つまり、大文字 + 32 は小文字のコードということになります。 このとき、'a' - 'A' でコード差が取得できるのでそれを利用します。
なお、「大文字 + 'a' - 'A'」 が小文字になるのは、ASCIIのように、大文字のコードが小文字よりも小さく、なおかつ等間隔で並んでいるものに限ります。 ですから、学習が進んだ段階では、大文字を小文字に変換する標準ライブラリ関数tolowerを用いてください。

[Back]

3.6 printf関数

a3-6-1.c

文字型配列strを文字列"SKY"で初期化し、printf関数を用いて次のように表示してください。
配列要素のstr[0]〜str[2]を各々、10進数で表示
配列要素のstr[0]〜str[2]を各々、16進数で表示
配列要素のstr[0]〜str[2]を各々、文字で表示
strの内容を文字列で表示

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

int main(void)
{
    char str[] = "SKY";

    printf("str[0] = %d %x %c\n", str[0], str[0], str[0]);
    printf("str[1] = %d %x %c\n", str[1], str[1], str[1]);
    printf("str[2] = %d %x %c\n", str[2], str[2], str[2]);
    printf("文字列 = %s\n", str);

    return 0;
}

[Back]

a3-6-2.c

実行結果例のようになるように次の空欄部を埋めてプログラムを完成してください。

【実行結果例】

氏名              身長   体重   年齢
秋本真奈美       162.4  48.50     19
朝霞裕子         157.3  58.50     18
飯島洋子         154.7  42.20     19
/* a3-6-2.c */
#include <stdio.h>

int main(void)
{
    printf("%-12s%10s%7s%7s\n", "氏名", "身長", "体重", "年齢");
    printf("%-12s%10.1f%7.2f%7d\n", "秋本真奈美", 162.4, 48.5, 19);
    printf("%-12s%10.1f%7.2f%7d\n", "朝霞裕子", 157.3, 58.5, 18);
    printf("%-12s%10.1f%7.2f%7d\n", "飯島洋子", 154.7, 42.2, 19);

    return 0;
}

[Back]

3.7 scanf関数

a3-7-1.c

次の手順でキーボードからの入力を表示して確認するプログラムを作成してください。

  1. キーボードから入力した1文字を、文字と10進数、16進数で表示して内容を確認してください。
  2. キーボードから入力した10進整数を、10進数と16進数で表示して内容を確認してください。
  3. キーボードから入力した16進整数を、10進数と16進数で表示して内容を確認してください。
  4. キーボードから入力したfloat型浮動小数点数を、表示して内容を確認してください。
  5. キーボードから入力したdouble型浮動小数点数を、表示して内容を確認してください。
/* a3-7-1.c */
#include <stdio.h>

int main(void)
{
    char    c;
    int     i;
    float   f;
    double  d;

    printf("1文字入力> ");
    scanf("%c", &c );
    printf("1文字出力:%c\n", c);
    printf("10進出力:%d\n", c);
    printf("16進出力:%x\n", c);

    printf("10進入力> ");
    scanf("%d", &i);
    printf("10進出力:%d\n", i);
    printf("16進出力:%x\n", i);

    printf("16進入力> ");
    scanf("%x", &i);
    printf("10進出力:%d\n", i);
    printf("16進出力:%x\n", i);

    printf("float入力> ");
    scanf("%f", &f);
    printf("float出力:%f\n", f);

    printf("double入力> ");
    scanf("%lf", &d);
    printf("double出力:%f\n", d);

    return 0;
}

double型の変換指定に注意してください。printfの出力変換指定は"%f"ですがscanfの入力変換指定は"%lf"です。

[Back]

a3-7-2.c

char型配列のstr[100]を宣言し、このstrに好きな文字列をキーボードから入力してください。入力したら、表示して内容を確認してください。なお、文字列の入力には必ず入力フィールド幅を指定してください。

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

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

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

    printf("入力文字列 = %s\n", str);

    return 0;
}

フィールド幅は'\0'を考えて配列の要素数-1を指定してください。

[Back]

a3-7-3.c

P.103の「文字入力が正しく行われない例」のプログラムを正しく文字入力ができるように修正してください。

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

int main(void)
{
    int a1, a2;
    char c;

    printf("数値1> ");
    scanf("%d", &a1);
    printf("文字> ");
    scanf(" %c", &c);
    printf("数値2> ");
    scanf("%d", &a2);

    printf("数値1 = %d\n", a1);
    printf("文字   = %c\n", c);
    printf("数値2 = %d\n", a2);

    return 0;
}

[Back]


Copyright© 2021 Tomoko Sugawara. All Rights Reserved.