Cプログラムの課題です(>_<)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アーリー

Cプログラムの課題です(>_<)

#1

投稿記事 by アーリー » 17年前

大変申し訳ないのですが、まだまだ初心者で課題が解けません。
もしお時間の方良ければ、下の問題について解説、またはプログラムを記載して下されば助かります。
無理を言ってすみません。よろしくお願いします。

課題は、「プログラム言語C 第2版 ANSI規格準拠:B.W.カーニハン/D.M.リッチー著(共立出版)」の
p144の演習5-12で、
-------------------------------------------
入力の最後のn行を印字するプログラムtailを書け。
nの省略時の仮定値は10であるが、これは省略可能な引数によって変更できるようにし、
  tail -n
で最後のn行を印字するようにせよ。
入力やnの値が誤っていてもプログラムはちゃんと動作するようにせよ。
記憶領域の使用が最良になるように、すなわち行は、固定サイズの二次元配列ではなく、ポインタ配列(ポインタへのポインタ)で格納するようにプログラムを書け。
-------------------------------------------
です。
これは「コマンド行の引数」という節にあります。
解説不足かも知れませんが、よろしくお願いします。

たかぎ

Re:Cプログラムの課題です(>_<)

#2

投稿記事 by たかぎ » 17年前

今手元に「プログラム言語C 第2版」がないのではっきりしたことはいえませんが、書かれた内容だけだと要件が不明確ですね。
nの範囲をどう考えるかで設計が変わってきます。また、処理系にもある程度依存します。

もう少し具体的に書くと、「プログラム言語C 第2版」はいわゆるC89の解説書です。C89では、オブジェクトのサイズとして保証されるのが32767バイトまでですので、それをポインタのサイズで割った行数までしか、この問題でいうところの「ポインタ配列」では扱えません。

アーリー

Re:Cプログラムの課題です(>_<)

#3

投稿記事 by アーリー » 17年前

内容不十分ですみません。
UNIXで使えるtailコマンドを実際にプログラムする問題だと私は思っています。
サイズと言いますか、行数の範囲は1000行までとなっているようです。

たかぎ

Re:Cプログラムの課題です(>_<)

#4

投稿記事 by たかぎ » 17年前

> UNIXで使えるtailコマンドを実際にプログラムする問題だと私は思っています。

はい。それは分かります。

> 行数の範囲は1000行までとなっているようです。

なるほど。だとすると、ほかに問題になりそうなのは、1行あたりの文字数の制限だけですね。
1行辺りの文字数の制限をなくすには、テンポラリファイルを使うしかありません。
ただし、テンポラリファイルを使う場合、最低限扱えるサイズは何も保証されなくなります。

入力が標準入力ではなく、(シーク可能な)ファイルに制限できるなら、ftellの返却値またはfpos_tの配列にすることで、上記の問題は回避できます。
しかし、その場合には、

> ポインタ配列(ポインタへのポインタ)で格納するようにプログラムを書け。

の条件を満たせなくなります。

アーリー

Re:Cプログラムの課題です(>_<)

#5

投稿記事 by アーリー » 17年前

なるほど。1行あたりの文字数の制限もいるのですね。
自分の中では、ファイルの最後のn行を印字したいと思っています。
この場合も、文字数の制限などいるのでしょうか?

たかぎ

Re:Cプログラムの課題です(>_<)

#6

投稿記事 by たかぎ » 17年前

最後のn行を出力するには、その内容をどこかに格納しておく必要があります。

Hermit

Re:Cプログラムの課題です(>_<)

#7

投稿記事 by Hermit » 17年前

5.6と、5.10が出来れば、自ずと出来る様に思いますが、

閉鎖

“C言語何でも質問掲示板” へ戻る