
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);複数メンバを連結して表示する練習です。
