Главная страница

Сборник. Сборник упражнений


Скачать 1.68 Mb.
НазваниеСборник упражнений
Дата18.02.2023
Размер1.68 Mb.
Формат файлаpdf
Имя файлаСборник.pdf
ТипСборник
#942935
страница4 из 14
1   2   3   4   5   6   7   8   9   ...   14
Глава
3
Повторения
Как написать программу, в которой одна и та же операция должна выпол- няться несколько раз? Вы, конечно, можете скопировать фрагмент кода и вставить его в программу столько раз, сколько необходимо, но такое решение будет крайне далеким от идеала. Минусами подобного подхо- да является то, что вы сможете повторить необходимое действие строго определенное количество раз, а при отладке кода нужно будет вносить правки во все скопированные участки.
В Python для организации циклических действий предусмотрен необхо- димый арсенал инструкций. Циклы позволяют требуемое количество раз запустить один и тот же фрагмент кода во время выполнения программы.
При должном использовании циклические конструкции позволяют зна- чительно повысить эффективность программного кода при минимуме затрат на его разработку.
3.1. ц
иклы
while
Цикл while дает возможность выполнять набор инструкций сколь угодно долго – до тех пор, пока соответствующее условное выражение возвра- щает True. Как и if, выражение while обладает своим условием и телом, написанным с отступами. Если условное выражение инструкции while воз- вращает True, тело выполняется, после чего снова производится проверка условия. Если оно по-прежнему возвращает истину, тело выполняется вновь, и т. д. Таким образом, тело цикла будет выполняться до тех пор, пока условное выражение не вернет значение False. Как только это про- изошло, тело цикла будет пропущено, и выполнение программы возоб- новится с первой инструкции, следующей после тела while.
Часто в условных выражениях инструкции while выполняется сравне- ние введенного пользователем значения с содержимым другой перемен- ной, в результате чего у пользователя есть возможность ввести ожидае- мое значение для выхода из цикла. В этом случае условное выражение инструкции while должно вернуть значение False, после чего произойдет

Повторения

57
пропуск тела цикла и переход к следующей за ним инструкции. Например, в следующем фрагменте кода пользователь будет вводить числа и полу- чать сообщения о том, положительное или отрицательное число он ввел, до тех пор, пока не введет ноль, говорящий программе о необходимости покинуть цикл.
# Запрашиваем ввод у пользователя x = int(input("Введите целое число (0 для выхода): "))
# Запускаем цикл, пока пользователь не введет ноль while x != 0:
# Положительное или отрицательное?
if x > 0:
print("Это положительное число.")
else:
print("Это отрицательное число.")
# Запрашиваем очередное значение x = int(input("Введите целое число (0 для выхода): "))
Программа начинается с запроса у пользователя целого числа. Если он введет ноль, условное выражение x != 0 вернет False, и тело цикла будет просто проигнорировано, а программа завершит выполнение без всякого вывода, если не считать запроса на ввод числа. Если же условная конструк- ция вернет True, будет выполнено тело цикла.
В теле цикла while введенное пользователем значение сравнивается с нулем при помощи if, и на экран выводится соответствующий текст.
В конце тела цикла пользователь получает еще одну просьбу ввести чис- ло. Поскольку после этого тело цикла заканчивается, будет осуществлен возврат к условному выражению while с очередной проверкой ввода. Если на этот раз пользователь ввел ноль, программа будет завершена. В про- тивном случае мы снова войдем в тело цикла. Это будет продолжаться до тех пор, пока пользователь не введет ноль.
3.2. ц
иклы
for
Как и while, циклы for служат для повторного запуска одного и того же блока кода при выполнении определенных условий. При этом механизм проверки условий в цикле for значительно отличается.
Тело цикла for будет выполняться по разу для каждого элемента кол- лекции. При этом коллекция может представлять собой диапазон целых чисел, буквы в строке или, как мы увидим позже в этой книге, значения, сохраненные в виде специальных структур вроде списков. Синтаксис ин- струкции for представлен ниже, текст во вставках , и необходимо заменить на нужный.

58
Упражнения for in :

