前々項の続き。
<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