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

C言語の構造体を使って名前をアルファベット順にソートするプログラムの解説

構造体(Structure)とは、異なるデータ型の変数をひとつの名前のもとにまとめてグループ化したものです。C言語では、関連性のある複数のデータをひとまとめに扱うために構造体がよく使われます。

構造体の主な特徴

C言語における構造体には、以下のような特徴があります。

  • 代入演算子を使うことで、異なるデータ型を持つすべての構造体メンバーの内容を、同じ型の別の構造体変数へ一括してコピーできます。
  • 複雑なデータを扱う場合には、構造体の中にさらに構造体を定義することができます。これを「ネストされた構造体(入れ子構造)」と呼びます。
  • 関数への引数として、構造体全体・個々のメンバー・構造体のアドレスのいずれも渡すことが可能です。
  • 構造体へのポインタ(構造体ポインタ)を作成することもできます。

構造体の宣言と初期化

構造体を宣言するときの一般的な書式は次のとおりです。

struct タグ名 {
    データ型 メンバー1;
    データ型 メンバー2;
    ...
    データ型 メンバーn;
};

各要素の意味は以下のとおりです。

  • struct:構造体を定義するためのキーワードです。
  • タグ名:構造体の名前を指定します。
  • メンバー1、メンバー2…:構造体内に格納される各データ項目です。

記述例

たとえば、本の情報を管理する構造体は次のように定義できます。

struct book {
    int pages;          // ページ数
    char author[30];    // 著者名
    float price;        // 価格
};

プログラム例:名前をアルファベット順にソートする

以下は、構造体を使用して学生の名前をアルファベット順に並べ替えるC言語のサンプルプログラムです。選択ソートの考え方を応用し、strcmp関数で文字列を比較しながら入れ替えを行っています。

#include<stdio.h>
#include<string.h>

struct tag{
    char name[10];   // 名前
    int rno;         // 出席番号
};
typedef struct tag node;
node s[5];

sort(int no){
    int i, j;
    node temp;
    for(i = 0; i < no - 1; i++)
        for(j = i + 1; j < no; j++)
            if(strcmp(s[i].name, s[j].name) > 0){
                temp   = s[i];
                s[i]   = s[j];
                s[j]   = temp;
            }
}

void main(){
    int no, i;
    fflush(stdin);
    printf("Enter The Number Of Students:");
    scanf("%d", &no);
    for(i = 0; i < no; i++){
        printf("Enter The Name:");
        fflush(stdin);
        gets(s[i].name);
        printf("Enter the Roll:");
        scanf("%d", &s[i].rno);
    }
    sort(no);
    for(i = 0; i < no; i++){
        printf("%s\t", s[i].name);
        printf("%d\n", s[i].rno);
    }
}

プログラムのポイント

  • strcmp関数は2つの文字列を比較し、第1引数が大きい場合に正の値を返します。これにより辞書順(アルファベット順)の判定が可能になります。
  • 比較結果が条件を満たした場合、構造体変数同士をそのまま代入することで、名前と出席番号の両方が一度に入れ替わります。
  • typedefを使うことで、「struct tag」という記述を「node」だけで済ませられ、コードが読みやすくなります。

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

Enter The Number of Students:5
Enter The Name:Priya
Enter the Roll:3
Enter The Name:Hari
Enter the Roll:5
Enter The Name:Pinky
Enter the Roll:7
Enter The Name:Lucky
Enter the Roll:1
Enter The Name:Krishna
Enter the Roll:2
Hari     5
Krishna  2
Lucky    1
Pinky    7
Priya    3

このように、入力された5人分の学生データが、名前のアルファベット順(Hari → Krishna → Lucky → Pinky → Priya)に正しく並べ替えられて表示されます。

  1. 【MySQL】INFORMATION_SCHEMAとORDER BYを使ってカラム名をアルファベット順に取得する方法

    MySQLでテーブルのカラム名をアルファベット順に取得したい場合は、INFORMATION_SCHEMA.COLUMNS に対して ORDER BY 句を使用します。データベースのメタ情報を管理する INFORMATION_SCHEMA を活用することで、実際にSELECT文でデータを取り出すことなく、カラム構成だけを簡単に確認できます。基本の構文カラム名をアルファベット順(昇順)で取得するための基本構文は以下の通りです。SELECT anyReferenceName.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS anyReferenceName WH

  2. C言語で単方向リンクリストを使って数値を逆順に表示する方法

    リンクリスト(連結リスト)とは リンクリストは動的メモリ割り当てを利用するデータ構造で、複数の「ノード」が連なった集合体です。各ノードはデータ部分とリンク部分(次のノードへのポインタ)の2つの要素で構成されています。 リンクリストの種類 C言語で扱われる主なリンクリストには、以下の4種類があります。 単方向リンクリスト 双方向リンクリスト 循環単方向リンクリスト 循環双方向リンクリスト 単方向リンクリストの構造 下の図は、単方向リンクリストの構造を示したものです。各ノードがデータと次ノードへのポインタを持ち、末尾ノードのポインタはNULLを指します。 数値を逆順に表示するCプログラム 以