Тело цикла for, как и в случае с while, может состоять из одной или нескольких инструкций на языке Python, отделенных отступами, и вы- полняться множество раз.
Перед каждым запуском тела цикла очередной элемент из коллекции копируется в . Эта переменная создается для цикла for при его запуске. При этом совсем не обязательно создавать данную переменную при помощи оператора присваивания, а любое значение, которое могло быть записано в ней, будет удалено перед запуском каждой итерации.
Переменная может быть использована в теле цикла так же точно, как и любая другая переменная в языке Python.
Коллекция из целых чисел может быть создана при помощи удобной функции Python range. С единственным переданным аргументом она вер- нет диапазон значений, начинающийся с нуля и заканчивающийся пере- данным аргументом, не включая его самого. Например, функция range(4) сгенерирует диапазон из чисел 0, 1, 2 и 3.
При передаче двух аргументов функция range вернет диапазон, начина- ющийся с первого переданного аргумента и заканчивающийся вторым, не включая его. Так, вызов функции range(4, 7) даст на выходе диапазон из целых чисел 4, 5 и 6. Если первый аргумент будет больше или равен вто- рому, функция range вернет пустой диапазон. В этом случае тело цикла не будет выполнено ни разу, а программа продолжит выполняться с первой инструкции после тела цикла.
Функция range может также вызываться с третьим аргументом, отвеча- ющим за шаг итерации при перемещении от начального значения цикла к конечному. Если шаг будет больше нуля, мы получим диапазон, начи- нающийся со значения, соответствующего первому аргументу, в котором каждый последующий элемент будет отстоять от предыдущего на шаг, заданный третьим аргументом. Отрицательное значение шага позволяет сконструировать нисходящий диапазон значений. К примеру, если вызов функции range(0, –4) вернет пустой диапазон, то вариант с третьим аргу- ментом range(0, –4, –1) приведет к созданию диапазона, состоящего из чисел 0, -1, -2 и -3. Заметьте, что третий аргумент должен представлять собой целочисленное значение. При необходимости задать дробный шаг лучше будет использовать цикл while.
В следующем примере используется цикл for совместно с функцией range для вывода на экран всех значений, кратных трем, от нуля и до вве- денного пользователем числа, включая его.
# Запрашиваем у пользователя верхнюю границу limit = int(input("Введите целое число: "))
# Выводим все числа, кратные трем, вплоть до указанного пользователем значения

Повторения

59
print("Все числа, кратные трем, вплоть до", limit, ":")
for i in range(3, limit + 1, 3):
print(i)
При запуске программа попросит пользователя ввести целое число.
Предположим, он ввел число 11. После этого на экран будет выведено сообщение, описывающее будущий диапазон, и начнется выполнение цикла.
Диапазон, построенный функцией range, будет начинаться с трех и про- должаться до 11 + 1 = 12 с шагом 3. Таким образом, в него войдут числа 3, 6 и 9. При первом запуске цикла переменной i будет присвоено значение 3, которое будет выведено на экран в теле цикла. После этого переменная i последовательно получит значения 6 и 9 с выводом их на экран. Следом за девяткой цикл прекратит свою работу за неимением элементов, и вы- полнение программы продолжится со следующей за телом цикла строки.
В нашем случае таковой нет, а значит, программа просто завершит вы- полнение.
3.3. в
ложенные
циклы
Блок выражений в теле цикла может включать в себя другой цикл, кото- рый будет именоваться вложенным (nested). При этом в цикл могут быть вложены любые типы циклов. В следующем фрагменте кода цикл for вло- жен в тело цикла while для повторения фразы, введенной пользователем, определенное количество раз, пока им не будет введена пустая строка.
# Запрашиваем у пользователя сообщение message = input("Введите сообщение (оставьте его пустым для выхода): ")
# Начало цикла, пока сообщение не станет пустым while message != "":
# Запрашиваем количество повторений n = int(input("Сколько раз повторить сообщение? "))
# Показываем сообщение заданное количество раз for i in range(n):
print(message)
# Запрашиваем следующее сообщение message = input("Введите сообщение (оставьте его пустым для выхода): ")
Сначала программа запрашивает у пользователя сообщение для вывода на экран. Если сообщение будет непустым, запустится тело цикла while, в котором пользователю будет задан новый вопрос о том, сколько раз вы- вести на экран введенное им сообщение. После этого создается диапазон от нуля до введенного пользователем числа, не включая его, и тело цикла for выполняется столько раз, сколько чисел оказалось в диапазоне.

