構造体での typedef
CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 59/63。
typedefの最も実用的な用途の1つは、struct型のエイリアスを作成することです。これにより、その型の変数を宣言するたびにstructキーワードを繰り返し記述する必要がなくなり、コードがより簡潔で読みやすくなります。
typedefを構造体の定義と組み合わせると、構造体を直接参照する新しい型名を作成できます。構文は次のとおりです:
typedef struct Point {
int x;
int y;
} Point;Point 変数が必要になるたびに struct Point p1; と書く代わりに、単に Point p1; と書けるようになりました。Both の宣言はまったく同じことを実現しますが、typedef 版のほうがより簡潔で読みやすくなります。
このアプローチは、カスタムデータ型を頻繁に扱う大規模なプログラムで特に役立ちます。コードが他のプログラミング言語に近い見た目になり、プログラム全体で struct と繰り返し入力することによる視覚的な煩雑さを軽減できます。
チャレンジ
簡単typedefを構造体と組み合わせて使用し、シンプルな書籍在庫管理システムを構築するCプログラムを作成してください。プログラムでは、次の処理を行います。
- 次のメンバーを持つ
Bookという名前のstructを定義します。- 整数型の
id - サイズ50の文字配列
title - 浮動小数点型の
price - 整数型の
quantity
- 整数型の
typedefを使用して、struct Bookの型エイリアスBookを作成します。- main関数内で次の処理を行います。
Book型の変数book1とbook2を2つ宣言します。- 1冊目の書籍について、ID、タイトル、価格、数量の順に入力を読み取ります。
- これらの値を
book1のメンバーに代入します。 - 2冊目の書籍について、ID、タイトル、価格、数量の順に入力を読み取ります。
- これらの値を
book2のメンバーに代入します。 - 次の正確な形式で両方の書籍の情報を出力します。
Book 1: ID=[id], Title=[title], Price=[price], Quantity=[quantity]Book 2: ID=[id], Title=[title], Price=[price], Quantity=[quantity]
- 各書籍の在庫の合計金額(価格 × 数量)を計算し、次の正確な形式で出力します。
Book 1 Total Value: [total_value]Book 2 Total Value: [total_value]
- 両方の書籍の在庫を合わせた合計金額を計算し、次の正確な形式で出力します。
Combined Inventory Value: [combined_value] - 合計金額が高い書籍を判定し、出力します。
- book1の合計金額の方が高い場合:
Book 1 has higher valueを出力します。 - book2の合計金額の方が高い場合:
Book 2 has higher valueを出力します。 - 両方の金額が等しい場合:
Both books have equal valueを出力します。
- book1の合計金額の方が高い場合:
このチャレンジでは、typedefを構造体と組み合わせることで、プログラム全体でstruct Bookを繰り返し記述する必要がなくなる方法を学びます。変数をstruct Book book1;として宣言する代わりに、単にBook book1;と記述できるため、コードがより簡潔で読みやすくなります。構造体の定義とtypedefの組み合わせ、構造体メンバーの操作、構造体データを使用した計算について練習します。
自分で試してみよう
#include <stdio.h>
#include <string.h>
// TODO: ここに struct と typedef を定義してください
int main() {
// TODO: ここに Book 変数を宣言してください
// 最初の本の入力を読み取る
int id1, quantity1;
char title1[50];
float price1;
scanf("%d", &id1);
scanf("%s", title1);
scanf("%f", &price1);
scanf("%d", &quantity1);
// TODO: book1 のメンバーに値を代入してください
// 2冊目の本の入力を読み取る
int id2, quantity2;
char title2[50];
float price2;
scanf("%d", &id2);
scanf("%s", title2);
scanf("%f", &price2);
scanf("%d", &quantity2);
// TODO: book2 のメンバーに値を代入してください
// TODO: 本の情報を出力し、値を計算して比較してください
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
10Enum と typedef
名前付き定数のための EnumEnum の宣言と使用switch 文での Enum の利用型エイリアスのための typedef の使用構造体での typedefまとめ:typedef と Enum の演習自分で練習してみよう: Cオンラインコンパイラ