logo
Харви Дейтел, Пол Дейтел Как программировать на С++ / 02-Deitel-Стр-115-214

174 Глава 2

  1. (Тройки Пифагора) Прямоугольный треугольник может иметь все стороны, выраженные целыми числами. Множество троек целых значений сторон прямоугольного треугольника называется тройками Пифагора. Эти три стороны должны удовлетворять соотношению, по которому сумма квадратов двух сторон (катетов) равна квадрату третьей стороны (гипотенузы). Найдите все тройки Пифагора, в ко­ торых и катеты, и гипотенуза не больше 500. Используйте трижды вложенные циклы for, которые перебирают все возможности. Это пример вычисления «в лоб», сводящегося к перебору. Вы узнаете в более продвинутых курсах компьютерных вычислений, что есть много интересных проблем, для которых неизвестно других алго­ ритмов, кроме решения «в лоб».

  2. Компания платит своим сотрудникам или как менеджерам (которые получают фиксированный недельный оклад), или как почасовым работникам (которые получают фиксированную почасовую оплату за первые 40 рабочих часов и полуторную почасовую ставку за пере­ работку сверх 40 часов), или как работникам на комиссионных на­ чалах (которые получают $250 плюс 5.7% от суммы недельных продаж), или как сдельщикам (которые получают фиксированную сумму с каждой выработанной ими единицы продукции — каждый сдельщик в этой компании выпускает только один вид продукции). Напишите программу расчета еженедельной оплаты каждого сотруд­ ника. Вы не знаете заранее числа сотрудников. Каждый тип со­ трудника имеет свой код оплаты: менеджеры имеют код 1, поча­ совые работники — код 2, работающие на комиссионных началах имеют код 3, сдельщики — код 4. Используйте switch, основанный на этих кодах оплаты, для расчета выплат каждому сотруднику. В структуре switch предлагайте пользователю (клерку, составляющему расчетную ведомость) ввести соответствующие данные, необходимые для расчета выплаты сотруднику в соответствии с его кодом оплаты.

  3. (Законы Моргана) В данной главе мы рассмотрели логические опе­ раторы &&, и !. Законы Моргана помогают иногда выразить с их помощью логические выражения в более удобной форме. Эти законы гласят, что выражение \(выражение1 && выражение2) логически эквивалентно выражению (! выражение! || ! выражение2). Анало­ гично выражение 1(выражение1 || выражение2) эквивалентно выра­ жению (I выражение! && ! выражение2). Используйте законы Мор­ гана для записи выражений, эквивалентных каждому из приведенных ниже, а затем напишите программу, которая показала бы в каждом случае эквивалентность первоначальных и новых вы­ ражений:

a) ! (x < 5) && ! (у >= 7)

b) ! {a == b) I I ! (g != 5) С) ! ((x <= 8) && (у > 4) ) d) ! ((i > 4) || (j <=6))

2.58. Напишите программу, которая напечатает следующий ромб. Вы мо­ жете использовать операторы вывода, которые печатают или одну звездочку (*), или один пробел. Максимально используйте повторе-

Управляющие структуры _ 175

ние (с вложенными структурами for) и минимизируйте число опе­раторов вывода.

* ***

*******

*********

*******

*****

***

*

  1. Модифицируйте программу, которую вы написали в упражнении 2.58, чтобы она читала нечетное число в пределах от 1 до 19, оп­ ределяющее число строк в ромбе. Ваша программа должна выводить на экран ромб соответствующего размера.

  2. В адрес операторов break и continue раздается критика по поводу того, что они неструктурны. Действительно, операторы break и con­ tinue всегда могут быть заменены структурированными оператора­ ми, хотя часто это оказывается неудобным. Опишите, как в общем случае вы могли бы удалить из цикла оператор break и заменить его каким-то структурированным эквиваленитом. (Подсказка. Опе­ ратор break осуществляет прерывание цикла в заданном месте его тела. Другим путем выхода из цикла является нарушение условия продолжения цикла. Рассмотрите использование в проверке условия продолжения цикла дополнительной проверки, устанавливающей, что «надо досрочно выйти из цикла, потому что выполнено условие его прерывания».) Используя такой прием, удалите оператор break из программы на рис. 2.26.

  3. Что делает следующий фрагмент программы?

for (i = 1; i <= 5; i++) { for (j = 1; j <= 3; j++} { for (k = 1; k <= 4; k++)

cout « ' *' ; cout « endl; } cout « endl;

2.62. Опишите, как в общем случае вы могли бы удалить из цикла опе­ратор continue и заменить его каким-то структурированным экви­валенитом. Используя этот прием, удалите оператор continue из про­граммы на рис. 2.27.

2.63.(Песня «Двенадцать днейрождества») Напишите программу, ис­пользующую повторение и структуры switch для печати текста песни «Двенадцать дней рождества». Одна структура switch долж­на использоваться для печати дня («Первый», «Второй» и т.д.). Другая структура switch должна использоваться для печати ос­тальной части каждого куплета (нашим читателям, возможно,