2015 年度「計算数学」 2015-11-27

§9 画面表示関数の改良

(9.1.1) ここは時間に余裕のある人向けである。 すでに述べたことがらだが,前よりはわかりやすく説明する。

(9.1.2) ここの端末は,よその多くの端末と同じく, 「\033[」で始まる特別な文字列を画面に出力することで, 文字に色をつけたり,文字の出力位置を変えたりすることができる。

(9.1.3) 「\033[自然数m」で文字の色などが変わる。 「\033[m」で普通に戻る。 たとえば「hello, world」の hello だけを緑色の反転で表示するには次のようにする。

#include <stdio.h>

main() {
    printf("\033[42mhello\033[m, world\n");
}

数値と表示の関係は,(2.8.3) で示したプログラムで試せ。

その中で使えそうなものは,40 番台と 90 番台である。 40 番台は文字に明るい色がつく。 90 番台は反転表示となる。 一の位が色を表す。 1 赤,2 緑,3 黄色,4 青,5 マゼンタ(≒紫),6 シアン(≒水色)である。 その中から自分の好きな色を選べ。

(9.1.4) 自分の好きな色を選んだら,次のプログラムを動かしてみよ。 (ここでは緑を選んだものとした。)

#include <stdio.h>

main() {
    int i;

    i = 1;
    printf(" %02d", i);
    i = 2;
    printf(" \033[92m%02d\033[m", i);       /* 明るい緑 */
    i = 3;
    printf(" %02d", i);
    i = 4;
    printf(" \033[42m%02d\033[m", i);       /* 緑反転 */
    i = 5;
    printf(" %02d", i);
    printf("\n");
}

(9.1.5) これを利用し,関数 print() を改造して, 関数 void print2(int i, int j) で, a[i]a[j] のみを反転表示し, ほかは普通に表示するものを書け。 (print() はそのまま残しておけ。)

(9.1.6) この関数を swap() の呼び出し直後に(うまく)呼び出せば, 交換された要素のみが反転表示されるプログラムが書ける。

(9.1.7) そのようなプログラムを用いて, 挿入ソートと Shell ソートのアルゴリズムをもう一度確認せよ。 5 おき,3 おき,1 おきにソートする Shell ソートを試すのもよい。

(9.1.8) さらに改良し, Shell ソートにおいて, いま注目している m おきの部分列の要素だけ色を変え, いま交換した要素は反転して出力する関数 void print3(int m, int i, int j) を書け。


岩瀬順一