『新・明解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;
}

コメント

 特になし。

 


書籍情報



Copyright (C) 2016 "HYOGOKURUMI" All Rights Reserved./「来未炳吾・平極ルミ・HYOGOKURUMI」の発達障害考察を主とした全ての発信は、相互不干渉など特別な約束をした者達を除き、どなたでもご活用できます。ただし著作権は放棄しておりません。あしからずご了承ください。詳細は著作権に関するガイドラインをご一読ください。/「HYOGOKURUMI.site」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。