ope - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年2月号
7件見つかりました。

1. 月刊 C MAGAZINE 1990年2月号

力の形式が気に入らない場合 , 表 3 の書式変換関数な どを使って好みの書式文字列にしてから出力するこ ともて、きます。書式変換関数は , 第 1 引数の値を第 2 引数の長さに変換します ( form ( ) は除く )oform( ) は fprintf 形式の書式変換を提供します ( GNU て、は form( ) という fprintf と同機能の関数もある ) 。 また , ューザが定義した型て、演算子くく , 〉〉を利用 示しましよう。 するには , その型の定義の際に , 演算子関数 operator operator くくの定義の形式て、は , 第 1 引数が目的の くく , operator 〉〉をフレンドて、定義します。具体例 ストリーム ( それの参照をそのまま戻り値にする ) , として , bignum の ostream に対する operator くくお 第 2 引数が出力したいクラス変数になります。この例 よび istream に対する operator 〉〉を List1 (a) , (b) に [ 表 2 ] istream 入力関数一覧 関数の機能 (interface function description) 関数の宣言 (inte 「 face function prototype) 基本入力関数 ( p 「 imit ⅳ e input functions) get(cha 「 * buf. int sz. cha 「 te 「 m= ・・ ): iSt 「 eam& iSt 「 eam : get(cha 「 & c); iSt 「 eam& istream : get()t 「 eambuf&sb. cha 「 te 「 m='*n ・ ): iSt 「 eam& istream : ist 「 eam& ist 「 eam: ・ getline(char* buf. int sz,cha 「 te 「 m gets(cha 「 * * buf,cha 「 te 「 m= ・・ ): iSt 「 eam& iSt 「 eam : ist 「 eam& istream . :scan(const cha 「 *fmt. ・ putbak(cha 「 c); iSt 「 eam& iSt 「 eam : :unget(cha 「 iSt 「 eam& iSt 「 eam : 演算子入力関数 ( input ope 「 ato 「 s) : ope 「 ato 「〉〉 ()t 「 eambuf& (b) : iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (cha 「 & c); iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (shO 「 t& n); iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (unsigned sh0 「 t& n); iSt 「 eam& lSt 「 eam : : ope 「 atO 「〉〉 (int& n); iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (unslgned int& n); iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (long& n); iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (unslgned long& n); iSt 「 eam& iSt 「 eam : : ope 「 atO 「〉〉 (float& n) : iSt 「 eam& lStream : : ope 「 ato 「〉〉 (double& n); iSt 「 eam& istream : : ope 「 atO 「〉〉 (cha 「 * s); iSt 「 eam& lStream . : ope 「 atO 「〉〉 (whitespace&) : i St 「 ea m & iSt 「 eam : [ 表 3 ] 書式変換関数一覧 関数の宣言 (interface function prototype) hex(long num,int wldth=()); Cha 「 * oct(long num. int width=O); Cha 「 * dec(long num. int width=O); Cha 「 * ch 「 (cha 「 ch . width=O); Cha 「 * ch 「 (cha 「 ch); Cha 「 * St 「 (const cha 「 * St 「 . int width=O); Cha 「 * fO 「 m(const cha 「 * fmt. Cha 「 * ost 「 eam のコンストラクタ / ティストラクター覧 [ 表 4 ] 関数の宣言 ((inte 「 face function p 「 ototype) OSt 「 eam: :ost 「 eam()t 「 eambuf* S); :ost 「 eam(int sz,cha 「 * buf); OSt 「 eam : :ost 「 eam(void); OSt 「 eam : :ost 「 eam(FILE * fp); ostream : mode :ost 「 eam(const char* fn,iO mode m. access_ OSt 「 eam . :ost 「 eam(const char* fn,const Cha 「 * m); ostream : : OSt 「 eam(lnt fd . iO mode m=10_w 「 iteonly) : OSt 「 eam : ・ stream(void); ostream : [ 表 5 ] ist 「 eam のコンストラクタ / ティストラクター覧 関数の宣言 (interface function p 「 ototype) :ist 「 eam()t 「 eambuf* S. lnt sk= 1 . ostream* lSt 「 eam . :ist 「 eam(int sz. cha 「 * buf. int sk=l); lSt 「 eam : ist 「 eam: :istream(int fd. int sk=l ,ost 「 eam * t=O); istream: :ist 「 eam(void); :ist 「 eam(int sz. cha 「 * buf); ISt 「ー : :ist 「 eam(FILE * fp); 旧1 「 eam . :ist 「 eam(int fd,lO mode m=iO 「 eadonly); iSt 「 eam : :iSt 「 eam(const char* fn . const Cha 「 * m); lSt 「 ea m : mode :ist 「 eam(const Cha 「 * fn. io_mode m . access ISt 「 eam : :lSt 「 eam(vold) : lSt 「 eam : C 十十 プログラミンク 入門 Fig. 5 処理系での解釈 cout くぐ He 0 , WO 日 d " くく " Yn " ; の解釈 cout. operator くく ( " He 0 , World"). operator くく ("Vn"): cin>> sh>> du ; の解釈 cin ・ operator くく ( sh ). ope 「 ato 「くく (du); 補足 buf に文字列を読み込む c に文字を読み込む 引数の st 「 eambuf に読み込む get(char* . int. cha 「 ) と同し 文字列を読み込むが , 領域確保は勝手に 行っ fscanf 形式の書式で読み込む st 「 eambuf のポインタを 1 文字戻す st 「 eambuf のポインタを 1 文字戻す (AT&T) (GNU) (GNU) (GNU) (GNU) (AT&T) 引数の st 「 eambuf に読み込む c に文字を読み込む n に整数値を読み込む n に整数値を読み込む n に整数値を読み込む n に整数値を読み込む n に整数値を読み込む n に整数値を読み込む n に浮動小数値を読み込む n に浮動小数値を読み込む s に文字列を読み込む スペースを読み飛はす (GNU) (GNU) (GNU) (GNU) 補足 関数の機能 (inte 「 face function desc 「 iption) num を指定された長さの 1 6 進表示の文字列に変換する num を指定された長さの 8 進表示の文字列に変換する num を指定された長さの 1 0 進表示の文字列に変換する 文字を指定された長さの文字列に変換する AT&T 版の ch 「 ()h . O); と等しい 文字列の長さを調節する fp 「 intf 形式の書式に従って変換する (AT@T) (GNU) (AT&T) 関数の機能 (interface function description) 引数 s と st 「 eam の接続を行う 引数 buf で st 「 eam の構築を行う もっとも単純な st 「 eam の初期化を行う fp と st 「 eam の接続を行う fn と st 「 eam の接続を行う fn と st 「 eam の接続を行う fd と st 「 eam の接続を行う ティストラクタ 補足 (AT&T) (GNU) (GNU) (GNU) (GNU) (GNU) 補足 (AT&T) (AT&T) (AT&T) (GNU) (GNU) (GNU) (GNU) (GNU) (GNU) (GNU) 関数の機能 (inte 「 face function description) 引数 s および t で st 「 eam の構築を行う 引数 buf で st 「 eam の構築を行う 引数 fd および t で st 「 eam の構築を行う もっとも単純な st 「 eam の初期化を行う istream(int. cha 「 * . int=O); と同じ fp と st 「 eam の接続を行う fd と st 「 eam の接続を行う fn と st 「 eam の接続を行う fn と st 「 eam の接続を行う ティストラクタ 98 CMAGAZINE 19 2

