文字列配列を使ったソートのプログラムを作りましょう。
5名分の氏名を入力し、アルファベット順に並べ替えるプログラムです。
以下にプログラムの説明を書きますので、よく読んで作成してみてください。
#defineを使ってNINZUを5に、MAX_NAMEを20にしてください。
※MAX_NAMEが20ということは、半角文字で19文字まで入力可能ということです。
char型の二次元配列nameを準備し、縦をNINZU、横をMAX_NAMEで設定します。
for文を使って5人分の名前を入力します。
※半角空白も入力出来るようgetsで入力しましょう。
さらに別のfor文を作り、5人分の名前を表示します。
まずはここまで作りましょう。
解答例です。
<sample program 097-01>
#include <stdio.h> #define NINZU 5 #define MAX_NAME 20 int main(void) { char name[NINZU][MAX_NAME]; int i; for (i = 0; i < NINZU; i++) { gets( name[i]); } for (i = 0; i < NINZU; i++) { printf("%s\n", name[i]); } return 0; } |
<実行結果>
Ieyasu Tokugawa ←getsの入力 Toshiie Maeda ←getsの入力 Hideie Ukita ←getsの入力 Kagekatsu Uesugi ←getsの入力 Terumoto Mouri ←getsの入力 Ieyasu Tokugawa Toshiie Maeda Hideie Ukita Kagekatsu Uesugi Terumoto Mouri 続行するには何かキーを押してください・・・
入力と出力の区別が付きにくいので、入力と出力のループの間に↓のプログラムを入れましょう。
printf("\n並べ替え後の配列\n");
入力ループと出力ループの間に昇順ソートのプログラムを作成します。
昇順という言葉を覚えていますか?(小さい順ですね)
ソートについては、どのような方法でも構いません。
ソートを行う際には、データの大小比較が必須です。
文字列の大小比較もやりましたよね。
これまでの知識をしっかりと身につけていれば出来ると思います。
それではチャレンジしてみてください!
※不足している変数などは各自で追加してください。
解答例です。
<sample program 097-02>
#include <stdio.h> #include <string.h> #define NINZU 5 #define MAX_NAME 20 int main(void) { char name[NINZU][MAX_NAME]; int i; int j; char work[MAX_NAME]; for (i = 0; i < NINZU; i++) { gets( name[i]); } for (i = 0; i < NINZU - 1; i++) { for (j = 0; j < NINZU - 1; j++) { if (strcmp(name[j], name[j + 1]) > 0) { strcpy(work, name[j]); strcpy(name[j], name[j + 1]); strcpy(name[j + 1], work); } } } printf("\n並べ替え後の配列\n"); for (i = 0; i < NINZU; i++) { printf("%s\n", name[i]); } return 0; } |
<実行結果>
Ieyasu Tokugawa Toshiie Maeda Hideie Ukita Kagekatsu Uesugi Terumoto Mouri 並べ替え後の配列 Hideie Ukita Ieyasu Tokugawa Kagekatsu Uesugi Terumoto Mouri Toshiie Maeda 続行するには何かキーを押してください・・・
隣接交換法を使ってソートしました。
文字列の大小比較はstrcmpを使い、交換作業用にworkという配列を作っています。
workに文字列をコピーするため、strcpyを使いました。
分からなかった方は、これまでの内容を復習し、理解を深めてください。
何度も書きますが、読んだだけでは技術は身に付きません。
解答例を写して実行しただけでもダメです。
流れや仕組みを理解してください。