今週は,配列の仕上げとして,文字列の並べ替え を取り上げます.
配列に格納された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回)のところへ,演習で作成したプログラムを送る.プログラムには必ず,学年,組,番号,氏名,メールアドレスを記入すること.