Левый и правый, обосновывающий вывод

Мой проект состоит в том, чтобы создать этот вывод, используя 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() когда я использую resetiosflags(ios::left) правильно оправдать. Я пытался заменить setiosflags(ios::left) а также resetiosflags(ios::left) с right а также left;

Я начинающий C++, использующий netbeans C++ для кодирования и g++ для компиляции. Я действительно не очень разбираюсь в форматировании вывода консоли, поэтому буду признателен за любую помощь. Мне не обязательно использовать 3 функции, указанные вверху, если другой способ работает согласованно с любой длиной float. Спасибо!

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).

Я немного переделал ваш код, и он соответствует выводу вашего проекта в верхней части. Я добавил несколько комментариев, чтобы сделать вещи немного более ясными.

Вот:

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;

Надеюсь это поможет.

Том

Другие вопросы по тегам