60
Упражнения
По окончании выполнения цикла for пользователю снова предлагается ввести сообщение, и программа переходит к началу внешнего цикла while, где вновь выполняется проверка того, что сообщение введено. Если это так, пользователь снова может ввести количество желаемых повторений своего сообщения, и так до момента, пока не оставит вопрос о вводе со- общения без ответа. После этого тело цикла while будет пропущено, и про- грамма завершит свое выполнение.
3.4. у
пражнения
Следующие упражнения должны быть выполнены при помощи циклов.
В некоторых из них будет указано, какой именно тип цикла необходимо использовать. В противном случае вы вольны сами выбирать тип приме- няемого цикла. Некоторые задачи могут быть решены как с применением цикла for, так и с использованием while. Есть в этом списке и упражнения на применение множественных циклов, которые должны быть вложены друг в друга. Тщательно выбирайте способ решения задачи в каждом от- дельном случае.
Упражнение 63. Среднее значение
(26 строк)
В данном упражнении вы должны написать программу для подсчета среднего значения всех введенных пользователем чисел. Индикатором окончания ввода будет служить ноль. При этом программа должна выда- вать соответствующее сообщение об ошибке, если первым же введенным пользователем значением будет ноль.
Подсказка. Поскольку ноль является индикатором окончания ввода, его не нужно учитывать при расчете среднего.
Упражнение 64. Таблица со скидками
(18 строк)
В магазине была объявлена скидка размером 60 % на ряд товаров, и для того чтобы покупатели лучше ориентировались, владелец торговой точки решил вывесить отдельную таблицу со скидками с указанием уцененных товаров и их оригинальных цен. Используйте цикл для создания подобной таблицы, в которой будут исходные цены, суммы скидок и новые цены для покупок на сумму $4,95, $9,95, $14,95, $19,95 и $24,95. Убедитесь в том, что суммы скидки и новые цены отображаются с двумя знаками после запятой.

Повторения

61
Упражнение 65. Таблица соотношения температур
(22 строки)
Напишите программу для вывода таблицы соотношения температур, вы- раженных в градусах Цельсия и Фаренгейта. В таблице должны разме- щаться все температуры между 0 и 100 градусами Цельсия, кратные 10.
Дополните таблицу подходящими заголовками. Формулу для перевода температуры из градусов Цельсия в градусы Фаренгейта можно легко найти на просторах интернета.
Упражнение 66. Никаких центов
(Решено. 39 строк)
4 февраля 2013 года Королевским канадским монетным двором была вы- пущена последняя монета номиналом в один цент. После вывода центов из обращения все магазины вынуждены были изменить цены на товары таким образом, чтобы они стали кратны пяти центам (расчеты по бан- ковским картам по-прежнему ведутся с учетом центов). И хотя продавцы вольны сами определять политику преобразования цен, большинство из них просто округлили цены до ближайших пяти центов.
Напишите программу, запрашивающую у пользователя цены, пока не будет введена пустая строка. На первой строке выведите сумму всех вве- денных пользователем сумм, а на второй – сумму, которую покупатель должен заплатить наличными. Эта сумма должна быть округлена до бли- жайших пяти центов. Вычислить сумму для оплаты наличными можно, получив остаток от деления общей суммы в центах на 5. Если он будет меньше 2,5, следует округлить сумму вниз, а если больше – вверх.
Упражнение 67. Найти периметр многоугольника
(Решено. 42 строки)
Напишите программу для расчета периметра заданного многоугольника.
Начните с запроса у пользователя координат x и y первой точки много- угольника. Продолжайте запрашивать координаты следующих точек фи- гуры, пока пользователь не оставит строку ввода координаты по оси x пустой. После ввода каждой пары значений вы должны вычислить длину очередной стороны многоугольника и прибавить полученное значение к будущему ответу. По окончании ввода необходимо вычислить расстоя- ние от последней введенной точки до первой, чтобы замкнуть фигуру, и вывести итоговый результат. Пример ввода координат точек много- угольника и вывода периметра показан ниже. Введенные пользователем значения выделены жирным.
Введите первую координату X: 0
Введите первую координату Y: 0

