1

私のプロジェクトは、setw()、setfill()、setiosflags() を使用してこの出力を作成することです。

Enter KWH used 993

        C O M P S C I  Electric
------------------------------------------------
Kilowatts Used  993
------------------------------------------------

Base Rate    993 @ $  0.0475            $  47.17
Surcharge                               $   4.72
Citytax                                 $   1.42
______

Pay this amount                         $  53.31

After May 20th Pay                      $  55.44

コードを使用してこれを機能させることができますが、使用するキロワットが 2 桁の場合のみです。桁数が多い場合、右詰めが機能しません。コードを編集して、3 桁、4 桁などに正しく配置できます。コードがテストされるとき、入力されるキロワットがわからないので、任意の桁数のキロワットで機能するコードが必要です。

    /* 
     * File:   main.cpp
     * Author: -------------------------
     *
     * Created on ----------------------
     */

    #include <cstdlib>
    #include <iomanip>
    #include <iostream>

    using namespace std;
    /*
     * 
     */
    int main() {
        float br; // base rate
        float surcharge; // surcharge
        float taxrate; // tax rate
        float late; // late rate

        float kwh; // kilowatts used
        float bc; // base cost
        float scc; // surcharge cost
        float ctc; // city tax cost

        br = .0475; // kilowatt rate
        surcharge = .1; // surcharge rate
        taxrate = .03; // tax rate
        late = .04; //rate if payment is late

        // cout.width(38);
        cout << "Kilowatts used last month: ";
        cin >> kwh; // get kwh used from user

        cout << "\n";

        cout << "\n";

        cout << "        C O M P S C I Electric        " << "\n";

        cout << setiosflags(ios::fixed|ios::showpoint) << setprecision(2); // set ios flags
        cout << setfill('-') << setw(38) << "\n"; // display dashes in line
        cout << setiosflags(ios::left) << "Kilowatts Used" << setfill(' ') << setw(23) << resetiosflags(ios::left) << kwh << "\n"; // output kwh formally
        cout << setfill('-') << setw(38); // separate

        cout << "\n" << "\n";
        // calculations
        bc = br * kwh;
        scc = surcharge * kwh;
        ctc = taxrate * kwh;
        cout << left << "Base Rate    " << kwh << " @ $0.0475 " << setfill(' ') << setw(4) << right << "$" << bc << "\n"; //output base rate, right justify cost
        cout << left << "Surcharge" << setw(24) << right << "$" << scc << "\n"; // output surcharge cost, right justify cost
        return 0;
    }

正当化するためsetw() に使用する場合の必要性がわかりません。andをandresetiosflags(ios::left)に置き換えてみました。setiosflags(ios::left)resetiosflags(ios::left)rightleft

私は、netbeans c++ を使用してコーディングし、g++ をコンパイルする C++ の初心者です。コンソール出力のフォーマットについてはあまりよく知らないので、助けていただければ幸いです。別の方法が任意のフロート長で一貫して機能する限り、上部に指定されている 3 つの関数を必ずしも使用する必要はありません。ありがとう!

4

1 に答える 1

2

setw(n) は次の出力の幅を設定し、setiosflags(ios::left) と setiosflags(ios::right) はその出力の位置揃えを設定します。setiosflags の代わりに std::left と std::right を使用することを好みます。

次のように基本レートを出力していた場合:

cout << left << "Base Rate    " << kwh << " @ $0.0475 " << setfill(' ') << setw(4) << right << "$" << bc << "\n"; //output base rate, right justify cost

この行の setw(4) と書かれている部分は、ドル記号と変数 bc ではなく、ドル記号のみに幅 4 を適用していました。これが、異なる入力に対して異なる結果を得ていた理由です。変数出力自体に幅が指定されていませんでした。特定の幅で何かを出力したいときはいつでも、その前に setw を呼び出さなければなりません。また、このような長いコード行は、読みやすくするために別の行に分けることをお勧めします。

このコードを次のように修正しました。

/* 
 * Output Base Rate 
 */
cout << setfill(' ');
cout << left << "Base Rate   ";
cout << right << setw(8) << kwh; 
cout << " @ $" << right;

// Reset precision to 4 to output kilowatt rate, then reset back to 2 for currency
cout << setprecision(4);
cout << setw(6) << br;
cout << setprecision(2);

cout << setw(10) << "$";
cout << setw(7) << bc << "\n"; 

また、コンソール アプリケーションの出力をデバッグしようとするときに、塗りつぶし文字をスペースではなく _ に変更すると便利だと思います。setw 関数は、特にすべてを固定幅で出力しようとする場合に、コンソール出力で非常に重要です。たとえば、次のように出力したい場合:

Surcharge                               $   4.72

これには 3 つの部分があります。

  • 追加料金テキスト
  • それとドル記号の間の塗りつぶし
  • 量自体のアウトプット

これは、次の方法で実現できます。

cout << left << "Surcharge";
cout << right << setw(31) << "$";
cout << setw(7) << scc << "\n"; 

私の出力幅は 49 (改行文字を含む) であるため、31 がドルの適切な幅であると判断されました。「Surcharge」の文字数 (9)、ドル記号 (1)、必要な通貨出力 (7) - (4 桁、小数点、精度) を合計すると、(17) が 1 つ余分に追加されました。改行 (\n) を 49 (31) から減算します。

私はあなたのコードを少し改造しました。それはあなたのプロジェクトの上部の出力と一致します。もう少し明確にするために、そこにいくつかのコメントを入れました。

ここにあります:

float br; // base rate
float surcharge; // surcharge
float taxrate; // tax rate
float late; // late rate

float kwh; // kilowatts used
float bc; // base cost
float scc; // surcharge cost
float ctc; // city tax cost

br = .0475; // kilowatt rate
surcharge = .1; // surcharge rate
taxrate = .03; // tax rate
late = .04; //rate if payment is late

// cout.width(38);
cout << "Kilowatts used last month: ";
cin >> kwh; // get kwh used from user

cout << "\n";

cout << "\n";

cout << "            C O M P S C I Electric             " << "\n";

// Set float precision and formats
cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(2); 

// Display first serparator
cout << setfill('-') << setw(48) << "\n"; 

// Display Kilowatts input
cout << left << "Kilowatts Used" << setfill(' ') << setw(8) << right << kwh << "\n"; 

// Display second separator
cout << setfill('-') << setw(48); // separate

cout << "\n" << "\n";

// do calculations
bc = br * kwh;  
scc = surcharge * kwh;
ctc = taxrate * kwh;

/* 
* Output Base Rate 
*/
cout << setfill(' ');
cout << left << "Base Rate   ";
cout << right << setw(8) << kwh; 
cout << " @ $" << right;

// Reset precision to 4 to output kilowatt rate, then reset back to 2 for currency
cout << setprecision(4);
cout << setw(6) << br;
cout << setprecision(2);

cout << setw(10) << "$";
cout << setw(7) << bc << "\n"; 

/*
 * Output Surcharge 
 */
cout << left << "Surcharge";
cout << right << setw(31) << "$";
cout << setw(7) << scc << "\n"; 

return 0;

お役に立てれば。

トム

于 2014-03-15T18:07:50.803 に答える