第24章 書式制御 その2


今回も簡単です。 widthメンバ関数が出てきます。これは出力する 桁数を決めるものです。cout.width(10)とすれば 10桁分表示するスペースを確保します。 注意すべき点は一度画面表示を行うとこれが無効になることです。 もう一度cout.widthをしてください。 次にios::showposというのが出てきますが これは、正の数であれば「+」を付けるという意味です。 また、fillメンバ関数は、あいている桁にこの関数で 指定した文字を出力します。 いろいろ説明するより例を示した方がわかりやすいでしょう。

#include <iostream.h> int main(void) { int i, j; int a = 125; for (j = 0; j <= 2; j++) { for (i = 0; i <= 9; i++) { cout << i; } } cout << endl; cout.width(8); cout << a << endl; cout.width(10); cout << a << endl; cout << a << endl;//この時もうwidth(10)は無効 cout.width(10); cout.setf(ios::showpos); cout << a << endl; cout << a << endl;//showposは有効 cout.unsetf(ios::showpos); cout.width(10); cout.fill('0');//あいている桁を0で埋める cout << a << endl; cout.width(20); cout << a << endl; cout.width(20); cout.fill('-'); cout << a << endl; return 0; }


実行結果は左の図のようになります。 上のプログラムはたいして難しくはないですね。

つぎは、ios::right, ios::left, ios::internalですが、 これは、ios::adjustfieldとともに使います。 多分想像がつくと思いますが、rightは右詰、leftは 左詰の意味です。internalというのはなかなか想像するのが 難しいのですが、まず記号を出力、次にfillで指定された 文字があれば出力するというものです。これも 例題を示した方がわかりやすいですね。

#include <iostream.h> int main(void) { int a = 123; char *str = "ABC"; cout.width(10); cout.setf(ios::left, ios::adjustfield); cout << a << endl; //結果としては目に見えない cout.width(10); cout.setf(ios::right, ios::adjustfield); cout << a << endl;//右詰になるので空白があく cout.width(10); cout.fill('_'); cout.setf(ios::showpos); cout.setf(ios::internal, ios::adjustfield); cout << a << endl;//最初に「+」記号次に「_」が出力される cout.width(10); cout << str << endl;//strにたいしても有効です return 0; }


結果は、左の通りです。簡単ですね。

さて、次は浮動小数の表し方です。

エー、まだやるの?

はい。次もどうということもないので 一気にやってしまいましょう。 ios::showpointというのがあります。 これも想像がつきますね。小数点の 「.」を表示するという意味です。 (123.0などの場合)

ios::scientific, ios::fixedこの2つは ios::floatfieldとともに使います。 これも何となく想像がつきますね。 scientificの方は、科学技術計算用 つまり、指数表記(3.15e+004など) となります。fixedの方は固定小数点表記です。 例題を見てみましょう。

#include <iostream.h> int main(void) { double a = 123.456; double b = 256.0; cout << a << endl; cout << b << endl;//小数点以下0なのでピリオドは表示されない cout.width(15); cout.setf(ios::right, ios::adjustfield); cout << a << endl; cout.width(15); cout << b << endl; cout.setf(ios::showpoint); cout << b << endl;//小数点以下0でもピリオド表示 cout.setf(ios::scientific, ios::floatfield); cout << b << endl; //指数表記 cout.setf(ios::fixed, ios::floatfield); cout << b << endl; //固定小数表記 return 0; }


さて、結果は左の通りですが、 一つ疑問が残りますね。それは、ios::showpointの ときとios::fixedの場合で小数の精度が違っていませんか。 これは、処理系によっても結果が違うようです。 自分のコンパイラのヘルプやら、マニュアルで確認して 下さい。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Feb/08/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。