例題 25 つの英文字を順に読み込み,配列 a に格納しなさい.そして,それらをアルファベット順に並び替えて表示しなさい. ただし,使用する英文字は小文字に限定する. 方針・アルゴリズムまず,長さ 5 の文字列を読み込み,配列 a へ格納する.そして a[0], ..., a[4] をアルファベット順に並び替える. 前回 getchar の利用でも説明したように, 文字の実体は文字コード(整数)なので,文字どうしの大小比較は可能である. 実際,アルファベット順で先に登場するものほど小さい整数(文字コード)に対応する.
コーディング例
1 /*
2 * プログラミング演習 第 13 回
3 * [例題 2]
4 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
5 */
6 #include <stdio.h>
7 #include <string.h>
8
9 int main(void){
10 char a[6], tmp;
11 int n, m, i;
12
13 /* 文字列を読み込む */
14 fgets(a, 6, stdin);
15
16 for ( n = 4; n >= 0; n-- ){
17 m = 0; /* a[0] 文字コードが最大と仮定 */
18 for ( i = 1; i <= n; i++ ){
19 if ( a[m] < a[i] ){
20 m = i; /* 最大値の位置の更新 */
21 }
22 }
23 if ( m < n ){ /* a[m] と a[n] の値を交換 */
24 tmp = a[m];
25 a[m] = a[n];
26 a[n] = tmp;
27 }
28 }
29
30 printf("%s\n", a);
31
32 return 0;
33 }
※左端の数字は行番号であり,ソースコードには含まれない点に注意!
コンパイル & 実行例
$ gcc example13_2.c [Enter]
$ ./a.out [Enter]
stdio [Enter]
diost
解説上でも述べたように, 文字の実体は整数(文字コード) なので, 文字をアルファベット順に並べるという行為は 文字コードの小さい順に並べる という行為と同じである.つまり,プログラムの内容は前回の 例題 2 とほとんど変らない. 並び替えの手順については前回の 例題 2 のページ を参考にしてもらうとして, ここではそれとの違いだけ述べる.
唯一の違いは,データの読み込みにある.
14 fgets(a, 6, stdin);
にあるように,
文字列の読み込みを行う.
その際,5 文字だけを読み込むので,
格納先の容量には 6 を指定する.
なぜなら,文字列の終端を示す '\0' の分(1文字分)が追加で必要だからである.
|