ちなみに個数のところは #define のマクロ 定義 を使っておくと、あとあと簡単に個数が変更できます。
配列 の例題は並びかえ(ソート)の
1つのバブルソートでしたが、ソートには他にもよく知られたアルゴリズム
が多数あります。ここではそのうちの1つで、バブルソートより効率が良い
とされている、バケツソート (bucket sort、あるいはビンソート bin sort
と呼ばれる)を紹介します。
本当はさらに効率の良いクイックソートというのがあるのですが、これは (再帰)関数を修得していないと使えないので、またの機会とします。
これをプログラムにしてください。とりあえず、データは1から100まで の範囲で、標準入力から8つ読みこんで、小さいものから表示するようにし ておいてください。
… 解答の1例 です。
初級のプログラムを malloc() を使うように改造(かつ簡略化)してくださ
い。すなわち;
例題のループで、コピーをさぼって i だけ増加させれば文字の 長さを順におっていってることになります。
例題のプログラムをさらに拡張して、文字列を連結する
プログラムを作成してください。すなわち、
初級のプログラムを改造して、文字列を標準入力から3つ読みこみ、それを
連結して出力するプログラムを作成してください。すなわち、
こうすることにより無駄なメモリの確保を防ぐ(必要十分な領域だけ使う) ことが可能になります。定石といってもよいでしょう。
中級の例題を (buffer overflow 対策ということで)scanf ではなく
fgets() を使ったらどうなるかを考えてください。fgets の場合、最後の改
行まで文字列として保存されるので、その改行をとってやらないとうまくつ
ながりません。
ようするに、 10月26日の課題 の中級編ででて きた strcpy を自作せよ、ということです。実はこれは、 文字列のポインタ操作 の例題を関数化する、 ということです。
文字列操作関数(string.h で定義されてるもの)には、strcpy のほかに
strlen (文字数を数える)や strcat (文字列の連接)があります。
ここでは、strcat() をつくってみましょう。すなわち
というものです、これをつかって、
まず s1 の文字列を最後まで読み飛ばして、その続きから初級と同様に文字 をコピーしていけばよいです。
abを求める冪乗の漸化式は、
- b>=1 の時: ab = a * ab-1
- b==0 の時: a0 = 1
並びかえ のところでもすこし話題にした、クイッ
クソートを紹介します。ここでは、対象データは整数で、配列に格納されて
るとし、それを data[] とします。とりあえずは 10 個のデータと
して
int data[10]={4,7,1,9,6,8,10,2,3,5};
で初期化されてるとしましょう。すると関数
quicksort(int data[],int start,int end)
は以下のようになります。引数は、第1がデータのはいっている配列、第
2は並びかえ対象のデータがその配列の何番目からか、第2は並びかえ対象
のデータが何番目までか、を示しているものとします。
配列要素が3つになっていることに注意してください。たとえば以下のよう な宣言をするといいでしょう。struct kumi { int bangou; char sensei[10]; int ninzuu; };
初級の問題を改造して;
構造体変数の値は初期化するのではなく、キーボー
ド(標準入力)から入力させるように変更してください。そしてその入力結果を
画面に表示するプログラムを作成してください。
入力するところも for でループさせます。メンバ各々のデータ型に注意!
前回と同様、以下の構造体を使ってください。struct kumi { int bangou; char sensei[10]; int ninzuu; }; また、例題の pout もすこし書き直す必要があります。というよりは、前回 の課題の出力部分を関数化するほうが楽かもしれません。
構造体とポインタ
の最後の例題についてさらに考察します。この例題の
場合は、リストが単方向(前から後にしか辿れない)のですが、
構造体を