2. 月刊 C MAGAZINE 1990年2月号

ればならないため , 各自が定義したクラスは , 十分 な機能をもっことがて、きません。 C 十十のクラスライプラリて、提供されている入出力 機能は , Strea 爪クラスおよびそれに関する演算子〉〉 (get from), くく (put t0 ) の定義により実現されてい ます。この Stream クラスを使って , あの有名なプロ グラムを記述すれば , 以下のようになります。 cin 〉〉 sh 〉〉 du; double du; short sh; VOid main( ) #include く stream. h 〉 同様に入力も以下のように書くことがて、きます cout くく "HeIIo, WorId" VOid main( ) #include く stream. h 〉 istream は入力用のクラスとして定義されています。 ostream は出力用のクラスとして定義され , extern ostream cerr; extern ostream cout; extern istream Cin; stream. h て、以下のように記述されています。 cout, cin は , Stream クラスの変数て、あり , 演算子出力関数 ( outputope 「 ato 「 s ) ostream& fO 「 m(constcha 「 *fmt. OSt 「 eam& ostream . :put(const char* St 「 ): OSt 「 eam& OStream fiush(void); 0S1 「 eam& ostream : : ut(cha 「 c) : 基本出力関数 ( p 「 im はⅳ e output functions) 関数のÄÉ(inte 「 face function p 「 ototype) [ 表 1 ] ost 「 eam の出力関数 用意されているのて、 , 例のような記述がて、きます。 は , 基本データ型などについての演算子くく , 〉〉は 入力からのデータが格納されます。 Stream クラスて、 WorId" は標準出力に出力さみつ sh および du は標準 する入力や出力を意味します。上の 2 例て、は、、 HeIIo , のリダイレクト記号のように使われ , cin や cout に対 呼ぶ ) 。例のように演算子〉〉 , くくは , UNIX や DOS ファイルに接続された Stream の変数をストリームと stdin, stdout, stderr に相当します (cin のように そして , cin, cout, cerr は , C の標準ライプラリの 実際に内部的には型のチェックが行われ , 適当な演 算子関数が呼び出されます ( 用意されている演算子関 数については表 1 , 2 を参照 ) 。次は , Stream クラス のインタフェイスの解説て、す。 入出力関数 表 1 に ostream クラスの出力関数の一覧を示しま す ( 注 12 ) 。 ostream の基本出力機能は , put( ) および flush( ) により提供されます oput(char) は stdio. h の putchar( ) に相当し , 引数の文字をストリームに書 き込みます。 flush ( ) は ostream のノヾッフアに残って いる文字を強制的に吐き出させます。ただし , ostream のディストラクタは flush ( ) を勝手に呼び出すため , flush( ) を意識して呼ぶ必要があるのは , exit ( ) など て、プログラムが終了するときだけて、しよう。 同様に , 表 2 に istream クラスの入力関数一覧を示 します。 istream の基本入力機能には , get( ) および putback( ) があります oget(char&) は単に 1 文字を ストリームから読み込み , get(char*, int, char) は 文字列をストリームから読み込みます。 putback( ) は読み込みすぎた文字をストリームに戻すための関 な形式て、連続して出力て、きます。定義されている出 operator 〉〉が定義されている型て、あれば , 例のよう す。表 1 , 2 に示したように演算子関数 operator くく , ます。そして連続した呼び出しが可能になっていま みに使った iostream 変数 ( この場合 cin ) の参照を返し す。 istream の演算子関数 operator 〉〉て、は , 読み込 使った ostream 変数 ( この場合 cout ) の参照を返しま ostream の演算子関数 operator くくは , 書き込みに たが , 処理系は Fig. 5 のように解釈します。 れます。先ほどの例て、も , 演算子関数を使用しまし 算子くく , 〉〉に多重定義された演算子関数が多く使わ 常あまり使われません。実際のプログラムて、は , 演 し , Stream の基本入出力関数 (put, get など ) は , 通 数て、あり , stdio. h の unget( ) に相当します。ただ OSt 「 eam& OSt 「 eam& OSt 「 eam& OSt 「 eam& OSt 「 eam& 0 St 「 ea rn & OSt 「 eam& OSt 「 eam& ostream& OSt 「 eam& ostream& OSt 「 eam& ostream : OSt 「 eam : OSt 「 eam : OSt 「 eam : OSt 「 eam : OSt 「 eam : OSt 「 eam : OSt 「 eam : OSt 「 eam : 0S1 「 eam . OSt 「 eam : OSt 「 eam : :operato 「くく (const streambuf& sb); : ope 「 a10 「くく ( const whitespace& (s) : :operato 「くく (cha 「 c); : ope 「 at0 「くく ( sh0 「 t n) : :ope 「 ator くく (unsigned sh0 「 t n); : ope 「 atO 「くくい nt n); :ope 「 atO 「くく (unsigned int n): : ope 「 atO 「くく (long n); :ope 「 at0 「くく (unsigned long n); : ope 「 at0 「くく (float n) : : ope 「 atO 「くく ( doub 厄 n); :ope 「 atO 「くく (const char* s); 関数の機能 (interface function description) c の値を書き込む st 「 eambuf に残っているものを書き込む s なの内容を書き込む fp 「 intf 形式の書式で書き込む 引数 sb の内容を書き込む 何もしない 整数値 c を書き込む 整数値 n を書き込む 整数値 n を書き込む 整数値 n を書き込む 整数値 n を書き込む 整数値 n を書き込む 整数値 n を書き込む 浮動小数値 n を書き込む 浮動小数値 n を書き込む 文字列 s を書き込む 補足 (GNU) (GNU) (AT&T) (AT&T) (GNU) (GNU) 注 12 GNU の Stream は AT&T のものと多少異な る。表の機能の欄に GNU と あるのは GNU のライプラリ のみ , AT&T とあるのは AT&T 1 . X のライプラリの みの機能てある。 C + 十プログラミング入門 97

3. 月刊 C MAGAZINE 1990年2月号

次に , 複素数の取り扱いのための型 com盟 lex につ いて解説します ( 注 16 ) 。この complex クラスは , クラス 1 : #include く complex. h> 設計の優れたお手本て、あり , 成功した抽象データ型 2 : vo i d ma i n ( ) { ika(). 4, 0.5 ) : 3 : complex takO, のひとって、もあります。前号て、も簡単な使用例は示 4 : C i n > > ta kO : "tako = くく くく tako : cout しましたが , List4 にその例を再度掲載します。 ” ik a くく i ka : cout くく 7 : ” tako 十 くく ika くく tako 十 i ka : cout ューザが定義した型て、あっても , 基本データ型同 8 : ” takO ika cout くく くく tako ー i ka : くく” tako / ika くく takO / ika; 様に扱えるのが特長て、す。その実現て、すが , List5 に 9 : cout くく” tako * cout ika tako * ika : くく complex 型の定義の要約を示します。この実現方法 11 ・ て、は , 複素数は虚数部と実数部の double 型変数て、表 現されています。たとえば , その演算子 operator 十 を表 8 にまとめました。 Stream に対する演算子くく , 〉〉 ( ) は List2(d) のように定義されています。 も定義されているため , 入出力も int や曲 ar 同様にて、 コンストラクタ / ディストラクタおよび演算子関数 きます 0List2(e) に Strea 爪に対する演算子くくの定義 [ 表 7 ] istream の残りの interface—覧 関数の宣言 (interface ん n ction p 「 ototype) 関数の機能 (interface function description) OSt 「 eam * iSt 「 eam. :tie(ost 「 eam * S); 対応する ost 「 eam を引数 s に変更し , 元も ost 「 eam を返す int ist 「 eam: :skip(int i); skip モードの設定を行い , 元のモード値を返す VOid * iSt 「 eam: :operato 「 VOid * (VOid); st 「 eam が正常であれは自分自身のポインタを返し , それ以外てあれば NULL を返す ( 型変換関数 ) cha 「 * ist 「 eam: :bufpt 「 (VOld); st 「 eam がバッフアをもっていれば , バッフアのアドレスを返す int istream: :operato 「 !(void); st 「 eam が正常てあれば偽を返す ( 演算子関数 ) int ist 「 eam : : eof(void); st 「 eam が一 good 状態てあれは真を返す int istream: :fail(void); st 「 eam が一 eof 状態てあれば真を返す st 「 eam が」 a ⅱ状態てあれは真を返す int ist 「 eam: :bad(vold); int istream: :good(void). st 「 eam が一 bad 状態であれは真を返す int ist 「 eam: : 「 dstate(void); st 「 eam の状態値を返す st 「 eam の状態 ( state ) の値を設定する VOid istream : : clea 「 (state value i 引数を省路すると一 good 状態にされる 引数の istream is 中のスペースを読み飛ばす friend VO eatwhile(ist 「 eam&ls); (GNU) ist 「 eam&lst 「 eam: :open(FILE*fp); fp と st 「 eam の接続を行う ( ただし st 「 eam の初期化はしない ) (GNU) istream&lst 「 eam: :open(int fd,iO mode m)•, fp と st 「 eam の接続を行う ( 同上 ) (GNU) fn と st 「 eam の接続を行う ( 同上 ) lSt 「 eam&lSt 「 eam: .•open(const Cha 「 *fn,const cha 「 * m); (GNU) lSt 「 eam&istream•. :open(const Cha 「 *fn,iO mode mode a); fn と st 「 eam の接続を行う ( 同上 ) m,access (GNU) ISt 「 eam&ist 「 eam : : close(void) : st 「 eam に接続されているファイルをクローズする (GNU) lSt 「 eam&lSt 「 eam : : 「 emove(void); st 「 eam に接続されているファイルを削除する (GNU) st 「 eam に接続されている fd ( ファイル記述子 ) の値を返す int istream: :filedesc(void); (GNU) int ist 「 eam: :is_open(void); st 「 eam にファイルが接続されていれは真を返す (GNU) 入出力の際にバッファリングを行わないように設定する iSt 「 eam& iSt 「 eam : : 「 aw(void) : 直前の get(cha 「 * . int. cha 「 ) 0 「 get ⅱ n 可 ) て読み込んだ int ist 「 eam: :iocount(void); (GNU) 文字数を返す (GNU) VOid iSt 「 eam: :er 「 0 「 (void); 工ラーの処理を行う (GNU) st 「 eam に接続されているファイルのパス名を返す const char* iSt 「 eam: :name(void); (GNU) VOid iSt 「 eam: :setname(const Cha 「 * name); ファイル名を引数 name の文字列に変更する 引数 cond が真 ( あれは st 「 eam の状態を」 ai にする (GNU) istream& ist 「 eam . :failif(int cond); s な eam のノヾッフアを変更する ( setbuf ( 3S ) 参照 ) (GNU) ist 「 eam& ist 「 eam. :setbuf(int buffe 「 kind); (GNU) st 「 eam の八ッフアを引数 buf に変更する ist 「 eam& ist 「 eam . :setbuf(int sz. cha 「 * buf); (GNU) 書き込み可能てあれば真を返す int ist 「 eam: :w 「 itable(void); (GNU) 読み込み可能であれば真を返す int istream: : 「 eadable(void); (GNU) st 「 earn の状態値 ( ー eofand ー bad ) を最新のものにする VOid lSt 「 eam . :check state(void); [ 表 8 ] comp 厄 x クラスのコンストラクタ , 演算子関数などの一覧 ディストラクタ , 関数の機能 (interface function desc 「 iption) 関数の目言 (interface function prototype) コンストラクタ , ティストラクタ complex::complex(double 「 =O. O. double ー =O. O); コンストラクタ complex: :complex(void); コンストラクタ complex: :complex(complex& c); コンストラクタ complex: : complex(void); ティストラクタ 演算子関数 complex& complex: :ope 「 atO 「 =(complex&) complex& complex: :ope 「 atO 「十 =(complex&); complex& complex: :ope 「 atO 「—=(complex&); complex& complex: :ope 「 atO 「 * =(complex&); complex& complex: :ope 「 atO 「 /=(complex&); complex complex: :operato 「—(void); f 「 iend complex operator—(complex); f 「 iend int operato 「 ==(complex& . complex&); f 「 iend int operato 「 ! =(complex&. complex&); f 「 iend complex ope 「 ato 「十 (complex&,complex&); friend complex ope 「 ato 「—(complex&,complex&); f 「 iend complex ope 「 ato 「 * (complex&. complex&); f 「 iend complex ope 「 ato 「 /(complex&. complex&); frlend ost 「 eam& ope 「 ator くく (ostream&. complex&); f 「 lend istream& ope 「 ato 「〉〉 (lSt 「 eam&. complex&); 複素数の使用例 List 4 補足 (AT&T) (AT&T) 補足 (AT&T) (GNU) (GNU) (GNU) 複素数の代入 複素数の加算代入 複素数の減算代入 複素数の乗算代入 複素数の除算代入 複素数の負数 複素数の負数 複素数の等式 複素数の不等式 複素数の加算 複素数の減算 複素数の乗算 複素数の除算 OSt 「 eam への書き込み ist 「 eam からの読み込み (GNU) (AT&T) 注 1 6 GNU て、は複素数型 は Complex になっているの て、 , GNU のユーザは記事中 の complex は Comp lex に 売み変える必要がある。 - 三ロ C + + プログラミング入門 101

4. 月刊 C MAGAZINE 1990年2月号

sample% Fig. 7 クラスのイメージ Fig. 6 f00 の実行 sample% f000 please input bignum : 0. 圓 001 ー 1234567890 十 0.00001- 三一 1234567889.99999 11223344556677889900 十 0.00001 = 1122334455667788900.00001 ー 12345.6789 十 0.00001 = ー 12345.67889 999999999.99999 十 0.00001 = IOOOOOOOO(). OOOOO C + 十プログラミング入門 103 bignum Class head CELL_Class car cdr Fig. 8 bignum の構造 1234500 1 12233445 566778899 NULL 123450 1 12233445 566778899 とのて、きる大きさの数値の断片に分割し , それをリ かありますが , 今回は数値を基本データ型て、扱うこ bignum num= ” 1234500112233445566778899 ” blgnum& bignum::ope 「 atO 「 =(bignum& num); bignum.. "bignum(void); bignum. :bignum(bignum& num); bignum::bignum(cha 「 * snum); bignum. :bignum(uint32 「 num=0L); 関数の目言 (inte 「 face function p 「 ototype) [ 表 10 ] bignum クラスの関数一覧 complex po 「 ( dou e 「 . doubletheta=O. O); f 「 iend complex log(complex& z); f 「 iend complex pow(complex& base,complex& sup); f 「 iend complex pow(complex& base,long sup); f 「 iend complex exp(complex& z); f 「 iend complex cosh(complex& z); f 「 iend complex sinh(complex& z); f 「 iend complex cos(complex& z); f 「 iend complex sin(complex& z); friend complex sq 「 t(complex& z); f 「 iend complex con 」 (complex& z); f 「 iend double arg(complex& z); f 「 iend double no 「 m(complex& z); f 「 iend double abs(complex& z); friend double imag(const complex& z): f 「 iend double 「 eal(const complex& z); 関数の宣言 (interface function prototype) [ 表 9 ] comp 厄 x クラスの算術関数等の一覧 スト構造て、保持する方法を採用します。 f 「 iend ist 「 eam& ope 「 ato 「〉〉 (ist 「 eam& s,bignum& a); f 「 iend ostream& ope 「 ator くく (ost 「 eam& s. bignum& a); f 「 iend blgnum& ope 「 ato 「—(bignum& a. bignum& b); f 「 iend blgnum& operato 「十 (bignum& a. bignum& b); cha 「 * bignum: :name(void); bignum& blgnum::ope 「 atO 「—=(blgnum& num); bignum& blgnum::ope 「 ato 「十 =(bignum& num); リスト構造て、実際に構成するのは CELL クラス て、あり , 数値の断片 ( car ) , リストの次のノードへの ポインタ (cdr) , そして , それらを扱う手続きをもっ ています obignum クラスは , CELL ーが構成したリ ストへのポインタ ( head ) のみをもつ容器 ( コンテナ ) クラスて、す (Fig. 7 ) 。たとえば , —bignum num = " 125450011225544556677 田 99 " ; による数値は , 1234500 , 112233445 , 566778899 とい う 3 つの数値の断片に分割され , ー CELL 一変数に格納 されます obignum 変数 num は , その CELL_ 変数を リストを構成しリストへのポイン タを保持します。図示すると Fig. 8 のようになりま す。 CELL クラスは , 一般ューザに対して , あまり 見せたくないクラスて、あり , 公開メンバはごく一部 だけて、 , それらは静的 (static) メンバの初期化を行う CELL クラスの大域変数 dumb のために用意されて います。残りの多くのメンバは保護メンバて、あり , CE LL クラスのメンノヾ関数および CE LL クラス のフレンドとして宣言されている bignum クラスのメ ンバ関数だけにアクセスが許されます。 さて , CELL - クラスのディストラクタ _CELL CELL_( ) は , 再帰的に処理を行います。メンバ 変数 cdr が NULL( つまり , つながるノードがない ) て、ないかぎり , cdr が指すノードを破棄しようとし て , そのディストラクタを呼び出し続けます。ー CELL クラスの多くのメンバ関数は , こうした再帰的な処 関数の機能 (interface function description) 複素数の実数部 複素数の虚数部 複素数の絶対値 複素数のノルム 複素数の偏角 複素数の共約 複素数の平方根 複素数のサイン 複素数のコサイン 複素数のノ \ イバホリックサイン 複素数のハイバホリックコサイン 複素数の指数 複素数のべき乗 複素数のべき乗 複素数の対数 複素数の極座標 関数の機能 (interface function desc 「 iption) 引数「 num て初期化 ( 「 num は数値 ) 引数 snum て初期化 ( snum は文字列 ) 引数 numc 初期化 (num は bignum) ディストラクタ 引数 num を代入 引数 num を加算代入 引数 num を減算代入 型名の取得 ( 仮想関数 ) bignum の加算 bignum の減算 OSt 「 eam への書き込み st 「 eam からの読み込み 補足 補足

