例題 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; |