C言語入門|3章の練習問題

3章では、C言語の「値そのもの」を表す リテラル や、
計算の仕組みを支える 演算子
そしてプログラムを動かしていくうえで大切な キャスト(型変換)
さらには 乱数生成 の基礎を学びました。

C言語はとても表現力が高く、
整数・小数・文字・文字列・真偽値など、
さまざまな種類のデータを扱うことができます。
そのため、値の表現(リテラル)には複数の形があり、
例として

  • 3.14(浮動小数点数)
  • 'A'(1文字)
  • "ABC"(文字列)
  • 123L(long型)

といったように、
見た目でデータ型を判別できる 特徴があります。

また、C言語の演算子は、
足し算や掛け算だけでなく比較・論理・代入など多岐にわたり、
正しく使い分けることで思いどおりの処理が書けるようになります。

さまざまなリテラル

10 → 整数リテラル(int)
10L → longリテラル(long)
3.14 → doubleリテラル
2.5F → floatリテラル
'Z' → 文字リテラル(char)
"Hello" → 文字列リテラル(String風リテラル)

同じ「10」という数字でも、末尾に L を付けると型が変わるなど、
リテラルは「そのままの姿」でデータ型を表していることがわかります。

C言語と擬似言語の演算子の違い

種類C言語擬似言語説明
代入=左辺に値を格納する
余り%modx % 2 は、2で割った余り
比較(等しい)===C言語では = と区別
論理積&&and2条件が両方真
論理和||orどちらか真
否定!not真偽値の反転

解説
たとえば C言語で x % 2 == 1 を見ると
「奇数判定だな」とすぐに理解できます。
FE試験で x mod 2 = 1 と出てきても同じです。

キャスト(型変換)

書式

(型名) 値

int n = (int)3.7;  // 小数を整数に変換 → 3

キャストは「一時的に型を変える」仕組みで、
小数→整数などのときに利用します。

乱数生成の基礎

以下は、ランダムな0〜9を2つ生成して表示する例です。

プロジェクト名:3-15-1 ソースファイル名: sample3-15-1.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand((unsigned)time(NULL));   // 乱数のタネ

    int a = rand() % 10;   // 0〜9
    int b = rand() % 10;

    printf("Random digits: %d and %d\n", a, b);

    return 0;
}

ここまでで重要な要素が整理できたところで、3章の練習問題を提示します。

3章の練習問題

【練習3-1】

次に示すリテラルのデータ型を答えてください。

(ア) 2.71828
(イ) 'Q'
(ウ) 90000L
(エ) 45.0F
(オ) "ABC"
(カ) 250

【解答例と解説】

記号データ型解説
double小数点の付いたリテラル(F無し)
char1文字はchar
long末尾の L が long を表す
float末尾の F が float
文字列(文字列リテラル)ダブルクォートは文字列
int整数リテラル

【練習3-2】

次の式を評価したとき、左辺に格納される値とデータ型を答えてください。
エラーがある場合はエラーと書いてください。

(ア) float f = 5 * 2.5F;
(イ) char c = 66;
(ウ) int n = (int)7.9;
(エ) int x = 3.0F;
(オ) double k = 4 + 2.2;

【解答例と解説】

記号結果解説
12.5float2.5F → float演算
'B'char66 は ASCII で 'B'
7intキャストで小数部分切り捨て
エラー-浮動小数点数を暗黙にintへは代入不可
6.2double4(int)が double に拡張される

【練習3-3】

次の内容を満たすプログラムを作成してください。

(1) 画面に「数字を2つランダムに生成します。」と表示する。
(2) 0〜9 の乱数を2つ生成し、変数 x と y に代入する。
(3) 「結果:XY」と表示する(XY は作成した2つの数字)。

解答例と解説(プログラム)

プロジェクト名:3-15-2 ソースファイル名: sample3-15-2.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand((unsigned)time(NULL));

    printf("数字を2つランダムに生成します。\n");

    int x = rand() % 10;
    int y = rand() % 10;

    printf("結果:%d%d\n", x, y);

    return 0;
}

【練習3-4】

次の内容のプログラムを作成してください。

(1) 「値を入力してください。」と表示し、String型(char配列)へ入力を受け付ける。
(2) 入力値を整数に変換し、5倍する。
(3) 「元の値:X、5倍:Y」と表示する。

【解答例と解説】

プロジェクト名:3-15-3 ソースファイル名: sample3-15-3.c

#include <stdio.h>
#include <stdlib.h>

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

    printf("値を入力してください。\n");
    scanf("%s", buf);

    int num = atoi(buf);
    int result = num * 5;

    printf("元の値:%d、5倍:%d\n", num, result);

    return 0;
}

【練習3-5】

次の演算子の結果を答えてください。

(ア) 7 % 3
(イ) 5 % 2
(ウ) 8 % 4
(エ) 9 % 5
(オ) 11 % 3

【解答例】

記号結果解説
17 ÷ 3 → 余り1
1奇数判定でよく使う
08は4の倍数
49 = 5×1 + 4
211 = 3×3 + 2

【練習3-6】

次の値の組み合わせについて、
「条件が真になるか偽になるか」を答えてください。

条件式

(x % 2 == 1) && (y > 5)

(ア) x=3, y=7
(イ) x=4, y=10
(ウ) x=9, y=4
(エ) x=11, y=6

【解答例と解説】

記号結果判定理由
3は奇数、7>5
xは偶数
yが5より大きくない
11は奇数、6>5