第4回:文字列の並べ替え


今週は,配列の仕上げとして,文字列の並べ替え を取り上げます.


【今日の演習】

配列に格納された10個の数を,大きい順に並べかえて表示するプログラム(ソート)を作りなさい.

並べ替え(SORT)には,いろいろなアルゴリズムが,考え出されている.

バブルソート(隣接交換法)
バケツソート
ヒープソート(整列2分木法)
クイックソート(分割法)
マージソート(併合法)
直接選択法(場数法)

ここでは,直接選択法によるソートについて説明する.

手順:

まず,「応用」のプログラムを利用して,10個の数を画面に表示するプログラムを作ろう.

大きい順に並べ替えるには,最初の数と,i番目の数を比較し,大きい数方を始めに持ってくる.

(一番大きい数が見つかる)

次に,残りの数のうちもっとも大きいものを探し出し,それを二番目に持ってくる.

これを繰り返す.

インデックス 0 1 2 3 4 5 6 ... n-1
最初 50 30 56 42 18 33 100 ... 99
一回目 100 30 50 42 18 33 56 ... 99
二回目 100 99 30 42 18 33 50 ... 56
#include <stdio.h>

void main()
{
    	int a[10] = {50,30,50,30,40,10,100,48,79,1};
    	int i, j;
    	int temp;

    	for(i=0; i<10; i++){
        		printf("%2d番目の要素 = %3d\n", i+1, a[i]);
    	}

    	for(i=0 ; i<9 ; i++){
        		for(j=i+1 ; j<10 ; j++){

            		/* ここに、入れ替えるプログラムを書く */
            		if(a[i] < a[j]){
                			temp = a[i];
                			a[i] = a[j];
                			a[j] = temp;
            		}
        		}
    	}

    	printf("ソート結果発表\n");
    	for(i=0; i<10; i++){
        		printf("%2d番目に大きい要素 = %3d\n", i+1, a[i]);
    	}
}						
						

先週の練習の答え

【練習】

キーボードから1文字小文字を入力すると,大文字に変換して画面に表示するプログラムを作成する.

[答え]

#include <stdio.h>

void main()
{
    char c;

    printf("1文字入力してください");
    c = getchar();        /* キーボードから半角文字1つを得る命令 */

    printf("%c\n", c - 0x20);         /* 0x20 (16進数) = 32(10進数) */
}

【演習】

キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成する.

ヒント:文字列の終わりはnull文字で判断する.

[答え]

#include <stdio.h>

void main()
{
    char c[256];
    int i;

    printf("文字列を入力してください:");
    scanf("%s", c);

    for(i=0; c[i] != 0; i++);        /* これで,文字数を数えている.null文字は,0 */

    printf("入力された文字列は,%s で,%d 文字です\n", c, i);       /* なぜ,i が文字数なのか */
}

これらのことをふまえて,


【演習】

キーボードから入力した文字列を,文字コード順に並べ替え画面に表示するプログラムを作成する.


Oh-o! Meijiのレポートから(第4回)のところへ,演習で作成したプログラムを送る.プログラムには必ず,学年,組,番号,氏名,メールアドレスを記入すること.