作ってわかる
Cプログラミング
章末問題へのヒント
■第1章
問題1
hello.cは4行のテキストから成っている。
もし改行がなくて1行に繋がっていたらうまくコンパイルされるだろうか?
どの改行と空白を取り除いたらエラーになるかを調べよ。
改行せずに、その代わりに空白を空けてみる。これでも実行結果は同じだ。
main { printf("hello, world\n"); }
逆に、次のように改行したらどうなるだろう?
mai
n {
問題2
hello.cで表示するメッセージが長大で、画面やウィンドウの横幅より大きい場合は
どうなるか?
「hello, world」 の代わりに、
「Pablo Diego Jose Francisco de Paulo Joan Nepomuleno Maria
de los Remedios Cipriano Santisima Trinidad Ruiz y Picasso」
を出力するとどうなるだろう?
問題3
hello.cを改造し、日本語のメッセージを表示するようにせよ。
「hello, world」 の代わりに、
「こんにちは。」 と出力するわけだ。
■第2章
問題1
typ2でテキストファイル以外のファイルを読み込ませたらどうなるか。
たとえば、Windowsでは拡張子が.exe のファイルはテキストファイルではない。Unixでもa.out などの実行形式のファイルはテキストファイルではない。
問題2
typ2で長大なテキストファイルを画面に表示しているとき、
途中で中止して終了したいときにはどうすればよいか。
環境によって方法は異なるが、各自の環境のマニュアルを読むこと。
Unixなどではstty all で分かるかもしれない(さらにman stty する必要もあるかも)。
■第3章
問題1
fopen()関数のファイルのオープンモードに「テキストモード」と
「バイナリーモード」の区別がある環境が存在する。
テキストファイルを変換しながら読み込むためのものだ。
そのような環境においてプログラムcat3.cを実行してファイルを連結する際に
問題になる点を考察せよ。
たとえばWindowsのテキストファイルの“改行”は1文字じゃなくて
2文字分(Cの書き方で言えば\r\n )だ。
これを読んだときに\n 1つ分に変換し、
逆に、ファイルに書き出す
■第4章
問題1
upper3.cをさらに改良し、「大文字を小文字に」だけでなく、
「小文字を大文字に」する機能も付けよ。
オプションの指定方法をどうするか? (使うアルファベットは何にするか)
問題2
「大文字を小文字に」する指定と「小文字を大文字に」する指定を
同時に行った場合は、プログラムはどのような出力をすべきか
考察せよ。
つまり、両方の指定を同時にしてしまったときにどう動くか
をきちんと考えなければいけない。
エラーにするか、無効にするか(どちらも指定しなかったことにする)、
両方有効にするか?
■第5章
問題1
ce4に「小文字を大文字にする」機能を付け加えるよりも、
第4章のupper3と組み合わることで実現したほうがよい。
自分の環境でこの2つを「組み合わせて使う」方法を調べよ。
Unixのshやcshには“パイプ”という機能がある。
問題2
ce4をさらに改良し、文字列の前に出力する調節の空白の代わりにピリオド「.」
を出力する機能を付けよ。
「空白でなくてピリオドを出力」 することを指定するオプションの与え方の
仕様はよく考えよう。当然ほかの文字を出力する機能を付け加えるときのことも
考え、そのときに矛盾しないように考えておこう。
■第6章
問題1
find2を改良し、指定した文字列が「見つからなかった」行だけを
出力する機能を追加せよ。
どういうときに便利なのかをよく考えよう。
たとえば具体的にどういう場合なのかの例をあげてみよう。
問題2
find2を改良し、指定した文字列が「見つかった」行の番号(そのファイルの中の
何行めか)を、行そのものの前に出力できる機能を付けよ。
どのような表示形式がいいかも検討しよう。
- 単純なもの
-
10: 1つめ
125: 2つめ
2355: 3つめ
- 数値を右そろえ(その場合は何桁を最大とするかを検討すること)
-
10: 1つめ
125: 2つめ
2355: 3つめ
- ズレをゼロで補う
-
0010: 1つめ
0125: 2つめ
2355: 3つめ
■第7章
(本章には問題がない)
■第8章
問題1
sort4を改良し、ソーティングにおける大小比較処理の際に、
行の先頭から指定しただけのバイト数分を読み飛ばしてから「比較」することが
できるようにせよ。
具体的には、次のように並んでいる行に対して、先頭の10文字分(日付が書いてある)の無視して
それより後の部分に関して「大小比較して並べ替え」 したい場合などに使う
機能だ。
2001/10/03 ACCORDEON
2001/06/10 COULEUR CAFE
1999/01/14 VIENS A SAINT GERMAIN
■第9章
問題1
page3を改良し、一度に表示する行数(1ページの行数)を起動時のコマンドライン
で指定できるようにせよ。
0行と指定されたらどうするかなども考えておこう。
■第10章
問題1
editを改良し、
「3,10d 」のようにカンマで区切って行の範囲を指定して、
削除(d)、表示(p)、書き出し(w)ができるようにせよ。
1,10p で「1〜10行めを表示」 のように使えるようにするわけだ。
pやdの前が「数字のカンマだけか」 「カンマは1つだけか」 「カンマの前後の数値は前のほうが小さいか」 などをチェックしなければいけないことを
お忘れなく。
問題2
d指令やp指令にて、
数字で行を指定する方法以外にも、
``指定した単語を含む行''を指定できるようにせよ。
具体的には、
「/duck/ 」と記述すれば
カレント行から順に探しはじめて
最初にみつかる「duck」を含む行を意味するようにせよ。
つまり、/abc/,/def/d と書いて、
「abc」という文字列を含む行から「def」という行を含む行までの範囲を
削除できる、といった感じだ。
問題3
「s/WWW/World Wide Web/ 」のように記述して、
その行の内容に「WWW」という部分を見つけたら
「World Wide Web」に置き換えるようにせよ(置換機能)。
バッファーの中でデータを“ずらす”ことを考えると難しい。
短くなるときはともかく、長くなるときには後ろが“はみだしてしまう”からだ。
それよりは、置換結果用に別に領域を確保し、そちらに前後の行をつなぎ変えて、
以前の領域は解放してしまうのがよいだろう。
問題4
editを元にして、
指令をコマンドラインやファイルから読み、
標準入力を処理するようなストリームエディターを作成せよ。
ファイルから読む場合は、
第6章のプログラムのように「-f ファイル名」 でそのファイルを
読めるようにするとよいだろう。
コマンドラインに直接指令を書くときは1つめのパラメーターとして指定し、
2つめ以降をファイル名だと解釈する。
■第11章
(本章には問題がない)
■第12章
(本章には問題がない)
→戻る
−注意−
このWWWページで使用されている画像・文章およびデータは、すべて著作権法上の保護を受けています。
|