Левый и правый, обосновывающий вывод
Мой проект состоит в том, чтобы создать этот вывод, используя 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;
Надеюсь это поможет.
Том