今回は、5人の学生を表す構造体を作って、その配列を身長の昇順か名前の昇順かを選んでソートできるプログラムを考える。また、名前、身長、体重のデータはキーボードから読み込むものとする。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.2)を使用して作成し、gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0でコンパイルしている。
//5人の学生を表す構造体の配列の作成・ソートするプログラム
#include <stdio.h>
#include <string.h>
#define NUMBER 5
#define NAME_LEN 64
//学生を表す構造体
typedef struct
{
char name[NAME_LEN]; //名前
int height; //身長
float weight; //体重
}Student;
//学生を交換
void swap_Student(Student *x ,Student *y)
{
Student temp = *x;
*x = *y;
*y = temp;
}
//学生の配列aの先頭n個の要素を身長の昇順にソート
void sort_by_height(Student a[],int n)
{
for (int i = 0; i <n - 1; i++)
{
for ( int j = n -1; j > i; j--)
if (a[j - 1].height > a[j].height)
swap_Student(&a[j - 1],&a[j]);
}
}
//学生の配列aの先頭n個の要素を名前の昇順にソート
void sort_by_name(Student a[],int n)
{
for (int i = 0; i <n - 1; i++)
{
for ( int j = n -1; j > i; j--)
if (strcmp( a[j - 1].name , a[j].name) > 0)
swap_Student(&a[j - 1],&a[j]);
}
}
int main(void)
{
int sort_type;
Student std[5];
for (int i = 0; i < NUMBER; i++)
{
printf("%d番目の学生\n",i + 1);
printf("名前:"); scanf("%s",std[i].name);
printf("身長:"); scanf("%d",&std[i].height);
printf("体重:"); scanf("%f",&std[i].weight);
}
printf("どちらのソートを行いますか?[0]->身長順 [1]->名前順:");
scanf("%d",&sort_type);
switch (sort_type)
{
case 0:
sort_by_height(std,NUMBER);
break;
case 1:
sort_by_name(std,NUMBER);
break;
}
for (int i = 0; i < NUMBER; i++)
printf("%-8s %6d%6.1f\n",std[i].name,std[i].height,std[i].weight);
return 0;
}
実行結果
1番目の学生
名前:ando
身長:175
体重:62.5
2番目の学生
名前:imai
身長:165
体重:65.8
3番目の学生
名前:ueda
身長:170
体重:60.5
4番目の学生
名前:eguchi
身長:180
体重:70.2
5番目の学生
名前:ohta
身長:162
体重:61.0
どちらのソートを行いますか?[0]->身長順 [1]->名前順:0
ohta 162 61.0
imai 165 65.8
ueda 170 60.5
ando 175 62.5
eguchi 180 70.2
本プログラムは、学生を表す構造体Studentを要素型とする配列stdを用意して、その配列をソートしている。
関数sort_by_height ・・・ 身長順でソートする。
関数sort_by_name ・・・ 名前順でソートする。
ソートする過程では、2要素の交換が必要・・・関数swap_Studentが担う。
(参考)新・解きながら学ぶC言語 第2版 柴田望洋 (監修・著)、 由梨かおる(著)SBクリエイティブ
コメント