C言語で構造体変数を比較するプログラムの書き方|宣言・初期化の基礎とサンプルコード
C言語における構造体(structure)とは、int型やchar型など、異なるデータ型の変数をひとつの名前のもとにまとめて扱えるようにしたデータ構造です。関連するデータをひとまとめに管理できるため、プログラムの可読性と保守性が向上します。
構造体の宣言と初期化
構造体を宣言するときの一般的な形式は以下のとおりです。
struct tagname{
datatype member1;
datatype member2;
...
datatype member n;
};
各要素の意味は次のとおりです。
- struct … 構造体を定義するためのキーワード(予約語)
- tagname … 構造体につける名前(タグ名)
- member1, member2… … 構造体を構成するデータ項目(メンバ)
たとえば、書籍情報を扱う構造体は次のように定義できます。
struct book{
int pages;
char author[30];
float price;
};
この例では、ページ数(int型)、著者名(文字配列)、価格(float型)という異なる型のメンバを、book というひとつの構造体にまとめています。
構造体変数の宣言方法(3パターン)
構造体変数を宣言するには、主に次の3つの方法があります。
方法1:構造体定義と同時に宣言する
struct book{
int pages;
char author[30];
float price;
}b;
方法2:タグ名を省略して宣言する
struct{
int pages;
char author[30];
float price;
}b;
この形式はタグ名を持たない匿名構造体となるため、同じ型の変数を後から追加できず、再利用性が低い点に注意してください。
方法3:定義後に別途宣言する
struct book{
int pages;
char author[30];
float price;
};
struct book b;
この方法が最も一般的で、構造体定義を再利用しながら、必要な場所で自由に変数を宣言できます。
構造体の初期化とメンバへのアクセス
構造体変数のメンバにアクセスするには、メンバ演算子(ドット演算子「.」)を使用します。初期化は主に次の3つの方法があります。
方法1:宣言時にまとめて初期化する
struct book{
int pages;
char author[30];
float price;
} b = {100, "balu", 325.75};
方法2:定義後に初期化子リストで設定する
struct book{
int pages;
char author[30];
float price;
};
struct book b = {100, "balu", 325.75};
方法3:ドット演算子で個別に代入する
struct book{
int pages;
char author[30];
float price;
};
struct book b;
b.pages = 100;
strcpy(b.author, "balu");
b.price = 325.75;
文字配列のメンバに文字列を代入する場合は、= 演算子ではなく strcpy 関数を使う必要がある点に注意しましょう。
構造体変数を比較するサンプルプログラム
C言語では、構造体同士を == 演算子で直接比較することはできません。その代わりに、各メンバを個別に比較します。一方、構造体変数どうしの代入(コピー)は可能です。
以下は、構造体変数を比較するCプログラムの例です。
#include <stdio.h>
struct class{
int number;
char name[20];
float marks;
};
int main(void){
int x;
struct class student1 = {001,"Hari",172.50};
struct class student2 = {002,"Bobby",167.00};
struct class student3;
/* 構造体変数の代入(全メンバが一括コピーされる) */
student3 = student2;
/* メンバ同士を比較して結果を判定 */
x = ((student3.number == student2.number) &&
(student3.marks == student2.marks)) ? 1 : 0;
if(x == 1){
printf("\nstudent2 and student3 are same\n\n");
printf("%d %s %f\n", student3.number,
student3.name,
student3.marks);
}
else
printf("\nstudent2 and student3 are different\n\n");
return 0;
}
実行結果
このプログラムをコンパイルして実行すると、次の出力が得られます。
student2 and student3 are same 2 Bobby 167.000000
プログラムのポイント
student3 = student2;の代入により、student2 の全メンバの値が student3 へ一括コピーされます。- 構造体同士の一致判定は直接行えないため、number と marks をそれぞれ == で比較し、三項演算子で結果を x に格納しています。
- 両者の値が一致すれば x は 1 となり「same」が出力され、一致しなければ「different」が出力されます。
-
C言語のトークンとは?6つの種類とサンプルコードでわかりやすく解説
トークンとはトークン(token)とは、コンパイラにとって意味を持つ、プログラムを構成する最小単位のことです。コンパイラはソースコードをこの最小単位へと分割し、生成されたトークンを基にコンパイルの各段階へと処理を進めていきます。トークンの種類C言語のトークンは、主に以下の6種類に分類されます。キーワード(予約語):int、return など、言語仕様によって意味が定められた語識別子:変数名や関数名など、開発者が自由に命名できる名前定数:10、3.14 など、プログラム中で値が変わらない固定値文字列:ダブルクォート( )で囲まれた文字の並び特殊記号:{ }、( )、; など、構文を区切るための記
-
C言語で十角形の周囲長を計算する方法を解説
十角形(デカゴン)とは? 十角形(デカゴン)とは、10個の辺を持つ多角形のことで、「10角形」とも呼ばれます。10個の頂点と10本の辺を持ちます。特に正十角形の場合、すべての辺の長さが等しく、それぞれの内角は144度になります。 以下は十角形の図です。 十角形の周囲長を求めるには、次のシンプルな公式を使用します。 周囲長 = 10 × 辺の長さ 計算例 入力:side = 10 出力:十角形の周囲長:100 入力:side = 20 出力:十角形の周囲長:200 アルゴリズム 開始 ステップ1 → 周囲長を求める関数を宣言する void perimeter(int n)