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

構造体の6章では、データをひとまとめに扱うための強力な仕組みを学びました。
たとえば「書籍」や「名刺」など、本来は複数の情報で構成されているものを ひとつの変数として扱える のが構造体の魅力です。

ここから先では、その理解を深めるために、実際に手を動かしながら学べる 6章の練習問題 を用意しています。
構造体の定義、初期化、メンバアクセス、typedef、そして三項条件演算子などを、ひとつひとつ丁寧に扱います。

構造体でデータをまとめるイメージ

まずは、6章で扱った内容を思い出しておきましょう。
構造体はこんなふうに、複数の要素をひとつの箱にまとめられる「小さなデータベース」のような存在です。

構造体の基本イメージ

struct Book {
    char title[50];   ← 書籍名
    char author[30];  ← 著者
    int  price;       ← 価格
    int  pages;       ← ページ数
};

このように、関連した情報をひとまとめにできる のが構造体の最大のメリットです。

6章で登場した主な命令と書式

6章では、構造体に関するさまざまな書式を学びました。
ここでは、それぞれの命令を「簡単な例付き」でわかりやすく整理します。

構造体の宣言(struct)

書式

struct 型名 {
    メンバ型 メンバ名;
    メンバ型 メンバ名;
};

何をする命令?

新しい「型」を作るための構文。
C言語標準の int や double と同じように、自分で作った型 を持てるようになる。

typedef(別名の作成)

書式

typedef struct {
    ...
} 別名;

何をする命令?

長い構造体名を書く代わりに、短くてわかりやすい名前をつけられる。

構造体変数の宣言+初期化

書式

struct 型名 変数名 = { 値1, 値2, 値3, ... };

何をする命令?

構造体変数を作ると同時に、メンバに初期値を設定する。

メンバへのアクセス(.演算子)

書式

変数名.メンバ名

何をする命令?

構造体の中にある各値にアクセスする。

三項条件演算子

書式

条件式 ? 値1 : 値2

何をする命令?

条件によって値を使い分けたい場合に便利な “簡易 if 文”。
条件式が真なら値1が選ばれ、偽なら値2が選ばれます。

6章の練習問題

ここからは、6章で扱った内容をしっかり確認できるよう、
完全新作の練習問題を7問 用意しました。

【練習6-1】

次の事柄について、構造体として扱う場合に、メンバとなる要素として適切なものを挙げてください。

(1)映画
(2)社員アカウント
(3)料理レシピ

【解答例と解説】

項目メンバの例解説
(1) 映画title, director, runningTime, rating, genre映画の基本情報をまとめたもの。
(2) 社員アカウントid, name, email, department, activeログイン情報や部署などをまとめる。
(3) 料理レシピrecipeName, ingredients, time, difficultyレシピの基本構成をそのまま構造体へ。

構造体は「1つのモノを表すために必要な情報をセットにした箱」であると考えると整理しやすいですね。

【練習6-2】

練習6-1(1)で考えた「映画」を struct MOVIE 型という名前で構造体として定義してください。

【解答例と解説】

struct MOVIE {
    char title[50];
    char director[30];
    int runningTime;     // 上映時間(分)
    double rating;       // 評価(0.0〜10.0)
};

構造体定義=新しい「型」を作る操作でしたね。
構造体そのものには値は入っておらず、「設計書」を作っているイメージです。

【練習6-3】

練習6-2で作った struct MOVIE を使って、
映画を2本、変数 movie1・movie2 として宣言し、初期化してください。

【解答例と解説】

struct MOVIE movie1 = {"未来への扉", "大林太郎", 125, 8.4};
struct MOVIE movie2 = {"青い惑星",   "松永みどり", 98,  7.9};

構造体変数の初期化は、メンバの順番通りに {} へ並べればOKです。

【練習6-4】

練習6-1(2)で考えた社員アカウントについて、
構造体を定義すると同時に typedef を使って別名 Account を作ってください。

【解答例と解説】

typedef struct {
    int id;
    char name[30];
    char email[50];
    char department[20];
    bool active;
} Account;

typedef を使うと、

struct ○○

を書かなくても良くなるので、宣言がすっきりします。

【練習6-5】

次の構造体が定義され、変数「msg」が宣言とともに初期化されています。

typedef struct {
    char sender[50];
    char time[20];
    int  priority;
    bool confirmed;
} Notice;

Notice msg = {"総務部", "2025/01/05 09:00", 2, false};

msg を使い、次のような通知文を表示してください。

【新着通知】

(sender)からのお知らせです。(time)
重要度は(priority)です。(confirmed の結果に応じた文言)

なお、confirmed が true の場合は「既読」、false の場合は「未読」と表示してください。
可能であれば三項条件演算子を使用してください。

【解答例と解説】

printf("【新着通知】\n\n");
printf("%sからのお知らせです。(%s)\n", msg.sender, msg.time);
printf("重要度は%dです。%s\n",
       msg.priority,
       msg.confirmed ? "既読" : "未読");

三項条件演算子は、

条件 ? 値1 : 値2

で値を選ぶスタイルでしたね。

【練習6-6】

次の構造体を定義し、
student1 の点数によって「合格」または「不合格」を表示するプログラムを作成してください。

struct Student {
    char name[20];
    int score;
};

合格:score >= 70
不合格:それ以外

【解答例と解説】

struct Student student1 = {"山田太郎", 82};

printf("%sさんは%sです。\n",
       student1.name,
       student1.score >= 70 ? "合格" : "不合格");

構造体+三項演算子の良い練習になります。

【練習6-7】

次のような構造体 Address を定義してください。

  • name(氏名)
  • postal(郵便番号)
  • city(市区町村)
  • number(番地)
  • building(建物名)

さらに、Address 型の変数 adr を作り、適当な値を代入して、
次のような住所を出力してください。

氏名:◯◯
住所:〒◯◯◯-◯◯◯◯ ◯◯◯◯◯◯◯◯◯

【解答例と解説】

struct Address {
    char name[30];
    char postal[10];
    char city[30];
    char number[20];
    char building[40];
};

struct Address adr = {
    "木村さくら",
    "812-0012",
    "福岡市博多区",
    "中洲1-2-3",
    "ハナビル5F"
};

printf("氏名:%s\n", adr.name);
printf("住所:〒%s %s%s%s\n",
       adr.postal, adr.city, adr.number, adr.building);

複数メンバを連結して表示する練習です。