Программирование >>  Структурное программирование 

1 ... 42 43 44 [ 45 ] 46 47 48 ... 342


32.91

но пользователь, складывающий эти числа в том виде, в котором они напечатаны, ожидает получить сумму 32.90!

Хороший стиль программирования 2.21

Не используйте переменные типов float и double для денежных расчетов. Неточность чисел с плавающей запятой может привести к ошибкам, которые проявятся в итоге в неправильной сумме денег В качестве упражнения попробуйте использовать для денежных расчетов целые числа. Заметим: библиотека классов С++ позволяет должным образом осуществлять денежные расчеты.

Оператор вывода

cout setw{3) << year

setiosflags(ios::fixed ios::showpoint)

<< setw{21) << setprecision(2) << amount << endl;}

печатает значения переменных year и amount в формате, заданном параметризованными манипуляторами потока setw, setiosflags и setprecision. Обращение setw(3) определяет, что следующая выходная величина будет напечатана с шириной (размером) поля 3, т.е. ее значение будет содержать по крайней мере 3 символьных позиции. Если длина выходной величины менее 3 символов, она по умолчанию будет выравнена в поле по правому символу. Если длина выходной величины более 3, размер поля будет увеличен, чтобы вместить полную величину. Можно использовать обращение setiosflags(ios::left) для того, чтобы задать выравнивание по левому символу.

Остальная часть задания формата в приведенном операторе вывода указывает, что переменная amount должна печататься как значение с фиксированной точкой и с обязательной печатью этой точки (задается выражением setiosflags(ios::fixed ios::showpoint)) с правым выравниванием в поле размером в 21 символ (задается выражением setw(21)) и с двумя цифрами после десятичной точки (задается выражением setprecision(2)). Мы подробнее рас-

Типичная ошибка программирования 2.16

Забывают включить файл math.h в программы, использующие библиотеку матема -тических функций.

Обратите внимание, что мы объявили переменные amount, principal и rate типа double. Мы сделали это для простоты, поскольку мы имеем дело с дробной частью долларов и нам нужен тип с плавающей запятой. К сожалению, это может вызвать затруднения. Поясним, к каким недоразумениям может приводить использование float или double при представлении суммы долларов (в предположении, что печать осуществляется с setpreci-sion(2)). Две суммы долларов типа float, хранящиеся в памяти, могут иметь значения 14.234 (печатается как 14.23) и 18.673 (печатается как 18.67). Когда эти суммы складываются, результат внутри компьютера получается 32.907, что будет напечатано как 32.91. Таким образом, печать может иметь вид:

14.23 + 18.67



2.16. Структура множественного выбора switch

Мы рассмотрели структуру с единственным выбором if и структуру с двойным выбором if/else. Но порой алгоритм может содержать ряд альтернативных решений, причем некоторую переменную (или выражение) надо проверять отдельно для каждого постоянного целого значения, которое она может принимать; в зависимости от результатов этой проверки должны выполняться различные действия. Для принятия подобных решений в С++ имеется структура множественного выбора switch.

Структура switch состоит из ряда меток case и необязательной метки default (умолчание). Программа на рис. 2.22 использует switch для расчета числа различных буквенных оценок, полученных студентами на экзамене.

В этой программе пользователь вводит буквенные оценки. Внутри заголовка while

while ( ( grade = cin.get() ) != EOF )

сначала выполняется присваивание, заключенное в скобки. Функция cin,get() читает один символ, введенный с клавиатуры, и сохраняет его в целой переменной grade . Использованная в cin.get() нотация с точкой будет объяснена в главе 6, Классы . Обычно символы хранятся в переменной типа char. Однако важной особенностью С++ является то, что символы могут храниться в любом целом типе данных, поскольку они представляются в компьютере как однобайтовое целое. Таким образом, мы можем трактовать символ или как целое, или как символ в зависимости от его использования. Например, оператор

cout Символ ( а << ) имеет значение (int) а endl;

напечатает символ а и его целочисленное представление: Символ (а) имеет значение 97

Целое число 97 является численным отображением символа в компьютере. Многие компьютеры сегодня используют множество символов ASCII (American Standard Code for Information Interchange), в котором букве a в нижнем регистре соответствует число 97. Список символов ASCII и их десятичных значений представлен в приложении В.

смотрим богатые возможности С++ по форматированию ввода-вывода в главе 11.

Заметьте, что вычисление выражения 1.0 + rate, являющегося аргументом функции pow, производится в теле оператора for. В действительности вычисление этого выражения дает одинаковый результат в каждом цикле, так что его повторные вычисления расточительны.

Совет по повышению эффективности 2.3

Избегайте размещать выражения, значение которых не изменяется, внутри цикла. Но даже, если вы сделаете это, то многие современные сложные оптимизирующие компиляторы автоматически разместят подобные выражения вне цикла во время генерации машинного кода.



Подсчет числа буквенных оценок tinclude <iostreain.h>

main() {

int grade;

int aCount .= 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0;

cout Введите буквенную оценку. endl

Введите символ EOF по окончании ввода. endl;

while ( ( grade = cin.get() ) != EOF ) {

switch (grade) {

case

case a

++aCount;

break; case B: case b

++bCount;

break; case С: case c

++cCount;

break;

case D

case

++dCount; break;

case

case

++fCount; break; case \n: case break;

default:

switch, вложенный в while

Grade равна A в верхнем регистре или а в нижнем регистре.

Grade равна В в верхнем регистре или b в нижнем регистре.

Grade равна С в верхнем регистре или с в нижнем регистре.

Grade равна D в верхнем регистре или d в нижнем регистре.

Grade равна F в верхнем регистре или f в нижнем регистре.

этот ввод игнорируется

при любых других символах cout Введена неправильная буквенная оценка. << Введите новую оценку. << endl;

break; }

cout endl Количество различных оценок:

endl А: aCount endl В: bCount endl С: cCount endl D: dCount endl F: fCount endl;

return 0; }

Рис 2.22. Пример использования switch (чааь 1 из 2)



1 ... 42 43 44 [ 45 ] 46 47 48 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика