前々項の続き。
<pre> にするから一行が長くなるのだ、と気がついた。 それをやめ、「#」一つにつきソースファイルでは一行とし、 <br> で改行させればこの問題はなくなるのだが、 一つ一つの「#」が一つの単語とみなされ、 間にスペースを置いて表示されるので間があきすぎる。 また、横幅が広くなりすぎてうまくない。
table を出力させるなら次のようにする。
#include <stdio.h>
#include <stdlib.h> /* srand() */
#include <time.h> /* time() */
#define N 100
void init(void);
void print(void);
void quicksort(int i, int j);
void swap(int i, int j);
int a[N];
int main() {
printf("<html>\n"); /* html の最初の部分。略式 :-) */
printf("<body>\n");
printf("<p>\n");
printf("<table border=\"1\" cellspacing=\"0\">\n");
init();
print();
quicksort(0, N-1);
printf("</table>\n");
printf("</p>\n"); /* html の最後の部分。略式 :-) */
printf("</body>\n");
printf("</html>\n");
return 0;
}
void init(void) {
int i;
for (i = 0; i < N; i++) {
a[i] = i;
}
srand((unsigned)time(NULL)); /* 現在時刻で乱数の種を初期化 */
for (i = N-1; i > 0; i--) { /* シャッフルする */
swap(i, rand() % (i+1));
}
return;
}
/* 配列 a[0] ... a[N-1] を“色で”印字 */
void print(void) {
int i;
printf("<tr>\n");
for (i = 0; i < N; i++) {
printf("<td bgcolor=\"");
switch(a[i] / 20) {
case 0: printf("#ff%02x0f", 15 + a[i] % 20 * 12); break;
case 1: printf("#%02xff0f", 255 - a[i] % 20 * 12); break;
case 2: printf("#0fff%02x", 15 + a[i] % 20 * 12); break;
case 3: printf("#0f%02xff", 255 - a[i] % 20 * 12); break;
case 4: printf("#%02x0fff", 15 + a[i] % 20 * 12); break;
default: ;
}
printf("\"> </td>\n");
}
printf("</tr>\n");
}
void swap(int i, int j) {
int tmp;
tmp = a[i]; a[i] = a[j]; a[j] = tmp;
}
/* ↓あまりしっかりチェックしていないのでミスがあるかも */
void quicksort(int left, int right) {
int i, j;
int pivot;
if (left >= right) {
return;
}
pivot = a[left];
i = left;
j = right;
while (i < j) {
while (i <= right && a[i] <= pivot) {
i++;
}
while (j >= left && a[j] >= pivot) {
j--;
}
if (i < j) {
swap(i, j); i++; j--;
}
}
/* ここへきたときは i == j または i == j + 1 になっている */
if (i != j || a[i] > pivot) {
i--;
}
swap(left, i);
print();
quicksort(left, i-1);
quicksort(i+1, right);
}
出力例。
付) この出力例では重複行を除去する操作をしていない。 また、縁をなくし、colspan を使えばバイト数を減らせるが、 それを行なうにはいったん全データを二重配列に保持してから、となりそうだ。
2006-03-20 (1) 02:11:41 +0900