C言語で学生のレコードを構造体として保存し、名前順にソートする方法
この記事では、学籍番号(student_id)、氏名(student_name)、成績(student_percentage)からなる学生のレコードを扱います。目標は、これらの学生レコードを構造体として保存し、氏名のアルファベット順にソートして表示するCプログラムを作成することです。
問題の例
まず、具体的な入力と出力を見て、問題の内容を理解しましょう。
入力: 学生レコード =
{{ student_id = 1, student_name = Nupur, student_percentage = 98},
{ student_id = 2, student_name = Akash, student_percentage = 75},
{ student_id = 3, student_name = Yash, student_percentage = 62},
{ student_id = 4, student_name = Jyoti, student_percentage = 87},
{ student_id = 5, student_name = Ramlal, student_percentage = 80}}出力: 名前順にソートされた学生レコード =
{{ student_id = 2, student_name = Akash, student_percentage = 75},
{ student_id = 4, student_name = Jyoti, student_percentage = 87},
{ student_id = 1, student_name = Nupur, student_percentage = 98},
{ student_id = 5, student_name = Ramlal, student_percentage = 80},
{ student_id = 3, student_name = Yash, student_percentage = 62}}解決のアプローチ
この問題を解くには、まず学生の詳細情報を格納するための構造体を定義します。次に、C標準ライブラリの qsort() 関数を使ってレコードの配列をソートします。qsort() を利用する際には、2つの要素を比較するための比較関数(コンパレータ)を定義して渡す必要があります。ここでは、strcmp() 関数を使って2人の学生の氏名を辞書順に比較するコンパレータを実装します。
使用する主な関数
- qsort():stdlib.h で定義されている汎用ソート関数です。配列の先頭ポインタ、要素数、1要素のサイズ、比較関数の4つを引数に取ります。
- strcmp():string.h で定義されている文字列比較関数です。2つの文字列を辞書順に比較し、その結果を整数値として返します。
サンプルプログラム
学生レコードを構造体として保存し、名前順にソートするCプログラム
// 学生レコードを構造体として保存し、名前順にソートするCプログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int student_id;
char* student_name;
int student_percentage;
};
int comparator(const void* s1, const void* s2){
return strcmp(((struct Student*)s1)->student_name,((struct Student*)s2)->student_name);
}
int main() {
int n = 5;
struct Student arr[n];
//学生1
arr[0].student_id = 1;
arr[0].student_name = "Nupur";
arr[0].student_percentage = 98;
//学生2
arr[1].student_id = 2;
arr[1].student_name = "Akash";
arr[1].student_percentage = 75;
//学生3
arr[2].student_id = 3;
arr[2].student_name = "Yash";
arr[2].student_percentage = 62;
//学生4
arr[3].student_id = 4;
arr[3].student_name = "Jyoti";
arr[3].student_percentage = 87;
//学生5
arr[4].student_id = 5;
arr[4].student_name = "Ramlal";
arr[4].student_percentage = 80;
printf("ソート前の学生レコード:\n");
for (int i = 0; i < n; i++) {
printf("Id = %d, Name = %s, Percentage = %d \n", arr[i].student_id, arr[i].student_name, arr[i].student_percentage);
}
qsort(arr, n, sizeof(struct Student), comparator);
printf("\n\n名前順にソートされた学生レコード:\n");
for (int i = 0; i < n; i++) {
printf("Id = %d, Name = %s, Percentage = %d \n", arr[i].student_id, arr[i].student_name, arr[i].student_percentage);
}
return 0;
}実行結果
ソート前の学生レコード: Id = 1, Name = Nupur, Percentage = 98 Id = 2, Name = Akash, Percentage = 75 Id = 3, Name = Yash, Percentage = 62 Id = 4, Name = Jyoti, Percentage = 87 Id = 5, Name = Ramlal, Percentage = 80 名前順にソートされた学生レコード: Id = 2, Name = Akash, Percentage = 75 Id = 4, Name = Jyoti, Percentage = 87 Id = 1, Name = Nupur, Percentage = 98 Id = 5, Name = Ramlal, Percentage = 80 Id = 3, Name = Yash, Percentage = 62
プログラムの解説
このプログラムの処理の流れは、以下の通りです。
- 構造体の定義:
struct Studentで、学籍番号・氏名・成績の3つのメンバを持つ構造体を定義します。 - データの登録:5人分の学生データを構造体の配列
arrに格納します。 - ソートの実行:
qsort()に配列、要素数、要素サイズ、比較関数comparatorを渡して呼び出します。 - 結果の表示:forループを使って、ソート後のレコードを順番に出力します。
比較関数 comparator では、受け取った voidポインタを struct Student* 型にキャストし、strcmp() で氏名を比較しています。strcmp() は、第1引数の文字列が小さい場合に負の値、等しい場合に0、大きい場合に正の値を返すため、その戻り値をそのまま返すことで、氏名の昇順ソートが実現されます。
-
C言語で学ぶ基数ソート(Radix Sort)の仕組みと実装方法
ソート(整列)アルゴリズムとは、リスト内の要素を特定の順序に並べ替えるためのアルゴリズムのことです。最もよく使われる順序としては、数値の昇順・降順や、辞書式(五十音・アルファベット)順などが挙げられます。 基数ソート(Radix Sort)は、要素同士を比較しない「非比較型」のソートアルゴリズムの一つで、ソートされていないリストに対して特に高い効果を発揮する手法として知られています。 基数ソートでは、同じ位の数字ごとに要素をグループ化することで並べ替えを行います。その基本的な考え方は、最下位桁(LSD:Least Significant Digit)から最上位桁(MSD:Most Signif
-
Microsoft Accessでレコードを並べ替え・フィルターする方法を徹底解説
並べ替え(ソート)とフィルターの機能を活用すると、Accessのレコードやデータベースがより整理され、ひと目で内容を把握しやすくなります。特に、データベースファイルを開いたときにすぐデータの全体像をつかみたい場合に便利です。この記事では、並べ替えとフィルターの違いと、Accessでレコードを並べ替え・フィルターする具体的な手順を解説します。 Accessにおける「並べ替え」と「フィルター」の違い 並べ替えは、データを昇順または降順に並べ替える機能です。一方、フィルターは重要なレコードとそうでないレコードを分ける機能で、フィルターを適用すると、条件に一致する行だけが表示され、それ以外の行は一時的