見出し画像

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

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

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

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


■ 共用体

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

#include <stdio.h>

union Value {
    int x;
    char y;
};

int main() {
    union Value val;
    val.x = 65;
    printf("%c\n", val.y);
    return 0;
}

A.     A
B.  65
C.   B
D.  0


□ 2. 次の共用体に関する説明として、正しいものを選びなさい。(1つ選択)

A. 共用体は複数のメンバーを同時に持つことができる
B.    共用体のサイズは、最も大きいメンバーのサイズに基づく
C. 共用体のメンバーは常に初期化される
D. 共用体は、メンバーの型によって異なるサイズを持つことができる


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

#include <stdio.h>

typedef struct Employee {
    int id;
    char name[50];
} Employee;

typedef union Data {
    Employee emp;
    int age;
} Data;

int main() {
    Data data;
    data.age = 30;

    printf("Age: %d\n", data.age);
    return 0;
}

A. 「Age: 未定義の値」が出力される
B. 「Age: 30」が出力される
C.  コンパイルエラーが発生する
D.  実行時エラーが発生する

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

#include <stdio.h>

typedef union Kyuyo {  /* 給与の共用体 */
    int jikyu;         /* 時給 */
    int nikkyu;        /* 日給 */
    int gekkyu;        /* 月給 */
} Kyuyo;

typedef struct Jyugyoin {  /* 従業員の構造体 */
    int number;           /* 従業員番号 */
    char *name;           /* 名前 */
    int kyuyotype;        /* 給与のタイプを判別するためのフィールド */
    Kyuyo k;              /* 給与情報を持つ共用体 */
} Jyugyoin;

void displayEmployeeInfo(Jyugyoin emp) {
    printf("Employee Number: %d\n", emp.number);
    printf("Name: %s\n", emp.name);
    if (emp.kyuyotype == 1) {
        printf("Hourly Wage: %d\n", emp.k.jikyu);
    } else if (emp.kyuyotype == 2) {
        printf("Daily Wage: %d\n", emp.k.nikkyu);
    } else {
        printf("Monthly Salary: %d\n", emp.k.gekkyu);
    }
}

int main() {
    Jyugyoin employee;    /* 従業員の変数を宣言 */
    employee.number = 101; /* 従業員番号を設定 */
    employee.name = "Alice"; /* 名前を設定 */
    employee.kyuyotype = 2;  /* 2: 日給を設定 */
    employee.k.nikkyu = 12000; /* 日給を設定 */

    displayEmployeeInfo(employee); /* 従業員情報を表示 */
    return 0;
}

A.  Employee Number: 101, Name: Alice, Hourly Wage: 0
B.  Employee Number: 101, Name: Alice, Daily Wage: 12000
C. Employee Number: 0, Name: Alice, Monthly Salary: 0
D. Employee Number: 101, Name: , Daily Wage: 12000


□ 5. 次の共用体を使用する目的に関する説明として、正しいものを選びなさい。(1つ選択)

A.     メモリの効率を上げるため。
B.  データの安全性を向上させるため。
C.  複数のデータ型を同時に保持するため。
D.  スレッドの安全性を確保するため。



解答

1.A

このプログラムでは、Valueという名前の共用体を定義しています。この共用体は、int型のメンバーxと、char型のメンバーyを持ちます。共用体の特徴として、メモリの同じ領域を共有するため、xまたはyのどちらか一方の値を格納できます。
union Value val;でValue型の変数valを宣言します。
val.x = 65;では、共用体のメンバーxに整数値65を代入しています。この値はメモリ内でxのメモリ領域に格納されます。
次に、printf("%c\n", val.y);でyを使って出力します。
val.yをprintfで出力すると、65はASCIIコードで文字Aを表すため、プログラムの出力はAになります。
このプログラムは共用体のメンバーxに整数65を代入し、その後共用体のメンバーyを使って文字として出力しています。共用体の特性により、xに格納した値はそのままyとして解釈され、ASCIIコードに基づく文字が出力されます。結果として、出力はAになります。

2.B

A.誤り。共用体は、複数のメンバーを持つことができますが、同時に保持できるのは一つのメンバーだけです。これは、共用体が同じメモリ領域を共有するためです。
B.正しい。共用体のサイズは、すべてのメンバーの中で最も大きいメンバーのサイズに基づいて決まります。これにより、メモリの使用効率が高まります。
C.誤り。共用体のメンバーは、初期化されない限り、値が未定義です。特に、どのメンバーが最後に代入されたかによって、他のメンバーの値は変化するため、注意が必要です。
D.誤り。共用体は、そのサイズが最も大きいメンバーのサイズに基づくため、メンバーの型によって異なるサイズを持つことはありません。すべてのメンバーは同じメモリ領域を共有します。


3.B

構造体 Employee の定義:
Employee という構造体が定義され、id(整数型)と name(文字型の配列)のメンバーを持っています。

共用体 Data の定義:
Data という共用体が定義されており、Employee 型のメンバー emp と整数型のメンバー age を持っています。共用体はメモリを共有するため、同時に複数のメンバーを使用することはできません。

main 関数:
Data 型の変数 data を宣言します。
data.age に 30 を代入します。
その後、printf 関数を使って data.age を出力します。


4.B

共用体と構造体の定義:
Kyuyo という共用体が定義されています。これには、時給 (jikyu)、日給 (nikkyu)、月給 (gekkyu) の3つの整数型メンバーがあります。共用体の特性により、これらのメンバーは同時に使用されず、メモリを節約します。

Jyugyoin という構造体が定義されています。この構造体は、従業員番号、名前、給与タイプ、そして給与情報を持つ共用体をメンバーとして持っています。

displayEmployeeInfo 関数:
従業員の情報を表示するための関数です。この関数では、従業員番号、名前、給与タイプに応じた給与情報が出力されます。

main 関数:
Jyugyoin 型の変数 employee を宣言し、従業員番号を101、名前を "Alice" に設定します。
kyuyotype を2に設定し、日給を表すことを示します。
nikkyu を12000に設定し、日給としての金額を指定します。
最後に displayEmployeeInfo 関数を呼び出し、従業員情報を表示します。

出力結果:
employee.kyuyotype が2なので、displayEmployeeInfo 関数内の else if 文が評価され、日給 (nikkyu) が表示されます。
日給は12000に設定されているため、出力される情報は選択肢Bの通りです。


5.A

A.正しい。共用体は、複数のデータ型を持つことができるが、同時に1つのメンバーしか使用できないため、メモリを効率的に利用します。例えば、共用体を使うことで、異なる型のデータを1つのメモリ領域に格納することができます。
B.誤り。共用体は、メモリを共有するため、データの安全性が向上するわけではありません。むしろ、共用体のメンバーを誤って扱うことで、データの整合性が損なわれる可能性があります。
C.誤り。共用体は複数のデータ型を持つことはできますが、同時に保持することはできません。共用体は、一度に一つのメンバーのみが有効であるため、複数のデータ型を同時に使用することはできません。
D.誤り。共用体自体はスレッドの安全性を確保するための機能を持っていません。スレッド間でデータの安全性を確保するには、ミューテックスやセマフォなどの他の手法が必要です。



本日の学習内容

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

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