演習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;
}
コメント
特になし。
書籍情報
コメント