62
Упражнения
Введите следующую координату X (Enter для окончания ввода): 1
Введите следующую координату Y: 0
Введите следующую координату X (Enter для окончания ввода): 0
Введите следующую координату Y: 1
Введите следующую координату X (Enter для окончания ввода):
Периметр многоугольника равен 3.414213562373095
Упражнение 68. Средняя оценка
(62 строки)
В задаче 52 мы уже создавали таблицу соответствий между оценками в буквенном и числовом выражении. Сейчас вам нужно будет рассчитать среднюю оценку по произвольному количеству введенных пользователем буквенных оценок. Для окончания ввода можно использовать индикатор в виде пустой строки. Например, если пользователь последовательно вве- дет оценки A, затем C+, а после этого B и пустую строку, средний результат должен составить 3,1.
Для расчетов вам может пригодиться математика из упражнения 52.
Никаких проверок на ошибки проводить не нужно. Предположим, что пользователь может вводить только корректные оценки или ноль.
Упражнение 69. Билеты в зоопарк
(Решено. 38 строк)
В зоопарке цена входного билета зависит от возраста посетителя. Дети до двух лет допускаются бесплатно. Дети в возрасте от трех до 12 лет могут посещать зоопарк за $14,00. Пенсионерам старше 65 лет вход обойдется в $18,00, а обычный взрослый билет стоит $23,00.
Напишите программу, которая будет запрашивать возраст всех посети- телей в группе (по одному за раз) и выводить общую цену билетов для по- сещения зоопарка этой группой. В качестве индикатора окончания ввода можно по традиции использовать пустую строку. Общую цену билетов стоит выводить в формате с двумя знаками после запятой.
Упражнение 70. Биты четности
(Решено. 27 строк)
Определение бита четности – это простой механизм выявления ошибок при передаче данных в условиях низкой надежности соединения, напри- мер по телефонной линии. Идея заключается в том, что после переда- чи каждых восьми бит следом отправляется бит четности, позволяющий определить наличие ошибки при передаче одного бита из восьми.
При этом можно использовать как контроль четности, так и контроль нечетности. В первом случае бит четности, посылаемый следом за груп-

Повторения

63
пой из восьми бит данных, выбирается таким образом, чтобы общее ко- личество переданных единичек в числе восьми бит данных и провероч- ного бита было четным. Во втором случае их количество должно быть нечетным.
Напишите программу, вычисляющую значение бита четности для групп из восьми бит, введенных пользователем, с использованием контроля четности. Пользователь может вводить комбинации из восьми бит беско- нечное количество раз, а индикатором окончания ввода пусть снова будет пустая строка. После каждой введенной группы из восьми бит программа должна выводить на экран сообщение о том, чему должен равняться бит четности: 0 или 1. Также осуществляйте контроль ввода и выводите соот- ветствующее сообщение об ошибке, если пользователь ввел последова- тельность, отличную от восьми бит.
Подсказка. Пользователь должен вводить последовательность в виде строки. После ввода вы можете определить количество нулей и единиц во введенной последо- вательности при помощи метода count. Информацию о работе этого метода можно найти в онлайне.
Упражнение 71. Приблизительное число
π
(23 строки)
Приблизительное значение числа π можно вычислить по следующей бес- конечной формуле:
Напишите программу, выводящую на экран 15 приближений числа π.
В первом приближении должно быть использовано только первое слага- емое приведенного бесконечного ряда. Каждое очередное приближение должно учитывать следующее слагаемое, тем самым увеличивая точность расчета.
Упражнение 72. Игра Fizz-Buzz
(17 строк)
Fizz-Buzz – это известная игра, помогающая детям освоить в игровой форме правила деления. Участники садятся в круг, чтобы игра теорети- чески могла продолжаться бесконечно. Первый игрок говорит «Один» и передает ход тому, кто слева. Каждый следующий игрок должен мыс- ленно прибавить к предыдущему числу единицу и произнести либо его, либо одно из ключевых слов: Fizz, если число без остатка делится на три,

