2009年度 プログラミング演習2 鬼門 課題8-4を解く
以下の三段階で解けばいいでしょう.
決して一気に解こうとせずに,各段階で出来ているか確認して下さい.
(1) データ構造として 構造体の配列を用意する.
(2) ファイルから文字を数え上げる.
(3) 配列の二つの要素を入れ替える関数を作る.
(4) ヒープソートを作成する.
(1) データ構造として 構造体の配列を用意する.
標準的には
#define MAX_CHAR 1000
typedef struct _chdata {
int count;
char name;
} CHDATA;
CHDATA chdata[MAX_CHAR]; //構造体の配列で作る場合。
int n_char; /* 文字の種類 */
int total_char; /* 総文字数 */
のように確保すればよいでしょう.
(2) ファイルから文字を数え上げる.
新しい文字が出てくる旅に,使っていない配列の要素 chdata[n_char] のnameに
新しい文字を割り当て,count を1にします.
その後,同じ文字が出てくる度に count を1増やして行きましょう.
この時,大文字を小文字に替えることや 改行(\n),tab(\t)などをスペースに
替えるコトなどをわすれずに
(3) 配列の二つの要素を入れ替える関数を作る.
chdata[i] と chdata[k] を入れ替える swap関数を作りましょう.
(4) ヒープソートを作成する.
データ構造とアルゴリズムでのヒープの復習をした上で,
ヒープの一次元配列による表現 を理解しましょう (教科書p.136など)
その上でヒープソートの動きを理解し (こちらのページも参照)
その上で,教科書 p.137 のソースコードをホボ写しましょう.
このソースコードを一生懸命読解する!! ←ここ山場!!
これが何をやっているか理解出来れば,
それを今回のプログラムに合うように,修正してあげれば,
8-4が達成されます.
追記:
プログラムを進めるうえで, 配列の状況を常にチェックするようにした方が良いので
現在のデータを出力する関数
void print_all_data(){
for(i=0;i<n_char;i++){
printf(”%c %d\n”,chdata[i].name,chdata[i].count);
}
}
のようなものを先に作っておくとよいでしょう.