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)に正しく並べ替えられて表示されます。
-
【MySQL】INFORMATION_SCHEMAとORDER BYを使ってカラム名をアルファベット順に取得する方法
MySQLでテーブルのカラム名をアルファベット順に取得したい場合は、INFORMATION_SCHEMA.COLUMNS に対して ORDER BY 句を使用します。データベースのメタ情報を管理する INFORMATION_SCHEMA を活用することで、実際にSELECT文でデータを取り出すことなく、カラム構成だけを簡単に確認できます。基本の構文カラム名をアルファベット順(昇順)で取得するための基本構文は以下の通りです。SELECT anyReferenceName.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS anyReferenceName WH
-
C言語で単方向リンクリストを使って数値を逆順に表示する方法
リンクリスト(連結リスト)とは リンクリストは動的メモリ割り当てを利用するデータ構造で、複数の「ノード」が連なった集合体です。各ノードはデータ部分とリンク部分(次のノードへのポインタ)の2つの要素で構成されています。 リンクリストの種類 C言語で扱われる主なリンクリストには、以下の4種類があります。 単方向リンクリスト 双方向リンクリスト 循環単方向リンクリスト 循環双方向リンクリスト 単方向リンクリストの構造 下の図は、単方向リンクリストの構造を示したものです。各ノードがデータと次ノードへのポインタを持ち、末尾ノードのポインタはNULLを指します。 数値を逆順に表示するCプログラム 以