64
Упражнения или Buzz, если на пять. Если соблюдаются оба этих условия, он произносит
Fizz-Buzz. Игрок, не сумевший сказать правильное слово, выбывает из игры. Последний оставшийся игрок признается победителем.
Разработайте программу, реализующую алгоритм игры Fizz-Buzz при- менительно к первым 100 числам. Каждый следующий ответ должен отобра жаться на новой строке.
Упражнение 73. Код Цезаря
(Решено. 35 строк)
Одним из первых в истории примеров шифрования считаются закодиро- ванные послания Юлия Цезаря. Римскому полководцу необходимо было посылать письменные приказы своим генералам, но он не желал, чтобы в случае чего их прочитали недруги. В результате он стал шифровать свои послания довольно простым методом, который впоследствии стали на- зывать кодом Цезаря.
Идея шифрования была совершенно тривиальной и заключалась в цик- лическом сдвиге букв на три позиции. В итоге буква A превращалась в D,
B – в E, C – в F и т. д. Последние три буквы алфавита переносились на на- чало. Таким образом, буква X становилась A, Y – B, а Z – C. Цифры и другие символы не подвергались шифрованию.
Напишите программу, реализующую код Цезаря. Позвольте пользова- телю ввести фразу и количество символов для сдвига, после чего выведите результирующее сообщение. Убедитесь в том, что ваша программа шиф- рует как строчные, так и прописные буквы. Также должна быть возмож- ность указывать отрицательный сдвиг, чтобы можно было использовать вашу программу для расшифровки фраз.
Упражнение 74. Квадратный корень
(14 строк)
Напишите программу, реализующую метод Ньютона для нахождения квад ратного корня числа x, введенного пользователем. Алгоритм реали- зации метода Ньютона следующий:
Запрашиваем число x у пользователя
Присваиваем переменной guess значение x / 2
Пока значение переменной guess не будет обладать должной точностью
Присваиваем переменной guess результат вычисления среднего между guess и x / guess
По завершении алгоритма в переменной guess будет находиться опре- деленное приближение вычисления квадратного корня из x. Качество ап- проксимации при этом будет зависеть только от вашего желания. В нашем случае расхождение между значениями guess * guess и x должно составлять не более 10
–12

Повторения

65
Упражнение 75. Палиндром или нет?
(Решено. 26 строк)
Строка называется палиндромом, если она пишется одинаково в обоих направлениях. Например, палиндромами в английском языке являются слова «anna», «civic», «level», «hannah». Напишите программу, запраши- вающую у пользователя строку и при помощи цикла определяющую, яв- ляется ли она палиндромом.
Примечание. Яибофобия (Aibohphobia) – это безрассудный страх палиндромов. Эти слова в русском и английском сами по себе являются палиндромами, что и привело к их образованию. Напротив, яилифилия (ailihphilia) характеризуется любовью к па- линдромам. Объяснять образование этого слова нет нужды.
Упражнение 76. Многословные палиндромы
(35 строк)
Помимо слов, существуют целые фразы, являющиеся палиндромами, если не обращать внимания на пробелы. Вот лишь несколько примеров на анг- лийском: «go dog», «flee to me remote elf» and «some men interpret nine memos». Русские варианты есть следующие: «А кобыле цена дана, да не целы бока», «А Луна канула» и другие. Расширьте свое решение упражне- ния под номером 75, чтобы при вынесении решения о том, является ли строка палиндромом, игнорировались пробелы. Также можете поработать над тем, чтобы игнорировались знаки препинания, а заглавные и пропис- ные буквы считались эквивалентными.
Упражнение 77. Таблица умножения
(Решено. 18 строк)
В данном упражнении вы создадите программу для отображения стан- дартной таблицы умножения от единицы до десяти. При этом ваша таб- лица умножения должна иметь заголовки над первой строкой и слева от первого столбца, как показано в представленном примере. Предполагае- мый вывод таблицы умножения показан ниже.
1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14 16 18 20 3 3 6 9 12 15 18 21 24 27 30 4 4 8 12 16 20 24 28 32 36 40 5 5 10 15 20 25 30 35 40 45 50 6 6 12 18 24 30 36 42 48 54 60 7 7 14 21 28 35 42 49 56 63 70

