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

練習問題(101)

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

さらに,

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

練習問題(102)

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

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

練習問題(103)

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

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

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

練習問題(104)

make は便利に使えるように,予め様々な暗黙のルールを持っており,処理の全てを事細かに Makefile に記述しなくても処理を行えるようになっている. a.out が file-1.o と file-2.o から作られる依存関係が定義されており,カレントディレクトリに file-1.c,file-2.c がある場合,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 を意味するようになる.

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

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

練習問題(105)

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