『新・明解C言語 入門編 第2版』演習問題解答例 12ー4

演習12ー4

問: List12-7を次のように書きかえたプログラムを作成せよ。

・名前と身長などのデータは、初期化子として与えるのではなく、キーボードから読み込む。
・身長の昇順にソートするのか、名前の昇順でソートするのかを選べるようにする。

// Ex1204.c

#include <stdio.h>
#include <string.h>

#define    NUMBER 3
#define NAME_LEN 64

//学生を表す構造体
typedef struct {
    char    name[NAME_LEN];
    int     height;
    double  weight;
} Student;

//xおよびyが指す学生を交換
void swap_Student(Student* x, Student* y)
{
    Student temp = *x;
    *x = *y;
    *y = temp;
}

// 学生の配列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]);
        }
    }
}

// 学生の配列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]);
        }
    }
}


void scan_student(Student *std, int n)
{
    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("%lf", &std[i].weight);
    }
}

int main(void)
{
    int no;
    Student std[NUMBER];

    printf("%d名分の名前・身長・体重を入力せよ。\n", NUMBER);
    
    scan_student(std, NUMBER);

    printf("ソートの基準を選んでください。【身長順・・・1/名前順・・・2】");
    scanf("%d", &no);
    
    if (no == 1) {
        sort_by_height(std, NUMBER);
    } else if (no == 2) {
        sort_by_name(std, NUMBER);
    }

    if (no == 1) {
        puts("\n身長順にソートしました。");
        for (int i = 0; i < NUMBER; i++)
            printf("%-8s %6d%6.1f\n", std[i].name, std[i].height, std[i].weight);
    } else if (no == 2) {
        puts("\n名前順にソートしました。");
        for (int i = 0; i < NUMBER; i++)
            printf("%-8s %6d%6.1f\n", std[i].name, std[i].height, std[i].weight);
    }

    return 0;
}

コメント

 特になし。

 


書籍情報


コメント

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