5. 月刊 C MAGAZINE 1990年2月号

また , GNU の Stream は AT&T に比べて , この処 その状態て、あれば , 真 ( 0 以外 ) の値を返します。 理は簡単になっています ( 注 14 ) 。 GNU て、のファイルの rdstate( ) はストリームの状態そのものを返し , ストリームへの接続は List2 (b) のように行います。 clear( ) はストリームの状態を指定の状態に強制的に こて、 , 第 1 引数はファイルのパス名 , 第 2 引数は 設定します。 IO モード , 第 3 引数は access モードて、あり , io—mode, 以下に Stream の実現の解説のために , 参考まて、に access-mode は File. h(stream. h 中て、 include され ostream クラスの定義の要約を示します ( 要約のため る ) 中て、 , List3 のように定義されています。したがっ メンバ関数は省きました。また , istream についても て , 、、 f00. do 〃は書き込み専用て、ストリーム fsout に 同様て、す ) 。 接続されます。もし、、 f00. do クが存在しなければ , 〃 ( 1 ) 工 DEA C 十十 ostream 新たに作成します。 class ostream { streambuf * bp; Stream の実装ほか short state; 入出力機能の最後に , 残りのインタフェイスおよ び Stream クラスの実現について解説します。そのほ かの機能には , ストリームの情報を取得するための 〃 ( 2 ) GNU C 十十 ostream インタフェイスがあります (GNU の Stream には , フ class ostream : private Fi1e { ァイルから引き継いた機能がある ) 。表 6 に ostream の , 表 7 に istream の残りのインタフェイスを示しま 同じ ostream て、あっても , このように実装にはい した。ストリームの状態は , 列挙型 state-value て、 ろいろな方法があります。 AT&T の ostream は , ス 表現され , その state—value は List2 (c) のように定義 トリームのバッフアをメンバ変数にもっ形て、実装さ されています。 れており , GNU の ostream は , 独自のメンバ変数を ー good は正常な状態 , ー eof は EOF の状態て、あり , もたない File クラスの派生クラスの形て、実装されて fail%•よびー bad が不正な状態て、す。ー fail は単なるフ います ( 注 15 ) , , , て、重要なのは , どちらの形の実装て、 ォーマットエラーなどて、あり , データの損失はあり あっても , その使い方にはほとんど変わりがないと ません。ー bad はデータの損失の可能性があるエラー いうことて、す。 て、す。こうしたストリームの状態を取得するインタ フェイスが good( ) , eof( ) , fail( ) , bad( ) て、あり , [ 表 6 ] ostream の残りの interface—覧 関数の宣言 (interface function prototype) VOid* OSt 「 eam: :ope 「 atO 「 VOid * (void); cha 「 * ostream: :bufpt 「 (void); int ostream : :ope 「 atO 「 !(void); int OSt 「 eam : . good(void); int OSt 「 eam . : eof(void) : :fail(void); int OSt 「 eam . :bad(void); int OSt 「 eam . ・ : 「 dstate(void); int OSt 「 eam . :clea 「 (state valuei=O); voidost 「 eam: ost 「 eam& ostream: :open(FlLE* fp); OSt 「 eam& OSt 「 eam . :open(int fd,iO mode m); OSt 「 eam& OSt 「 eam: :open(const Cha 「 * fn,const Cha 「 * m); ostream& OSt 「 eam : : open(const 「 * fn,lO mode m. access mode a); ostream& ostream. :close(void); OSt 「 eam& OSt 「 eam : : 「 emove(void) : int OSt 「 eam: :filedesc(void); int OSt 「 eam: :is_open(void); OSt 「 eam& OSt 「 eam : : 「 aw(void) : int OSt 「 eam: :locount(void); VOid OSt 「 eam: : e 「「 0 「 ( VOid ) : const Cha 「 * ostream: :name(V01d)•, VOid OSt 「 eam . :setname(const Cha 「 * name); ostream& OSt 「 eam: :failif(int cond); OSt 「 eam& ostream . : setbuf(int buffe 「 Lkind); OStream& OSt 「 eam: :setbuf(int sz. cha 「 * buf); int OSt 「 eam: :w 「 itable(void); int ost 「 eam: : 「 eadable(void); VO OSt 「 eam : : check_state(vold); C 十十 プログラミング 入門 複素数型 関数の機能 (inte 「 face function desc 「 iption) st 「 eam が正常であれば自分自身のポインタを返し , それ以外であれば NULL を返す ( 型変換関数 ) st 「 eam がバッフアをもっていれば , buufe 「のアドレスを返す st 「 eam が正常であれば偽を返す ( 演算子関数 ) st 「 eam が一 good 状態であれば真を返す st 「 eam が - eof 状態であれは真を返す st 「 eam が」 a ⅱ状態てあれは真を返す st 「 eam が一 bad 状態てあれば真を返す st 「 eam の状態値を返す st 「 eam の状態 ( state ) の値を設定する ( 引数を省路すると一 good 状態にされる ) fp と st 「 eam の接続を行う ( ただし , st 「 eam の初期化はしない ) (GNU) fp と st 「 eam の接続を行う ( 同上 ) (GNU) fn と st 「 eam の接続を行う ( 同上 ) (GNU) fn と st 「 eam の接続を行う ( 同上 ) (GNU) st 「 eam に接続されているファイルをクローズする (GNU) (GNU) st 「 eam に接続されているファイルを削除する st 「 eam に接続されている fd ( ファイル記述子 ) の値を返す (GNU) (GNU) st 「 eam にファイルが接続されていれは真を返す (GNU) 入出力の際にバッファリングを行わないように設定する 直前の get(cha 「 * . int. cha 「 ) や get ⅱ ne ( に読み込んだ文字数を返す (GNU) (GNU) 工ラーの処理を行う (GNU) st 「 eam に接続されているファイルのパス名を返す (GNU) ファイル名を引数 name の文字列に変更する 引数 cond が真であれば st 「 eam の状態を」 ai にする (GNU) st 「 eam のバッフアを変更する ( setbuf ( 3S ) 参照 ) (GNU) st 「 eam のバッフアを引数 buf に変更する (GNU) 書き込み可能であれは真を返す (GNU) 読み込み可能であれは真を返す (GNU) st 「 eam の状態値 ( ー eof かー bad ) を最新のものにする (GNU) 補足 (AT&T) 注 14 GNU の Stream は , AT&T 2 . 0 の ioStream に 少し似た仕様になっており , このストリームの生成の処 理も似ている。参考にまて に , ioStream て、のストリー ムの生成を以下に示す。将 来的には , GNU の Stream 仕様も互換性のために , ioStream のようになると予 想される。 ofstream fsout("foo. do 物 , ios : f s 0 u t くく ' H e 1 1 0 , World ”くく” \ n ” ; 注 15 File クラスは C の標 準入出力ライプラリに対応 する機能を提供するクラス てあり , Stream は , ほとん ど File クラスの機能を使っ ている。 CMAGAZINE 1 OO 19 2

6. 月刊 C MAGAZINE 1990年2月号

OS か変える明日のパソコ : もう分からないとはいわせない PC BESTCHO ℃ E( 後編 ) プラス 20 % の 舌題の「 98NOTE 」も加え、ラップトップ 98 と新製品を紹介 プリンタ活用術管理工学研究所 「桐 ver. 3 」と「新松」を中心にレポート 複数のパソコンで、 1 台のプリンタを共有するにはどう したらよいのか。 MS - DOS 上でプリンタをうまく使う プログラマーズ・ツールボックス / MS - DOS PLUS ONE / コン など役立つプリンタ活用テクニックをピュータ「注」事典 / バイト & ワードの風にのって / オフィス・ストー には 満載。 リー / 夢空間への招待状 好評発売中 定価 600 円 ( 税込 ) 価格・流通・サポート・・・。・・ソフト革命なるか ! ? ワークステーションの 「ビル・トッテン アシスト社長 新たな時代か始まった DynaBook とともに築く低価格ソフト時代 クレオ [BUSI COMPO システム手帳用リフィル 98NOTE120 % 活用ノード SOFT 日 K 好評発売中 16 ビットから 32 ビットへ PC テストルーム 好評連載 第 2 特集 一三ロ SOFT 日 K 2 月号 tKEYMAN し S. A. 田原朗のコンピュータ・ルボ 第脳時代のヒットメカー ー特別付録ト ソルボーンコンピュータ社長 日本ソフトノヾンク出版事業部 東京都千代田区九段南 2-3-26 谷 03 ( 230 ) 7670 ト紵イスク時代 タクラマクレガ - 」

7. 月刊 C MAGAZINE 1990年2月号

のパイプだとて、きることがけっこうあります。 tee コマンドは , ファイル名を引数として とり , 標準入力のデータを , 標準出力と引 数て、示されたファイルのふたつに出力する こに載せた操作例も , この tee ものて、す。 コマンドを用いてファイルに記録して編集 したものて、す。それには csh を起動するとき に , パイプを通して tee につないて、おけばい いのて、す ( Fig. 10 ) 。 MS-DOS のパイプには こんな芸当はてきません。 なぜて、きないかというと , tee が csh と同時 に動作し , csh の入出力を妨げることなく , ファイルへの出力を続けなければならない からて、す。いい換えると , csh は端末に対す る入力に応じた動作を行い , 対応する出力 を標準出力に対して行います。この出力は ただちに tee コマンドによって処理され , tee コマンドの標準出力に出力されなければな りません。そうて、ないと , ユーザは自分の 命令に対して csh が行った動作をそのときに 見ることがて、きないのて、す。これに近い とを MS-DOS て、試してみましよう。ただ し , MS ー DOS システムには tee コマンドがな いのて、 , 代わりに MORE を使います。ユー ザの入力に対して COMMAND.COM がいっ ものように反応し , かっ記録のファイルが 正しくて、きていればいいわけて、すが , うま くいきません ( Fig. 11 参照 ) 。 COMMAND. COM はユーザに対して対話的に動くものて、 A>type sample. 1 ー mo 「 e This is "sample. 1" file. Fig. 8 ( MS ー DOS のバイプに相当するコマンド群 ) す。 MS ー DOS て、のパイプは , 順にコマンドを 起動していくものて、すから , 対話的に動作す るコマンドて、ある COMMAND.COM をパイ プとともに用いることはて、きないのて、す。 実は D-SheII も同じ欠点をもっています。と いうよりこれは MS ー DOS の欠点なのて、す。 UNIX のパイプがなぜ強力かというと , 標 準入力 , 標準出力の切り換えと , 複数のコ マンドが同時に動くからて、す。 て、は , パイプて、つなぐような関係にない コマンドを , 複数同時に動かすことはて、き ないものて、しようか。 ノ、クグラウンド プセス UNIX て、は , ハードディスクをユーザ全員 て、使用しているのて、 , 大きなファイルはほ かの人の迷惑になります。 Fig. 12 を見てく ださい。大きなファイルがあります。人の 迷惑になりますから , compress コマンド を使って圧縮しましよう ocompress コマン ドは , LHarc のように複数ファイルを圧縮す ることはて、きませんが , 同じようなコマン ドて、す。なお , compress すると , 元のファ イルは削除され , 代わりに元のファイルの 名前の最後にツ Z" をつけた名前をもつフ ァイルが作成されます。これが compress さ れたファイルて、す。圧縮されたファイルを Fig. 10 解凍するときには uncompress コマンドを用 います ( Fig. 13 ) 。 処理内容からすれば当然て、すが , かなり 時間がかかります。 UNIX て、は , このような 場合 , 処理が終わるまて、待っている必要は ありません。コマンドの最後に、、 & 〃をつけ て実行を開始を指示すれば , 次のコマンド を動かすことがて、きます ( Fig. 14 参照 ) 。 たとえば compress コマンドの最後に、、 & 〃 をつけて実行させると , すぐにプロンプト が帰ってきますが , compress コマンドが速 くなったわけて、はありません。 コマンドの最後に、、 & クをつけると , コマ ンドの実行を開始しただけて、 , 終了する前 にプロンプトが帰ってきて , 次のコマンド の実行がて、きるようになります。もちろん , compress コマンドはきちんと実行されてい ます。 ls コマンドを実行してみると確認て、き ます (Fig. 15 参照 ) 。まだ compress て、圧縮さ れていないファイルもありますが , いくっ かのファイルの名前の後ろに 、、 Z" 力すつい ているのて、 , compress コマンドがきちんと 働いていることは確かて、す。 コマンドに、、 & 〃をつけて実行すると , 続 行中のコマンドと並行して , ューザは別の 仕事にかかれるわけて、す。 このように、、 & 〃をつけてコマンドを実行 させたものを「バックグラウンドプロセス」 と呼びます。バックグラウンドプロセスに % csh ー tee sample. ope 「 ations sample. 1 sample . 4 sample. 2 sample. 5 % cat sample. 1 This is "sample. 1" file. % D % cat sample. operations sample. 1 sample. 3 sample. 2 sample. 4 This is "sample. 1 " Fig. 11 command ー more sample. 3 sample. 5 A>type 「 eadme. doc > く一時的ファイルの名前 > A> more くく一時的ファイルの名前 > % cat sample. 1 ー more This is sample. 1" 56 CMAGAZINE 19 2