Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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」が出力されます。

  1. C言語のトークンとは?6つの種類とサンプルコードでわかりやすく解説

    トークンとはトークン(token)とは、コンパイラにとって意味を持つ、プログラムを構成する最小単位のことです。コンパイラはソースコードをこの最小単位へと分割し、生成されたトークンを基にコンパイルの各段階へと処理を進めていきます。トークンの種類C言語のトークンは、主に以下の6種類に分類されます。キーワード(予約語):int、return など、言語仕様によって意味が定められた語識別子:変数名や関数名など、開発者が自由に命名できる名前定数:10、3.14 など、プログラム中で値が変わらない固定値文字列:ダブルクォート( )で囲まれた文字の並び特殊記号:{ }、( )、; など、構文を区切るための記

  2. C言語で十角形の周囲長を計算する方法を解説

    十角形(デカゴン)とは? 十角形(デカゴン)とは、10個の辺を持つ多角形のことで、「10角形」とも呼ばれます。10個の頂点と10本の辺を持ちます。特に正十角形の場合、すべての辺の長さが等しく、それぞれの内角は144度になります。 以下は十角形の図です。 十角形の周囲長を求めるには、次のシンプルな公式を使用します。 周囲長 = 10 × 辺の長さ 計算例 入力:side = 10 出力:十角形の周囲長:100 入力:side = 20 出力:十角形の周囲長:200 アルゴリズム 開始 ステップ1 → 周囲長を求める関数を宣言する void perimeter(int n)