見出し画像

C言語で Java Silver レベルの問題を作ってみる No.21

 プログラミング言語って、しばらく触れてないと細かな部分を忘れてしまいますよね。また、複数のプログラミング言語を習得している人は、頭がこんがりますね。

 そんな方におススメしたいのが、資格試験の問題を1日5問程度解いていく方法です。毎日のスキマ時間を活用して短時間で知識レベルを維持することが出来ますよ。Javaならば、Silverの問題集が最適です。
 Silverを既に取得している人も、これから取得を目指している人もぜひ試してみてください。

 さて、この記事では、タイトルの通り、C言語をテーマにしています。
問題を毎日5問投稿していきますので、C言語を習得中の方、C言語の知識を維持されたい方は、ぜひご活用ください。


■ 列挙型

□ 1. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

enum Weekday { SUN, MON, TUE, WED, THU, FRI, SAT };

int main() {
    enum Weekday day = WED;
    printf("%d\n", day);
    return 0;
}

A.     0
B.   1
C.   2
D.   3


□ 2. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

enum TrafficLight { RED, YELLOW = 5, GREEN };

int main() {
    enum TrafficLight light = GREEN;
    printf("%d\n", light);
    return 0;
}

A. 1
B. 2
C. 6
D. 7


3. 次の列挙型に関する説明として、正しいものを選びなさい。(1つ選択)

enum Month { JAN = 1, FEB, MAR, APR };

A. enum Month の値は変更することができる
B. enum Month の値は、整数以外のデータ型を持つことができる
C. enum Month のメンバは、値を連続して増やすことができる
D. enum Month の最初のメンバの値は、必ず0から始まる


□ 4. 次のプログラムを実行して実行結果のように出力したい。空欄に入るコードとして、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

enum Size { SMALL, MEDIUM, LARGE };

int main() {
    enum Size size;
    ____ 空欄 _____
    printf("%d\n", size);
    return 0;
}
[実行結果]
2

A.  size = LARGE;
B.  size = 1;
C.  size = MEDIUM;
D.  size = 3;


□ 5. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

typedef enum { A = 90, B = 80, C = 70, D = 60, F = 50 } Grade;

int main() {
    Grade g = B;
    printf("%d\n", g);
    return 0;
}

A.     60
B.  70
C.  80
D.  90


解答

1.D

このプログラムでは enum は列挙型を定義しています。列挙型は関連する名前付き定数を集めて扱うために使用されます。
enum Weekday という名前の列挙型が定義され、その中に SUN, MON, TUE, WED, THU, FRI, SAT という7つの定数が含まれています。
列挙型では、何も指定しない場合、最初のメンバ SUN は 0 から始まり、それ以降のメンバは1ずつ増加します。したがって、以下のように値が割り当てられます。
SUN = 0
MON = 1
TUE = 2
WED = 3
THU = 4
FRI = 5
SAT = 6

enum Weekday day = WED; の部分では、列挙型 Weekday の変数 day を宣言し、WED(水曜日)を代入しています。WED の値は3 です。
printf("%d\n", day); では、変数 day の値を %d で整数として出力します。この場合、day は 3 なので、出力は 3 となります。

2.C

このプログラムでは列挙型TrafficLight を定義しています。列挙型は、関連する名前付き定数をまとめて表現する方法です。
enum TrafficLight の中に、RED, YELLOW, GREEN という3つのメンバが定義されています。
通常、列挙型の最初のメンバには 0 が自動的に割り当てられ、それ以降のメンバは1ずつ増加します。しかし、この場合、YELLOW に値 5 が明示的に割り当てられているため、以降のメンバにはその値を基準に自動的に次の値が割り当てられます。
具体的には、以下のような値が割り当てられます:

RED = 0
YELLOW = 5
GREEN = 6 (YELLOW に 5 を指定したため、その次の値が 6 となります)

enum TrafficLight light = GREEN; の部分では、列挙型 TrafficLight の変数 light を宣言し、GREEN を代入しています。GREEN の値は 6 です。
printf("%d\n", light); では、light の値を %d(整数)として出力します。この場合、light は 6 なので、出力は 6 となります。


3.C

A. 誤りです。列挙型の各メンバ(JAN, FEB, MAR, APR)は定義時に定数値として扱われます。一度設定された列挙型の値は変更できません。JAN = 1 と定義された場合、プログラム中で JAN を他の値に変更することはできません。

B. 誤りです。C言語の列挙型は、整数型でのみ値を持つことができます。列挙型のメンバは整数として扱われ、他のデータ型(浮動小数点数や文字列など)は列挙型の値として使用できません。

C. 正しいです。この選択肢が正解です。
enum Month { JAN = 1, FEB, MAR, APR }; と定義されていますが、JAN には 1 が明示的に指定されています。これにより、FEB は 2、MAR は 3、APR は 4 と連続して値が自動的に増えます。
列挙型では、最初の値を指定すると、次のメンバにはその値に1を加えた値が自動的に割り当てられます。

D. 誤りです。列挙型の最初のメンバは、デフォルトで 0 から始まりますが、明示的に別の値を指定することもできます。この問題のように、JAN = 1 と指定されている場合は、最初の値は 1 となります。

4.A

A. size = LARGE;
LARGE は enum Size のメンバであり、LARGE の値は 2 です。この選択肢は 正しい です。
size = LARGE; とすることで、size には 2 が代入され、指定された実行結果になります。

B. size = 1;
この選択肢は 誤り です。1 は enum Size のメンバではなく、列挙型としては整数型の直接代入は避けるべきです。1 は MEDIUM に対応していますが、列挙型のメンバ名を使うべきです。

C. size = MEDIUM;
MEDIUM は enum Size のメンバで、値は 1 です。実行結果で求められている 2 にはなりません。したがって、この選択肢は 誤り です。

D. size = 3;
列挙型 enum Size の中には 3 に対応するメンバは存在しません。したがって、この選択肢も 誤り です。


5.C

typedef を使用して列挙型 enum Grade に別名 Grade を付けました。
これにより、今後 enum キーワードを使わずに Grade 型として利用できます。
main 関数内では、enum Grade ではなく Grade 型を使用しています。
これによりコードが簡潔になります。
printf("%d\n", g); で B に対応する値 80 を出力します。



本日の学習内容

お疲れ様でした。
継続は力なりです。
明日も頑張りましょう!

この記事が気に入ったらサポートをしてみませんか?