システムプログラム 練習問題 #1

練習問題(101)

インデンテーションに記述されている設定を Emacs に対して適用し,TAB キーを叩いた時のインデントの深さが変化することを確認しなさい. また,元の(インデントが浅い)スタイルで書かれたプログラムのファイルを Emacs で開き,各行で TAB キーを押すとその行に新しいインデンテーションスタイルが適用されることを確認しなさい.

さらに,

ことにより,プログラムが見やすくなるかどうかを確認しなさい.

練習問題(102)

NULL ポインタアクセス以外の理由で segmentation fault や bus error 等が起こり異常終了するプログラムを書きなさい. そのプログラムの実行をデバッガ(gdb等)で追跡し,スタックのバックトレースや変数の値等を表示させ,プログラムのどの行で,どのような原因で異常が起きたかを調べなさい. そして,プログラムを変更して原因を取り除き,正しく実行できるようになったことを示しなさい. プログラムは cc -g でコンパイルすること.

レポートには,異常終了するプログラムとその実行結果,デバッガによる調査手順とその結果,変更後のプログラムとその変更点,最終的な実行結果を含めること.

練習問題(103)

Makefile はコンパイルだけに使用する必要はない. make は処理がコンパイルであるかどうかに関係なく,Makefile に書かれたルールにのっとってコマンドを実行するだけである. そこで,Makefile を用いてよく行われるのが,コンパイルによって作られたファイルの消去である.

Makefile にルールを追加し,以下のようにオブジェクトファイルが消去されるようにしなさい.

$ make clean[←]
/bin/rm -f a.out file-1.o file-2.o
$ 

練習問題(104)

make は便利に使えるように,予め様々な暗黙のルールを持っており,処理の全てを事細かに Makefile に記述しなくても処理を行えるようになっている. 例えば,make はカレントディレクトリの .c という拡張子を持つソースファイルから cc -c コマンドを用いて .o という拡張子を持つオブジェクトファイルを作成するというルールを持っている. つまり,file-1.o は file-1.c に依存し,cc -c コマンドで作成するというルールを,いちいち Makefile に書く必要はない(書いても良い). また,変数を定義する機能もあり,複数のファイル名を値として持つ変数を定義することにより,いちいちファイル名を列挙する必要が無くなる. 例えば,

OBJS = file-1.o file-2.o

と書くと,シェルで変数の値を参照するときのように,$(OBJS) は file-1.o file-2.o を意味するようになる.

変数と暗黙のルールを用いて,練習問題(103)で作成した Makefile をできるだけ短く書き換えなさい.

参考: 暗黙のルールは make -p を使うと表示できる. 暗黙のルールを表示したいが,実際にコマンドを実行したくない場合には,make -n -p を実行するとよい.

練習問題(105)

プログラミングとデバッグではバブル整列法を例にして,制御の流れや変数の値を確認するためのデバッグ用の出力を行う文を入れている. このプログラムを変更して,より効率の良い(即ち効率が O(n2) の単純選択法や単純挿入法以外の)整列法(ヒープソート,クィックソート,ラディックスソートなど)を用いるプログラムを作成しなさい. 制御の流れや変数の値を確認するための出力文を入れることにより,ソートの効率が良くなっていることがわかるようなプログラムを作りなさい. また,プログラムの終了時に,比較回数など計算量の指標となる数値を出力するようにしなさい.

プログラムと実行結果だけではなく考察も書くこと. 全てのデバッグ結果や途中経過をレポートに書くと膨大な長さになるので,出力結果は適宜省略しても構わない.