66
Упражнения
8 8 16 24 32 40 48 56 64 72 80 9 9 18 27 36 45 54 63 72 81 90 10 10 20 30 40 50 60 70 80 90 100
Возможно, для выполнения этого упражнения вам придется озаботить- ся тем, чтобы выводить значения на экран без принудительного перевода каретки на строку ниже. Этого можно добиться, если последним аргу- ментом функции print передать end="". Например, инструкция print("A") выведет на экран букву A, после чего автоматически перейдет на новую строку, тогда как print("A", end="") не станет переводить каретку, что позволит произвести следующий вывод в той же строке.
Упражнение 78. Гипотеза Коллатца
(Решено. 18 строк)
Представьте себе последовательность целых чисел, организованную сле- дующим образом.
Начинаться последовательность должна с любого положительного числа
Пока последний элемент последовательности не равен единице, выполнять
Если последний элемент последовательности четный, тогда
Добавить новый элемент к последовательности путем деления последнего элемента на два с округлением вниз
Иначе
Добавить новый элемент к последовательности путем умножения последнего элемента на три с добавлением единицы.
Гипотеза Коллатца утверждает, что подобная последовательность при условии того, что начинается с положительного числа, рано или поздно завершится единицей. И хотя это так и не было доказано, все указывает на то, что это так и есть.
Напишите программу, которая будет запрашивать у пользователя целое число и выводить все числа, начиная с введенного числа и заканчивая единицей. После этого пользователь должен иметь возможность ввести другое число и снова получить ряд чисел, называемый сиракузской по- следовательностью. Условием выхода из программы должен быть ввод пользователем нуля или отрицательного числа.
Примечание. Гипотеза Коллатца по сей день остается одной из нерешенных проб- лем математики. Многие пытались представить доказательство, но никто не добился успеха.

Повторения

67
Упражнение 79. Наибольший общий делитель
(Решено. 17 строк)
Наибольший общий делитель двух положительных чисел представляет собой наибольшее число, на которое без остатка делятся оба числа. Су- ществует несколько алгоритмов, позволяющих определить наибольший общий делитель двух чисел, включая следующий.
Инициализируйте переменную d меньшим из чисел n и m
Пока n или m не делятся на d без остатка, выполнять
Уменьшить d на единицу
Выведите на экран d, это и есть наибольший общий делитель для n и m
Напишите программу, запрашивающую у пользователя два положи- тельных целых числа и выводящую для них наибольший общий делитель.
Упражнение 80. Простые множители
(27 строк)
Разложение целого числа n на простые множители может быть проведено по следующему алгоритму.
Инициализируйте переменную factor значением 2
Пока значение factor меньше или равно n, выполнять
Если n без остатка делится на factor, тогда
Сохранить factor как простой множитель числа n
Разделить n на factor с округлением вниз
Иначе
Увеличить factor на единицу
Напишите программу, которая будет запрашивать целое число у поль- зователя. Если пользователь введет значение, меньшее двух, необходимо вывести соответствующее сообщение об ошибке. Иначе нужно перечис- лить в столбец список простых множителей заданного числа, которые при перемножении дали бы исходное число. Например:
Введите целое число (2 или больше): 72
Простые множители числа 72:
2 2
2 3
3

