★データ構造(二次元配列5)★


文字列配列を使ったソートのプログラムを作りましょう。

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を使いました。


分からなかった方は、これまでの内容を復習し、理解を深めてください。

何度も書きますが、読んだだけでは技術は身に付きません。

解答例を写して実行しただけでもダメです。

流れや仕組みを理解してください。


次へ

戻る

目次へ