C言語のきほん「構造体(4)」

スポンサーリンク
Cプログラミング C言語

今回は、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クリエイティブ

コメント

タイトルとURLをコピーしました