C言語の構造体でクリケット選手の情報を表形式に整理し、平均得点順にソートするプログラムの作り方
問題
C言語の構造体(structure)を使って、クリケット選手のデータを「平均得点(アベレージ)」を基準に昇順へソートし、表形式で格納・表示するにはどうすればよいのでしょうか。
解決策
ここでは、クリケット選手の情報として「名前」「年齢」「試合数」「平均得点」の4項目を扱います。これらの情報は、構造体の仕組みを利用することで、プログラム実行時にコンソールから入力できるようになります。
入力が完了したら、各選手の平均得点に基づいてデータを昇順に並べ替え、表形式で画面に出力します。こうすることで、誰の成績がどの位置にあるのかがひと目でわかるようになります。
ソートのロジック
選手を平均得点の昇順に並べ替えるために使用したロジックは以下の通りです。隣り合うレコード同士を比較し、前の選手の平均得点が後ろの選手より大きければ、構造体ごと入れ替えるという単純な交換法によるソートです。
for(i=0;i<2;i++){
for(j=i+1;j<2;j++){
if(c[i].avrn > c[j].avrn){
temp1=c[i];
c[i]=c[j];
c[j]=temp1;
}
}
}
C言語では構造体変数同士を直接代入できるため、上記のように一時変数 temp1 を介してレコード全体を丸ごと交換できます。個々のメンバを1つずつコピーする必要がないのが大きな利点です。
プログラム全体
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct cricketer{
char name[50];
int age;
int match;
float avrn;
char temp;
};
struct cricketer c[20],temp1;
void main() {
int i,j;
for(i=0;i<2;i++){
printf("Enter data of cricketer %d\n",i+1);
//fflush(stdin);
printf("Name: ");
gets(c[i].name);
printf("\nAge: ");
scanf("%d",&c[i].age);
printf("\nMatches: ");
scanf("%d",&c[i].match);
printf("\n\nAverage runs: ");
scanf("%f",&c[i].avrn);
scanf("%c",&c[i].temp);
}
/******************/
/* sorting records */
/*******************/
for(i=0;i<2;i++) {
for(j=i+1;j<2;j++) {
if(c[i].avrn > c[j].avrn){
temp1=c[i];
c[i]=c[j];
c[j]=temp1;
}
}
}
printf("Sorted records:\n");
for(i=0;i<2;i++){
printf("%d\t%s\t%d\t%d\t%f\n\n\n",i+1,c[i].name,c[i].age,c[i].match,c[i].avrn);
}
getch();
}
プログラムのポイント
- 構造体の定義: struct cricketer に、名前(char型配列 name[50])、年齢(int age)、試合数(int match)、平均得点(float avrn)を関連するデータとしてひとまとめに定義しています。
- 構造体配列: struct cricketer c[20] のように宣言することで、最大20人分の選手データを1つの変数で管理できます。
- ソート処理: 2重ループでレコードを比較し、平均得点 avrn を基準に構造体ごと入れ替えることで昇順ソートを実現しています。
- 表形式の出力: 書式指定子 %s・%d・%f とタブ文字 \t を組み合わせた printf により、整列した見やすい表形式の表示を実現しています。
注意: 本サンプルでは古い関数 gets() を使用していますが、gets() はバッファオーバーフローを引き起こす危険があるため、現在の標準規格(C11以降)では廃止されています。実務では fgets() の使用を推奨します。また、main 関数は戻り値を int 型にするのが標準的な書き方です。
実行結果
Enter data of cricketer 1 Name: Dhoni Age: 39 Matches: 150 Average runs: 200 Enter data of cricketer 2 Name: virat Age: 36 Matches: 135 Average runs: 190 Sorted records: 1 virat 36 135 190.000000 2 Dhoni 39 150 200.000000
実行結果を見ると、入力順序(Dhoni → virat)にかかわらず、平均得点の低い順(virat:190 → Dhoni:200)に自動的に並べ替えられて表示されていることがわかります。このように、構造体と簡単なソートアルゴリズムを組み合わせるだけで、成績表のようなデータ管理を手軽に実装できます。
-
【C言語】strncmpライブラリ関数を使って2つの文字列を比較するプログラムの作り方
strncmpは、C言語のヘッダーファイル「string.h」に定義されている標準ライブラリ関数の一つです。この関数を使用すると、2つの文字列を比較し、どちらの文字列が大きい(辞書順で後ろにある)のかを判定することができます。 strcmp関数(文字列比較) strcmp関数は、2つの文字列を比較するための関数です。戻り値として、両方の文字列の中で最初に一致しなかった文字同士のASCIIコードの差を返します。 構文 int strcmp(string1, string2); 差が0の場合:string1 = string2(2つの文字列は等しい) 差が正の値の場合:string1 &
-
C言語ですべてのデータ型の範囲を表形式で表示するプログラムの作成方法
C言語で扱えるデータ型には、int(整数型)、short int、signed char、unsigned char、float、double など、さまざまな種類があります。それぞれの型が保持できる値の範囲(最小値・最大値)を正しく把握しておくことは、バグのない安全なプログラムを書くうえで非常に重要です。 データ型とは データ型とは、変数に格納できる値の集合とその種類を定義するものです。用途に応じた適切なデータ型を選択することで、メモリを効率的に利用しながら正確な処理を行うことができます。 C言語のデータ型は、大きく次の2つに分類されます。 基本データ型(プリミティブ型) 派生データ型(配