68
Упражнения
Упражнение 81. Двоичное число в десятичное
(18 строк)
Напишите программу, которая будет преобразовывать двоичные зна- чения (по основанию 2) в десятичные (по основанию 10). Пользователь должен ввести число в двоичном виде как строку, а программа – преоб- разовать его посимвольно в десятичный вид и вывести на экран с соот- ветствующим сообщением.
Упражнение 82. Десятичное число в двоичное
(Решено. 27 строк)
Напишите программу, которая будет преобразовывать десятичные зна- чения (по основанию 10) в двоичные (по основанию 2). Запросите целое число у пользователя и, следуя алгоритму, приведенному ниже, преоб- разуйте его в двоичную запись. По завершении выполнения программы в переменной result должно оказаться двоичное представление исходного числа. Выведите результат на экран с соответствующим сообщением.
Инициализируйте переменную result пустой строкой
Пусть в переменной q хранится число, которое нужно преобразовать
Повторять
Переменной r присвоить остаток от деления q на 2
Преобразовать r в строку и добавить ее в начало переменной result
Разделить q на 2 с отбрасыванием остатка и присвоить полученное значение переменной q
Пока q не станет равно нулю
Упражнение 83. Максимальное число
в последовательности
(Решено. 34 строки)
Это упражнение преследует цель идентификации количества смен макси- мального значения в коллекции случайных чисел. Ряд должен быть запол- нен числами от 1 до 100. При этом последовательность может содержать дубликаты, а некоторых чисел из диапазона от 1 до 100 в ней может не быть.
Сделайте паузу и подумайте с листочком в руках, как вы решили бы эту задачу. Многие стали бы сравнивать каждое очередное выпавшее число с текущим максимумом в последовательности и при необходимости об- новлять максимум. Это вполне подходящий способ, который приведет к правильному результату при соблюдении алгоритма. А как вы думаете, сколько раз обновится максимум на протяжении генерирования всей по- следовательности?
На этот вопрос можно ответить при помощи теории вероятностей, но мы попробуем провести необходимые симуляции. Для начала в вашей

Повторения

69
программе должно выбираться случайное число из диапазона от 1 до 100.
Сразу сохраните это значение как максимальное. Далее сгенерируйте еще
99 случайных чисел в том же диапазоне. Для каждого значения выполняй- те ту же проверку и при необходимости обновляйте максимум, попутно увеличивая переменную, хранящую количество «смен лидера», на едини- цу. Выводите каждое сгенерированное число на новой строке, добавляя примечание в случае, если на этом шаге обновлялся максимум.
После вывода всех значений на экран вы должны также оповестить пользователя о максимальном числе в ряду и количестве его обновлений.
Частичный вывод программы приведен ниже. Запустите свою программу несколько раз. Оправдались ли ваши ожидания относительно количества смен максимального значения?
30 74 <== Обновление
58 17 40 37 13 34 46 52 80 <== Обновление
37 97 <== Обновление
45 55 73

Максимальное значение в ряду: 100
Количество смен максимального значения: 5
Упражнение 84. Подбрасываем монетку
(47 строк)
Какое минимальное количество раз вы должны подбросить монетку, что- бы три раза подряд выпал либо орел, либо решка? А какое максимальное количество попыток может для этого понадобиться? А в среднем? В дан- ном упражнении мы выясним это, создав симулятор подбрасывания вир- туальной монетки.
Напишите программу, использующую для подброса монетки генера- тор случайных чисел Python. Монетка при этом должна быть правильной формы, что означает равную вероятность выпадения орла и решки. Под- брасывать монетку необходимо до тех пор, пока три раза подряд не вы-

70
Упражнения падет одно значение, вне зависимости от того, орел это будет или решка.
Выводите на экран букву О всякий раз, когда выпадает орел, и Р – когда выпадает решка. При этом для одной симуляции бросков все выпавшие значения необходимо размещать на одной строке. Также необходимо из- вестить пользователя о том, сколько попыток потребовалось, чтобы полу- чить нужный результат.
Программа должна выполнить десять симуляций и в конце представить среднее количество подбрасываний монетки, требуемое для достижения нужного нам результата. Пример вывода программы показан ниже:
О Р Р Р (попыток: 4)
О О Р Р О Р О Р Р О О Р О Р Р О Р Р Р (попыток: 19)
Р Р Р (попыток: 3)
Р О О О (попыток: 4)
О О О (попыток: 3)
Р О Р Р О Р О О Р Р О О Р О Р О О О (попыток: 18)
О Р Р О О О (попыток: 6)
Р О Р Р Р (попыток: 5)
Р Р О Р Р О Р О Р О О О (попыток: 12)
Р О Р Р Р (попыток: 5)
Среднее количество попыток: 7,9.

1   2   3   4   5   6   7   8   9   ...   14


написать администратору сайта