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