【问题标题】:Left and right justifying output consisently左右对齐输出一致
【发布时间】:2014-04-20 22:53:22
【问题描述】:

我的项目是使用 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;
    }

当我使用resetiosflags(ios::left) 进行右对齐时,我不明白setw() 的必要性。我尝试用rightleft 替换setiosflags(ios::left)resetiosflags(ios::left)

我是一个 c++ 初学者,使用 netbeans c++ 编码和 g++ 编译。我真的不太了解格式化控制台输出,所以我将不胜感激。我不一定必须使用顶部指定的 3 个函数,只要不同的方式与任何浮点长度一致即可。谢谢!

【问题讨论】:

    标签: c++ std iostream iomanip


    【解决方案1】:

    setw(n) 设置下一个输出的宽度,而 setiosflags(ios::left) 和 setiosflags(ios::right) 设置该输出的对齐方式。我更喜欢使用 std::left 和 std::right 而不是 setiosflags,因为它对我来说看起来更干净。

    当您像这样输出基本费率时:

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

    这行中说 setw(4) 的部分是仅将 4 的宽度应用于美元符号,而不是美元符号和变量 bc。这就是为什么对于不同的输入会得到不同的结果。没有为变量输出本身指定宽度。每次你想以特定宽度输出某些东西时,你必须在它之前调用 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
    

    这分为三个部分:

    • 附加费文字
    • 那个和美元符号之间的填充
    • 金额本身的输出

    这可以通过以下方式完成:

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

    确定 31 是美元的适当宽度,因为我的输出宽度是 49(包括新行字符)。我取了“附加费”中的字符数 (9) 美元符号 (1) 和宽度我想要我的货币输出 (7) - (4 位数字加上小数加上精度),总计 (17) 增加了一个换行 (\n) 并从 49 (31) 中减去。

    我对您的代码进行了一些改造,它与您项目顶部的输出相匹配。我在里面放了一些 cmets 让事情更清楚一些。

    这里是:

    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;
    

    希望这会有所帮助。

    汤姆

    【讨论】:

    • 谢谢@zugzwang!感谢解释帮助我完成了这个项目。该代码使其易于理解。再次感谢!
    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多