例題 15 人の生年月日(年,月,日)を読み込み,1 人ずつ構造体 birthday の配列に格納しなさい. そして,その 5 人を生まれた順に並び替えて表示しなさい.なお,構造体 birthday の宣言は以下の通りとする:
方針・アルゴリズム基本は 前回の例題2 と同じである. データを読み込み,並べ替えを行い,順に出力すればよい. つまり,
コーディング例
1 /*
2 * プログラミング演習 第 13 回
3 * [例題 1]
4 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
5 */
6 #include <stdio.h>
7
8 struct birthday {
9 int year;
10 int month;
11 int day;
12 };
13
14 int main(void){
15 struct birthday a[5], tmp;
16 int i, n, m, code_m, code_i;
17
18 /* a[i] を読み込む */
19 for ( i = 0; i < 5; i++ ){
20 printf("%d > ", i);
21 scanf("%d %d %d", &a[i].year, &a[i].month, &a[i].day);
22 }
23
24 for ( n = 4; n >= 0; n-- ){
25 m = 0; /* a[0] が最も若いと仮定 */
26 for ( i = 1; i <= n; i++ ){
27 code_m = a[m].year * 10000 + a[m].month * 100 + a[m].day;
28 code_i = a[i].year * 10000 + a[i].month * 100 + a[i].day;
29 if ( code_m < code_i ){
30 m = i; /* 最大値の位置の更新 */
31 }
32 }
33 if ( m < n ){ /* a[m] と a[n] の値を交換 */
34 tmp = a[m];
35 a[m] = a[n];
36 a[n] = tmp;
37 }
38 }
39
40 for ( i = 0; i < 5; i++ ){
41 printf("%d %d %d\n", a[i].year, a[i].month, a[i].day);
42 }
43
44 return 0;
45 }
※左端の数字は行番号であり,ソースコードには含まれない点に注意!
コンパイル & 実行例
$ gcc example13_1.c [Enter]
$ ./a.out [Enter]
0 > 1980 1 1 [Enter]
1 > 1985 10 8 [Enter]
2 > 1985 10 7 [Enter]
3 > 1975 3 3 [Enter]
4 > 1975 2 28 [Enter]
1975 2 28
1975 3 3
1980 1 1
1985 10 7
1985 10 8
解説基本として選択ソートをやっているだけであるため, プログラムの流れは 前回の例題2 と同じである.
唯一の違いは,データ型が int ではなく構造体 birthday
になっているという点にある.
単純に考えれば,
27 code_m = a[m].year * 10000 + a[m].month * 100 + a[m].day;
28 code_i = a[i].year * 10000 + a[i].month * 100 + a[i].day;
|