Поляков Python C++ 01
Поляков Python C++ 01
Поляков
ПРОГРАММИРОВАНИЕ
Python
Часть 1
©ИЗДАТЕЛЬСТВО
К. Ю. Поляков. Программирование. Python. C++. Часть 1
К. Ю. Поляков. Программирование. Python. C++. Часть 2
К. Ю. Поляков. Программирование. Python. C++. Часть 3
К. Ю. Поляков. Программирование. Python. C++. Часть 4
ISBN 978-5-9963-4134-4
9 785996 341344
К. Ю. Поляков
ПРОГРАММИРОВАНИЕ
Python
Часть 1
Учебное пособие
для общеобразовательных
организаций
Москва
БИНОМ. Лаборатория знаний
■*4* 2019
УДК 004.9
ББК 32.97
П54
Поляков К. Ю.
П54 Программирование. Python. C++. Часть 1: учебное
пособие/ К. Ю. Поляков. — М. : БИНОМ. Лаборатория
знаний,2019. — 144 с. : ил.
ISBN 978-5-9963-4134-4
Книга представляет собой первую часть серии учебный пособий по
программированию. В отличие от большинства аналогичных изданий,
в ней представлены два языка программирования высокого уровня —
Python и C++.
В пособии рассматриваются основы программирования на выбран
ных языках: ввод и вывод данных, обработка целых и вещественных
чисел, управляющие конструкции. Объяснение нового материала стро
ится на примерах его практического применения. Изучаются приёмы
разработки программ, использующих компьютерную графику и ани
мацию.
После каждого параграфа приводится большое число заданий для
самостоятельного выполнения разной сложности и вариантов проек
тных работ.
Пособие предназначено для школьников, начинающих изучать
программирование.
УДК 004.9
ББК 32.97
Учебное издание
Поляков Константин Юрьевич
ПРОГРАММИРОВАНИЕ
Python. C++
Часть 1
Учебное пособие
(12+)
Ведущий редактор О. А. Полежаева
Концепция внешнего оформления В. А. Андрианов
Художественный редактор Н. А. Новак
Технический редактор Е. В. Денюкова
Корректор Е. Н. Клишина
Компьютерная верстка: В. А. Носенко
3
Предисловие
4
Глава 1
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ PYTHON
§1
Первые программы
Ключевые слова:
• программа • ввод данных
• транслятор • символьная строка
• линейная программа
5
Программирование на языке Python
6
Первые программы §1 '
7
1 Программирование на языке Python
Это значит, что после вывода всех данных функция print выполняет
переход на новую строку — следующий вызов print будет выводить
данные в новой строке.
Если нужно, чтобы несколько вызовов функции print выводили
информацию в одной строке, можно отменить переход на новую стро
ку, указав аргумент с именем end (по-английски end — конец), рав
ный пустой строке
print( "1", end="" )
print( "23", end="" )
print( "456" )
Такая программа выведет:
123456
Выводы
• Пустая программа на языке Python не содержит ни одной
команды.
• Комментарии — это пояснения для человека внутри текста про
граммы. Транслятор их не обрабатывает.
• Символьная строка — это последовательность символов, заключён
ная в кавычки или апострофы.
• Для вывода данных на экран используют функцию print.
• Элементы списка вывода разделяются запятыми.
• При выводе данные разделяются пробелами. Если это не требует
ся, нужно добавить именованный аргумент sep=' '.
• По умолчанию после вывода всех данных функция print перево
дит курсор в начало следующей строки. Если это не требуется,
нужно добавить именованный аргумент end=' '.
Вопросы и задания
1. Зачем пишут комментарии в программах? Подумайте, как коммен
тирование можно использовать при поиске ошибок в программе.
2. Найдите и исправьте ошибки в программе:
print( "Акция "Доброе дело"." )
3. Найдите и исправьте ошибки в программе:
print( "Привет,", Вася! )
4. Заполните пропуски так, чтобы программа вывела на экран слово
Python:
print( "Ру", ... )
print( "on" )
8
Диалоговые программы
§2
Диалоговые программы
Ключевые слова'.
• диалоговая программа • переменная
• ввод данных • идентификатор
• список вывода • оператор присваивания
В этом параграфе мы познакомимся с диалоговыми программами. Они
выполняют какие-то действия в диалоге с пользователем, который при
каждом запуске программы может вводить новые исходные данные
и получать новые результаты, зависящие от того, что он ввёл. Ввод
данных позволяет нам управлять программой, изменяя результаты её
работы.
Как тебя зовут?
Напишем программу, которая спрашивает пользователя, как его зовут,
и затем приветствует его. Вот диалог, который мы хотим получить в
результате:
Как тебя зовут? Василина
Привет, Василина!
9
Программирование на языке Python
Переменные
10
Диалоговые программы
name Платон
Сократ
Рис. 1.1
Теперь та область памяти, в которой было записано старое значе
ние ("Платон"), уже недоступна, потому что с ней не связано ни одно
имя. Эта память будет освобождена сборщиком мусора — специальной
программой, которая управляет памятью. Поэтому в языке Python не
возможно, например, сразу изменить один символ внутри символьной
строки (но можно создать новую, изменённую строку).
Заметим, что в большинстве языков программирования (Паскаль,
C++, Java) работа с переменными организована иначе: переменные за
ранее объявляются, и им сразу выделяется место в памяти. После объ
явления вся работа с переменной происходит в одной и той же облас
ти памяти.
11
1 Программирование на языке Python
В языке Python каждая переменная имеет свой тип. Тип нужен для
того, чтобы определить:
• какие значения может принимать переменная;
• какие операции можно выполнять с этой переменной;
• как хранить значения переменной в памяти.
Определить тип переменной можно с помощью встроенной функции
type:
lang = "Котлин"
print ( type(lang) )
cost = 123
print ( type(cost) )
dist = 45.678
print ( type(dist) )
Запустив эту программу, мы увидим:
<class ’str’>
Cclass 'int'>
<class 'float'>
Это означает, что переменные lang, cost и dist относятся соответ
ственно к типам (классам):
str — символьная строка (от англ, string — строка),
int — целое число (от англ, integer — целый),
float — вещественное число (от англ, float — с плавающей запятой).
Транслятор Python сам определяет тип переменной по тому значе
нию, которое ей присваивается.
Сумма чисел
Теперь научим компьютер складывать два целых числа. Можно,
например, сложить два заранее известных числа:
print ( 12345 + 67890 )
Иногда удобно сначала записать эти числа в переменные:
numl = 12345
num2 = 67890
print( numl + num2 )
Недостаток этой программы состоит в том, что она складывает только
два заранее известных числа. Если нужно сложить другие числа, при
дётся менять программу. Чтобы можно было менять исходные данные,
не изменяя программу, их вводят с клавиатуры, из файла, с какого-то
устройства или через компьютерную сеть.
Напишем программу, которая:
1) запрашивает у пользователя два целых числа;
2) складывает их и сохраняет результат в памяти;
3) выводит результат на экран.
12
Диалоговые программы §2
13
1 Программирование на языке Python
14
Диалоговые программы §2
Выводы
• Диалоговая программа — это программа, которая обменивается
данными с пользователем.
• Чтобы сохранить данные в памяти, используют переменные.
• Переменная — это величина, которая имеет имя, тип и значение.
Значение переменной может изменяться во время выполнения
программы.
• Идентификатор — это имя переменной.
• Каждая переменная относится к некоторому типу данных. Тип пе
ременной в Python определяется автоматически во время присваи
вания ей значения.
• Оператор — это команда языка программирования.
• При записи нового значения в переменную оно размещается в но
вой области памяти, а «старое» значение удаляется сборщиком
мусора.
• Функция input вводит с клавиатуры символьную строку. Для пре
образования строки в целое число её обрабатывают функцией int.
Вопросы и задания
1. Какие имена переменных недопустимы в языке Python?
а) 1 и) СУ-27
б) mil к) СУ_27
в) 1m л) _2 7
г) m 1 м) СУ(27)
д) Vasya н) @mail_ru
е) Петя о) lenta.ru
ж) Митин брат п) "Pes barbos"
з) Quo vadis р) <Ладья>
2. Какую роль играет запись sep="" при вызове этой функции?
print( "Привет, "name, "!", sep="" )
3. Чем различаются результаты работы программ а и б?
a) print( "Как тебя зовут? " )
name = input ()
б) name = input ( "Как тебя зовут? " )
15
1 Программирование на языке Python
§3
Компьютерная графика
Ключевые слова:
• графический режим • оси координат
• холст • модуль
• пиксель • импорт модуля
• координаты
16
Компьютерная графика §3
Графика в Python
Программы, с которыми мы работали в предыдущих параграфах, вы
водили текст в консольное окно, где невозможно рисовать. Если требу
ется написать программу с графическими возможностями, обычно ис
пользуют библиотеки, которые скрывают от программиста сложности
взаимодействия с операционной системой.
Библиотека — это набор готовых функций (команд), расширяющих
возможности языка программирования. Одна из библиотек, позволяю
щих работать с графикой, — tkinter — устанавливается вместе с ин
терпретатором языка Python.
Библиотека graph, с которой мы будем работать, использует воз
можности tkinter. Такая библиотека называется «обёрткой» (англ.
wrapper) для библиотеки tkinter; её задача — упростить работу с
tkinter для начинающих. С помощью библиотеки graph мы будем
строить простые изображения и анимацию в отдельном окне.
Библиотека graph состоит из одного файла graph.ру1’. Такой файл,
содержащий функции, в Python называется модулем. Функции, входя
щие в модуль, можно вызывать из своей программы.
Простейшая графическая программа состоит всего из двух строк:
from graph import *
run ( )
Первая строка переводится с английского как «из graph импорти
ровать *». Импортировать — значит подключить к программе, знак
* означает «все функции». Таким образом, первая строка программы
подключает к нашей программе все возможности модуля graph — гра
фической библиотеки.
Вторая строка — run () — запускает рисование и открывает графи
ческое окно. Это вызов функции run из модуля graph. Такая коман
да должна всегда завершать программу, использующую модуль graph
для работы с графикой. Для сокращения записи в тексте пособия мы
не будем добавлять эту команду в конец каждой программы, помня о
том, что она должна обязательно там быть.
При запуске этой программы откроется пустое окно с белым фоном.
На нём можно рисовать, управляя каждым пикселем. Этим мы и зай
мёмся.
Система координат
Поле для рисования в графических программах называется холстом
(англ, canvas). Размер холста совпадает с размером графического окна.
Если рисовать что-то за пределами холста, эта часть рисунка будет
потеряна.
17
1 Программирование на языке Python
Управляем пикселями
Пиксель — это наименьший элемент рисунка, которым мы можем
управлять (менять его цвет) независимо от других элементов. Чтобы
выкрасить пиксель, например, в синий цвет, нужно сначала устано
вить цвет пера:
penColor ( "blue" )
Название этой функции составлено из английских слов реп (перо) и
color (цвет). Цвет здесь передаётся функции как символьная строка с
названием цвета ("blue"). Так можно задать все цвета, имеющие име
на в библиотеке tkinter, например: white, black, gray, navy, blue,
cyan, green, yellow, red, orange, brown, maroon, violet, purple.
Кроме того, любой цвет можно определить кодом в модели RGB
(Red, — красный, Green — зелёный, Blue — синий). Яркость каждой
составляющей — это целое число в диапазоне от 0 до 255, например,
синий цвет пера можно установить так:
penColor( 0, 0, 255 )
18
Компьютерная графика §3
Рисуем линии
Линии на холсте состоят из пикселей. Легче всего нарисовать гори
зонтальную или вертикальную линию. Например, линию (точнее — от
резок) из точки (10, 20) в точку (15, 20) можно построить из шести
пикселей:
point( 10, 20 )
point ( 11, 20 )
point( 12, 20 )
point( 13, 20 )
point ( 14, 20 )
point( 15, 20 )
Нарисуем наклонную линию. Она, как и весь холст, тоже состоит
из пикселей. Например, линия из точки (10, 20) в точку (15, 25) —
диагональная, так что при увеличении х-координаты на 1 также уве
личивается и 1/-координата:
point( 10, 20 )
point ( 11, 21 )
point ( 12, 22 )
point( 13, 23 )
point ( 14, 24 )
point ( 15, 25 )
А как нарисовать линию из точки (10, 20), скажем, в точку
(15, 28)? Вычислить координаты нужных пикселей во многих случа
ях непросто. Для этой цели американский учёный Дж. Э. Брезенхэм в
1962 году придумал алгоритм, который используется в функции line
из модуля graph. Нам достаточно просто вызвать эту функцию:
line ( 10, 20, 15, 28 )
Функции передаются четыре аргумента: сначала координаты первого
конца отрезка, затем — координаты второго конца. Линия будет иметь
тот цвет, который был установлен до этого командой penColor.
Толщину линии можно при желании изменить командой penSize
(от англ, size — размер):
penSize( 5 )
19
1 Программирование на языке Python
Прямоугольники
Теперь нарисуем прямоугольник, координаты углов которого показаны
на рис. 1.3.
(10, 20) 60, 20)
20
Компьютерная графика §3
Окружность
Нарисовать окружность можно с помощью команды circle
(по-английски — окружность):
penColor( "red" )
brushColor( "green" )
circle( 200, 150, 50 )
Первые два аргумента, переданные функции circle, — это коорди
наты её центра (сначала — х, потом — у), а третий аргумент — ради
ус окружности. Будет построена окружность красного цвета (это цвет
пера), а внутренняя часть круга будет залита зелёным цветом (это цвет
кисти).
Для вычисления координат пикселей, из которых строится окруж
ность, используется один из вариантов алгоритма Брезенхэма.
Изменение координат
Теперь напишем программу, которая вводит с клавиатуры координаты
х и у и рисует квадрат на холсте в точке с заданными координатами.
Здесь нужно разобраться в том, что считать координатами квадрата.
Обычно выбирают некоторую базовую (или опорную) точку и догова
риваются, что координаты фигуры — это и есть координаты её опор
ной точки.
Для квадрата базовой точкой обычно считают его левый верхний
угол. Обозначим его координаты через (х, у). Пусть сторона квадра
та равна а. Тогда, учитывая, что х-координата увеличивается впра
во, а 1/-координата — вниз, вычисляем координаты остальных углов
(рис. 1.4).
Программа рисования квадрата с заданными координатами выглядит
так:
print ( "Введите координаты квадрата" )
х = int( input("х = ") )
у = int( input("у = ") )
а = 20
rectangle ( х, у, х+а, у+а )
21
1 Программирование на языке Python
(х, у) (х + а, у)
(х, у + а) (х + а, у + а)
Рис. 1.4
Для рисования использована команда rectangle из модуля graph.
Вообще-то она рисует прямоугольники, но её можно использовать и
для квадрата, ведь квадрат — это частный случай прямоугольника.
Команде rectangle передаются координаты левого верхнего и правого
нижнего углов, которые мы определили ранее (см. рис. 1.4).
Выводы
• Холст — это область для рисования, которая хранится в памяти
как растровый рисунок.
• Из программы можно управлять каждым пикселем холста —
менять его цвет независимо от цветов других пикселей.
• Графический примитив — это геометрическая фигура, которая
добавляется на рисунок с помощью одной команды.
• Основные графические примитивы — пиксель, линия (отрезок),
прямоугольник, ломаная, окружность.
• Модуль — это файл на языке Python, содержащий функции. Для
того чтобы использовать эти функции в своей программе, модуль
нужно импортировать (подключить) командой import.
• Цвет контура фигур устанавливается с помощью команды
penColor.
• Замкнутые контуры (прямоугольник, окружность, ломаная) зали
ваются тем цветом, который установлен как цвет заливки коман
дой brushColor.
Вопросы и задания
1. Как вы думаете, почему в списке команд модуля graph нет коман
ды «треугольник»?
2. Проверьте, что произойдёт, если рисовать за пределами холста.
3. Определите координаты пикселей, из которых состоят отрезки:
а) (10,20) — (10, 15) в) (10,20) — (15,21)
б) (10,20) — (5, 15) г) (10,20) — (15,22)
4. Выясните, что будет, если при рисовании прямоугольника задать ко
ординаты другой пары противоположных углов: правого верхнего и
левого нижнего.
22
Компьютерная графика §3
Интересные сайты
kpolyakov.spb.ru/school/probook/python.htm — модуль graph для соз
дания простых графических программ на языке Python
wiki.python.org/moin/TkInter — стандартная графическая библиотека
языка Python (на английском языке)
www.riverbankcomputing.com/software/pyqt — библиотека PyQt для
создания графических приложений на языке Python в разных
операционных системах
23
1 Программирование на языке Python
§4
Процедуры
Ключевые слова'.
• подпрограмма • аргументы
• процедура • параметры
• рефакторинг
brushColor( "brown" )
polygon( [(90,100), (150,50),
(210,100), (90,100)] )
penColor( "white" )
penSize( 3 )
brushColor( "black" )
rectangle( 120, 120, 150, 170 )
line( 120, 140, 150, 140 )
line( 135, 140, 150, 170 )
Пустыми строками отделены друг от друга блоки программы, каж
дый из которых выполняет свою работу: первый рисует основную
часть домика, второй — крышу, третий — окно. Запустив эту про
грамму, мы обнаружим, что окно нарисовано неправильно. Как найти
ошибку? Понятно, что нужно как-то определить блок рисования окна,
но где он? Чтобы облегчить решение этой задачи, в программе пишут
комментарии:
# основная часть домика
penColor( "black" )
brushColor( "green" )
rectangle( 100, 100, 200, 200 )
# крыша
brushColor( "brown" )
polygon( [ (90,100), (150,50),
(210,100), (90,100)] )
# окно
penColor( "white" )
Здесь и далее для сокращения записи мы не будем каждый раз писать команду
импорта модуля graph и команду run в конце программы.
24
Процедуры §4
penSize ( 3 )
brushColor ( "black" )
rectangle ( 120, 120, 150, 170 )
line ( 120, 140, 150, 140 )
line ( 135, 140, 150, 170 )
Но есть и другой приём: оформить блоки рисования каждой части
домика как отдельные вспомогательные алгоритмы {подпрограммы,
или процедуры) и дать им имена, например: frame (по-английски —
сруб, основная часть дома), roof (крыша) и window (окно). Получается
такая программа:
def frame():
penColor ( "black" )
brushColor( "green" )
rectangle( 100, 100, 200, 200 )
def roof():
penColor ( "black" )
brushColor ( "brown" )
polygon( [(90,100), (150,50),
(210,100), (90,100)] )
frame()
roof ()
window()
Сначала посмотрим на последние три строки — это и есть основная
программа. Сразу видно, что она состоит из трёх команд — вызовов
процедур. Раньше мы использовали команды из встроенной библиоте
ки языка Python или модуля graph, а теперь создали такие команды
сами.
Действия, которые компьютер выполняет при вызове этих проце
дур, определены выше с помощью служебных слов def (от английско
го define — определить). После слова def записывают имя новой про
цедуры, круглые скобки (позже мы узнаем, что можно записывать в
этих скобках) и двоеточие. Все команды, которые входят в процедуру,
записывают в следующих строках с одинаковым сдвигом вправо, на
пример, на 2 или 4 символа.
25
Программирование на языке Python
Процедуры с параметрами
Если попробовать вызвать только что написанную процедуру home
дважды, мы не получим два домика. Дело в том, что эта процедура
неуправляема: мы не можем ничего изменить в её работе, координаты
и размеры всех фигур жёстко заданы внутри процедур frame, roof и
window. А если хочется нарисовать несколько одинаковых домиков, но
в разных местах холста?
Решить эту задачу можно, используя метод базовой точки, описан
ный в предыдущем параграфе. Выбираем одну из точек изображения
домика в качестве базовой, обозначаем её координаты символами (на
пример, х и у) и пересчитываем координаты всех остальных точек че
рез X и у.
Получается, что координаты х и у нужно как-то передать процедуре
home. Для этого и служат круглые скобки, в которых мы пока ничего
не писали. Теперь можно ввести с клавиатуры координаты, записать
их в переменные и передать процедуре, указав в скобках при вызове:
print ( "Введите координаты домика" )
х = int( input("х = ") )
у = int( input("у = ") )
home( х, у )
26
Процедуры §4
27
1 Программирование на языке Python
Выводы
• Процедура — это отдельная часть программы, имеющая имя.
• Вызвать процедуру — значит записать её имя с круглыми скобка
ми, в которых перечисляются аргументы — данные, передаваемые
процедуре.
• Параметры — это данные, которые принимает процедура. В про
цедуре они обозначаются именами.
• Рефакторинг — это изменение программы, которое не влияет на
результат её работы, но делает её более понятной для человека.
Вопросы и задания
1. Допишите программу для рисования домика, использующую проце
дуры с параметрами. Постройте с её помощью ряд из четырёх доми
ков (см. цветной рисунок на обороте обложки).
28
Обработка целых чисел §5
§5
Обработка целых чисел
Ключевые слова'.
• арифметические операции • частное
• арифметические выражения • приоритет операций
• остаток • форматный вывод
Арифметические выражения
Арифметические выражения могут содержать константы (постоянные
значения), имена переменных, знаки арифметических операций, круг
лые скобки (для изменения порядка действий).
Для основных арифметических операций в языке Python использу
ются те же обозначения, что и в других языках программирования:
+ — сложение; - — вычитание;
* — умножение; / — деление.
Кроме того, есть ещё операция возведения в степень, которая обозна
чается как **. Например, х3 записывается как х**3.
Сначала рассмотрим операции с одной переменной. Оператор присва
ивания
i = i + 1
заменяет значение i на i + 1, т. е. увеличивает значение переменной
i на 1. Эта операция часто используется для увеличения специаль
ных переменных-счётчиков, с помощью которых считается количество
каких-то событий (например, щелчков мышью) или объектов (напри
мер, количество собранных призов в игре).
Более сложное присваивание
29
1 Программирование на языке Python
30
Обработка целых чисел §5
Деление нацело
Результат деления (операция «/») может быть нецелым числом, та
кие числа называются вещественными. Часто нужно получить целый
результат деления целых чисел и остаток от деления. Например, из
вестен интервал времени в секундах (скажем, 289 секунд) и нужно
определить, сколько в нём целых минут и оставшихся секунд (289 с =
= 4 мин 49 с). Здесь число минут 4 — это целая часть от деления 289
на 60, а 49 секунд — это остаток от этого деления.
В таких случаях используют специальные операторы:
// — деление нацело (с отбрасыванием остатка);
% — взятие остатка от деления.
Вот как выглядит программа, которая выделяет целые минуты и се
кунды (от 0 до 59) из интервала времени в секундах:
timeSec = 289
minutes = timeSec //60 # = 4
seconds = timeSec % 60 # = 49
С помощью этих операций удобно работать с отдельными цифрами
числа. Остаток от деления числа на 10 — это последняя цифра его де
сятичной записи2);
N = 123
lastDigit = N % 10 # = 3
Если разделить число на 10 и взять только целую часть, мы «отбро
сим» последнюю цифру числа: значение 123 // ю равно 12:
N = 123
digits2 = N // 10 # = 12
Интересен результат выполнения операций / / и % для отрицатель
ных чисел. Программа
print ( -7 // 2 )
print ( -7 % 2 )
выводит на экран числа -4 и 1. Дело в том, что с точки зрения тео
рии чисел остаток — это неотрицательное число, поэтому
-7 = (-4) -2 + 1,
х) В некоторых языках (например, в C++) это не так: при делении целых чисел
получается целое число и остаток отбрасывается.
2) А остаток от деления целого числа на N — это последняя цифра записи числа
в системе счисления с основанием N.
31
1 Программирование на языке Python
32
Обработка целых чисел §5
Выводы
• Арифметические выражения могут содержать константы (постоян
ные значения), имена переменных, знаки арифметических опера
ций, круглые скобки (для изменения порядка действий).
• Порядок выполнения действий определяется приоритетом опера
ций: сначала выполняется возведение в степень, затем — умноже
ние и деление, затем — сложение и вычитание. Для изменения
порядка действий используются скобки.
• Для деления нацело используется оператор //, для взятия остатка
от деления — оператор %.
• Форматный вывод данных выполняется с помощью функции
format.
Вопросы и задания
1. Что получится, если рассмотреть запись i = i + 1 как равенство —
©
уравнение относительно переменной i?
2. Чему будет равно значение переменной i после выполнения операто
ра i = i + 1, если до этого оно было равно 17?
3. Чему будут равны значения переменных а и b после выполнения
программы
а += 1
Ь += 1
а += Ь
Ь += а
а += 1
если вначале они имели значения а = 4 и b = 7?
4. Определите порядок действий компьютера при вычислении выраже
ния:
а = с + Ь — 1/2*5
5. Запишите присваивание
33
1 Программирование на языке Python
34
Обработка вещественных чисел §6
§6
Обработка вещественных чисел
Ключевые слова:
• вещественное число • форматный вывод
• научный формат • округление
• мантисса • модуль
35
Программирование на языке Python
Программа
х = 4.0
print(type(х))
выведет
<class 'float’>
Это означает, что созданная переменная х относится к типу (классу)
float, т. е. хранит вещественное число. Заметьте, что дробная часть
этого числа равна нулю, но мы специально указали её наличие с по
мощью точки. Это был сигнал для транслятора: «нужно создать веще
ственную переменную».
Очень большие или очень маленькие числа можно записывать в
научном формате. Например, величину, равную заряду электрона
(1,60217662 • 10-19 Кл), можно записать в переменную так:
qElectron = 1.60217662е-19
Здесь первую часть (1,60217662) часто называют мантиссой или зна
чащей частью числа, а «-19» после буквы е — это порядок числа.
Тот же принцип используется и для записи больших чисел. Рассто
яние от Земли до Солнца (1,496 • 1011 м) записывается в переменную
distToSun так:
distToSun = 1.49бе11
В памяти компьютера вещественные числа хранятся не так, как це
лые. Они тоже записываются в двоичном коде и представляются как
сумма степеней числа 2. Но, в отличие от целых чисел, в эту сумму
включают и отрицательные степени двойки, например:
4,375 = 22 + 2 2 + 23 = 100,0112.
Память компьютера не бесконечна, поэтому без ошибки могут хра
ниться только те вещественные числа, которые точно равны сумме ко
нечного количества степеней числа 2.
К сожалению, многие вещественные числа, например 0,1 и 0,9,
в двоичном коде записываются как бесконечные дроби. Поэтому при
их записи в память остаются только первые биты1), а остальные отбра
сываются.
36
Обработка вещественных чисел §6
Ввод и вывод
Как вы знаете, результат ввода с помощью функции input — это сим
вольная строка. Если мы хотим ввести вещественное число, нужно за
тем преобразовать эту строку с помощью функции float:
х = float (input () )
Теперь х — это вещественная переменная, и команда
print(type(х))
выведет
<class 'float'>
Несложно ввести несколько переменных в одной строке, используя
тот же приём, что и для целых чисел (см. § 2):
х, у, z = map (float, input (). split () )
Здесь вводятся значения трёх переменных, х, у и z.
При выводе вещественных значений по умолчанию (т. е. если не ска
зано делать иначе) выводится 16 значащих цифр. Например, команда
print(16/7)
37
1 Программирование на языке Python
выводит
2.2857142857142856
Если такой вариант не устраивает, применяют форматный вывод,
например:
х = 16/7
print ( ">{:fformat(х) ) # >2.285714
Здесь после двоеточия указан формат f, по умолчанию он оставляет
6 цифр в дробной части числа. Перед буквой f можно записать два
числа через точку: первое задаёт общее количество позиций на вывод
числа, а второе — количество цифр в дробной части:
print ( ">{:10.3f}".format(х) ) # > 2.286
В этом варианте на число отводится всего 10 позиций, из них 3 — на
дробную часть. Поскольку цифры и точка занимают 5 позиций, слева
добавляется ещё 5 пробелов.
Если пробелы слева от числа не нужны, а требуется только ограни
чить количество знаков в дробной части, число слева от точки не пи
шут:
print( ">{:.3fformat(х) ) # >2.286
Для очень больших или очень маленьких чисел используют науч
ный формат (стандартный вид числа). Он обозначается буквой е вну
три фигурных скобок:
х = 1е10/7
print( ">{:12.4еformat(х) ) # > 1.4286е+09
Число слева от точки в строке формата — это общее количество по
зиций для вывода числа, а второе число — количество знаков в дроб
ной части мантиссы (для всех чисел, кроме числа 0, она больше или
равна 1 и меньше 10). Если первое число не указывать, будет исполь
зовано наименьшее возможное место.
38
Обработка вещественных чисел §6
Выводы
• Большинство вещественных чисел хранится в памяти компьютера
с ошибкой. Она вызвана тем, что для хранения числа выделяется
конечное число двоичных разрядов.
• Для преобразования символьной строки в вещественное число
используется встроенная функция float.
• Для ввода и вывода вещественных чисел можно использовать
научный формат (стандартный вид числа).
• Математические функции объединены в модуль math.
• Функция из модуля вызывается с помощью точечной записи
(имя модуля.имя функции).
39
1 Программирование на языке Python
Вопросы и задания
1. Вычислите значение вещественной переменной с при а = 2 и b = 3:
а) с = а+1/3
б) с = а + 4/2*3 + 6
в) с = (а + 4) /2*3
г) с = (а + 4) / (Ь + 3) *а
2. Что будет выведено в результате работы следующей программы?
х = 172.3658
print ( х )
print( "{:10.2f}". format(x) )
print( "{:.8f}". format(x) )
3. Программа вывела числа в научном формате:
1.2345Е+001
2.345Е+003
5.6Е+005
8.74Е+00
1.8752Е-01
3.462752Е-03
Запишите их в «обычном» виде.
4. Что будет выведено на экран в результате работы следующей про
граммы?
а = 1; Ь = 2; с=3; d=7
print( "{:.2f}". format(a/b) )
x = b / c
print( "{:.2f} {:2}".format(x, int(x)) )
print( "{:.2f}". format(x-int(x)) )
x = d / c
print( ”{:.2f} {:2}".format(x, int(x)) )
print( "{:.2f}". format(x-int(x)) )
5. Напишите программу, которая вычисляет квадратный корень введён
ного числа. Вычислите с её помощью квадратные корни из чисел
221841; 32005,21 и 15239,9025.
«о „ 1.1.11 п
6. Вычислитевручную сумму Л= — + — + — + — = — в виде простои
2 3 4 5 а
дроби. Затемпроверьте, что выведет эта программа (вместо многото
чий добавьте полученные значения п и d):
п = ...; d = ...
у = 1/2 + 1/3 + 1/4 + 1/5
х = n/d
print( х )
print( у )
print( х-у )
Сделайте выводы.
40
Случайные и псевдослучайные числа
Интересный сайт
h-schmidt.net/FloatConverter/IEEE754.html — представление вещест
венных чисел в памяти компьютера (онлайн-калькулятор)
§7
Случайные и псевдослучайные числа
Ключевые слова'.
• случайные числа • генератор случайных чисел
• псевдослучайные числа
41
1 Программирование на языке Python
42
Случайные и псевдослучайные числа §7
Выводы
• Случайные числа — это последовательность чисел, в которой не
возможно предсказать следующее число, даже зная все предыду
щие.
• При моделировании на компьютерах чаще всего используются
псевдослучайные числа — последовательность чисел, которая стро
ится по некоторой формуле.
• В языке Python все функции для работы со случайными числами
находятся в модуле random.
• Случайное целое число на отрезке [а; Ь] можно получить с помо
щью вызова randint (а, Ь), а случайное вещественное число на
отрезке [а; Ь] строится как uniform ( а, Ь ).
Вопросы и задания
1. Напишите программу, которая вводит с клавиатуры два целых чис
ла, а и b (а < Ь), и выводит на экран 5 случайных целых чисел на
отрезке [а; &].
2. В игре «Русское лото» из мешка случайным образом выбираются бо
чонки, на каждом из которых написано число от 1 до 90. Напишите
программу, которая выводит наугад первые 5 выигрышных номеров.
3. Доработайте программу «Русское лото» так, чтобы все 5 значений
гарантированно были разными.
4. Напишите программу, которая моделирует бросание двух игральных
кубиков: при запуске выводит случайное число на отрезке [2; 12].
5. Игральный кубик бросается три раза (выпадают три случайных зна
чения). Из этих чисел составляется целое число, программа должна
найти его квадрат.
43
Программирование на языке Python
§8
Ветвления
Ключевые слова:
• условный оператор • вложенный условный оператор
• полная форма условного • логические переменные
оператора
• неполная форма условного
оператора
Условный оператор
Сейчас мы умеем писать линейные программы, в которых операторы
выполняются последовательно друг за другом, и порядок выполнения
операторов не зависит от входных данных.
В большинстве реальных задач порядок действий может изменяться
в зависимости от того, какие данные поступили. Например, программа
для системы пожарной сигнализации должна выдавать сигнал тревоги,
если максимальное из показаний двух датчиков температуры больше,
чем предельно допустимое значение. Для этого нужно сначала найти
это максимальное значение, т. е. записать его в какую-нибудь пере
менную.
Выполним формализацию задачи — запишем её «в буквах»:
Требуется записать в переменную М наибольшее из значений пере
менных а и Ь.
Для решения таких задач в языках программирования предусмотре
ны условные операторы (ветвления). Например, для того, чтобы запи
сать в переменную м максимальное (наибольшее) из значений перемен
ных а и Ь, можно использовать оператор:
44
Ветвления
if а > b:
М = а
else:
М = Ь
Слово if переводится с английского языка как «если», а слово
else — как «иначе». Если верно (истинно) условие, записанное по
сле слова if, то выполняются все команды (также говорят «блок ко
манд»), которые расположены до слова else. Если же условие после
if неверно (ложно), выполняются команды, стоящие после else.
В Python, в отличие от других языков, сдвиги операторов относи
тельно левой границы (отступы) влияют на работу программы. Обра
тите внимание, что слова if и else начинаются на одном уровне, а
все команды внутренних блоков сдвинуты относительно этого уровня
вправо на одно и то же расстояние. Для сдвига используют пробелы
(обычно не меньше двух) или символы табуляции (которые вставля
ются при нажатии на клавишу Tab).
Кроме знаков < и > в условиях можно использовать другие знаки
отношений: <= (меньше или равно), >= (больше или равно), == (равно,
два знака «равно» без пробела, чтобы отличить от оператора присваи
вания) и != (не равно).
Если в блоке всего один оператор, иногда бывает удобно записать
блок в той же строке, что и служебное слово if (else):
if а > b: М = а
else: М = Ь
В приведённых примерах условный оператор записан в полной фор
ме: в обоих случаях (истинно условие или ложно) нужно выполнить
некоторые действия.
46
§8
Логические переменные
Во многих языках можно использовать переменные, в которых хранят
ся логические значения («да»/«нет», истина/ложь). В языке Python та
кие переменные могут принимают значения True («истина») или False
(«ложь»):
b = True
b = False
print(type(b) )
Эта программа выведет:
<class 'bool'>
47
1 Программирование на языке Python
48
Ветвления §8
Рис. 1.5
В прямоугольниках записаны вопросы, которые задаёт система поль
зователю, у стрелок — его возможные ответы («да» или «нет»). Серым
фоном выделены выводы — результат работы экспертной системы.
Конечно, эта система позволяет определить не все классы животных:
в некоторых местах на схеме стоят знаки вопроса. В этих случаях
наша программа будет выводить ответ «не знаю».
Человеку удобнее вводить ответ словами («да», «нет»), т. е. в виде
символьной строки. Именно в такой форме возвращает результат ввода
функция input, с которой мы уже знакомы.
Программа начинает диалог с вопроса «Кормит детей молоком?» и
в зависимости от ответа выбирает одну из двух ветвей дерева решений
(см. рис. 1.5).
otvet = input ( "Кормит детей молоком? " )
if otvet == "да":
... # вариант 1
else:
... # вариант 2
Конечно, вместо многоточий должны быть добавлены команды, кото
рые нужно выполнить в каждом случае.
49
1 Программирование на языке Python
Выводы
• Условный оператор if-else позволяет выбрать один из двух вари
антов действий в зависимости от выполнения некоторого условия.
• Условие, которое нужно проверить, записывается после слова if.
Записывать обратное условие после else не нужно.
• Если условие верно, выполняются все команды, записанные после
строки с оператором if (со сдвигом вправо).
• Если условие неверно, выполняются все команды, записанные пос
ле строки с оператором else (со сдвигом вправо).
• В обеих частях условного оператора можно использовать любые
операторы, в том числа и другие (вложенные) условные операторы.
• В логической переменной можно хранить логическое значение:
True (истина) или False (ложь).
• Экспертная система — это компьютерная программа, задача кото
рой — заменить человека-эксперта при выработке рекомендаций
для принятия решений в сложной ситуации.
Вопросы и задания
1. Какие задачи невозможно решить с помощью линейных алгоритмов?
2. Как вы думаете, хватит ли линейных алгоритмов и ветвлений для
разработки любой программы?
3. Почему нельзя выполнить обмен значений двух переменных в два
таких шага?
а = b
Ъ = а
4. Можно ли переставлять операторы в алгоритме обмена значений
двух переменных, приведённом в параграфе? Если нет, приведите
контрпример, когда перестановка даст неверный результат.
50
Ветвления §8
51
1 Программирование на языке Python
if а > b: М = а
else: М = b
if с > b: М = с
else: М = b
Приведите контрпример, т. е. значения переменных, при которых в
переменной М будет получен неверный ответ. Как нужно доработать
программу, чтобы она всегда работала правильно?
15. Напишите программу, которая выбирает максимальное и минималь
ное из трёх (четырёх, пяти) введённых чисел (не используя встро
енные функции min и max).
16. Что выведет эта программа при х = -3? х = 0? х = 12 3?
if х >= 0:
if х > 0:
print(1)
else:
print(0)
else:
print(-1)
17. Напишите другой вариант решения задачи из параграфа, в кото
рой сравнивается возраст Андрея и Бориса (с другой последователь
ностью проверки условий). Сколько всего вариантов можно приду
мать?
18. Напишите программу, которая вводит с клавиатуры возраст трёх
человек (Антона, Бориса и Виктора) и определяет, кто из них стар
ше.
19. Напишите программу, которая моделирует работу следующего авто
мата. Автомат получает на вход трёхзначное натуральное число и
строит новое число следующим образом:
1) вычисляются суммы первой и второй, затем — второй и тре
тьей цифр;
2) эти суммы записываются в порядке невозрастания.
Например, для числа 639 получаем суммы: 6 + 3 = 9; 3 + 9 = 12.
Результат: 129. Ваша программа должна принимать введённое с
клавиатуры трёхзначное число и определять число, которое будет
получено в результате работы автомата.
20. Напишите программу, которая моделирует работу следующего авто
мата. Автомат получает на вход четырёхзначное натуральное число
и строит новое число следующим образом:
1) вычисляются суммы первой и второй; второй и третьей; тре
тьей и четвёртой цифр;
2) из полученных сумм отбрасывается наименьшая;
3) остальные суммы записываются в порядке неубывания.
Например, для числа 1284 получаем суммы: 1 + 2 = 3; 2 + 8 = 10;
8 + 4 = 12. Наименьшая сумма 3 отбрасывается, результат 1012.
52
Сложные условия
§9
Сложные условия
Ключевые слова:
• сложное условие • операция НЕ
• операция И • равносильные условия
• операция ИЛИ • порядок выполнения операций
Операция И
Предположим, что ООО «Кнут и Пряник» набирает сотрудников, воз
раст которых от 25 до 40 лет включительно. Нужно написать програм
му, которая запрашивает возраст претендента и выдаёт ответ: подходит
он или не подходит по этому признаку.
Какое же условие должно быть истинно для того, чтобы человека
приняли на работу? Одного условия возраст >=25 не хватает, это
условие соблюдается и для людей старше 40 лет. Вместе с тем усло
вия возраст <=4 0 тоже недостаточно, так как оно выполняется и для
школьников. В этой задаче нужно, чтобы два условия выполнялись
одновременно: возраст >= 25 и возраст <= 4 0.
Эту задачу можно решить с помощью вложенного условного операто
ра, но решение получается некрасивым: оно запутанное и, кроме того,
один и тот же ответ "не подходит" приходится выводить в двух ме
стах программы.
Почти во всех языках программирования в условном операторе
можно использовать такое условие:
if age >= 25 and age <= 40:
print( "подходит" )
else:
print ( "не подходит" )
53
Программирование на языке Python
54
Сложные условия §9
Операция ИЛИ
Рассмотрим ещё одну задачу. Самолёт из Санкт-Петербурга в Барнаул
летает только по понедельникам и четвергам. В переменной day запи
сан номер дня недели (1 — понедельник, 7 — воскресенье). Програм
ма должна определить, полетит ли самолёт в этот день.
Если мы напишем условие day = 1 and day = 4, то это будет не
верно, потому что это условие требует, чтобы значение переменной day
было одновременно равно и 1, и 4. Такого быть не может, поэтому это
условие всегда будет ложно. Значит, операция И не подходит. Вместо
неё нужно применить другую операцию — ИЛИ, которая требует вы
полнения хотя бы одного из набора условий.
Операция HE
Существует ещё одна операция, которую можно использовать в
сложных условиях — НЕ, в Python она обозначается словом not
(по-английски — «не»).
55
Программирование на языке Python
56
Сложные условия §9
Выводы
• Операция И (and) означает одновременное выполнение двух или
нескольких условий.
• Операция ИЛИ (or) означает выполнение хотя бы одного из двух
или нескольких условий.
• Операция НЕ (not) означает обратное условие (противоположное
исходному).
• При определении истинности условия сначала выполняются дей
ствия в скобках, потом — операции НЕ, затем — операции И и в
самом конце — операции ИЛИ.
Вопросы и задания
1. Что будет выведено на экран после выполнения программы при
cats = 2?
if cats = 1 and cats = 2:
print ( "Да! Получилось!" )
else:
print ( "Нет. He вышло." )
2. Найдите другой вариант решения задачи из параграфа о вылете само
лёта из Санкт-Петербурга в Барнаул: с использованием операции И.
3. Запишите равносильные условия, не используя операцию НЕ:
a) not (а < 6)
б) not(b == c+d)
в) not(с != 15)
*4. Запишите равносильные условия, не используя операцию НЕ:
a) not (7 < a and а < 12)
б) not(b != с or d < 5)
5. Определите порядок выполнения операций при определении истин
ности условия:
not(а > 10) or not(а < 10) and (а < b)
Определите, истинно или ложно это выражение при а = 5, Ь = 10.
6. Для выражения в предыдущем задании запишите равносильное
выражение без использования операции НЕ. После этого расставь
те одну пару скобок так, чтобы значение выражения при а = 5,
Ь = 10 изменилось на обратное.
7. Напишите программу, которая вводит целое число и выводит ответ
«да», если оно трёхзначное.
8. Напишите программу, которая получает три числа — рост трёх
спортсменов, и выводит сообщение «По росту!», если числа введены
по возрастанию, или сообщение «Не по росту!», если они введены в
другом порядке.
57
1 Программирование на языке Python
58
Циклы с условием §10
§10
Циклы с условием
Ключевые слова:
• цикл • заголовок цикла
• итерация • тело цикла
• счётчик шагов цикла • цикл с предусловием
• зацикливание • алгоритм Евклида
До этого мы писали программы, в которых каждая команда выполня
лась только один раз или не выполнялась вообще. Но мощь компью
тера состоит ещё и в том, что короткая программа может выполнять
очень сложную и длительную обработку данных, применяя некоторые
команды многократно.
59
1 Программирование на языке Python
60
Циклы с условием § 10
Циклы с предусловием
Цикл, в котором проверка условия выполняется при входе (перед вы
полнением очередной итерации) называется циклом с предусловием,
т. е. циклом с предварительной проверкой условия. Перед тем как на
чать выполнение цикла, мы проверяем, нужно ли это делать вообще.
Все циклы, записанные в начале параграфа, — это циклы с предус
ловием. У них есть два важных свойства:
• условие проверяется при входе в цикл, поэтому тело цикла не вы
полнится ни разу, если условие в самом начале ложно;
• когда при очередной проверке условия в заголовке цикла выяс
няется, что это условие ложно, работа цикла заканчивается.
Пример
Рассмотрим ещё одну задачу, которая решается с помощью цикла с
условием. Требуется ввести с клавиатуры натуральное число и найти
сумму цифр его десятичной записи. Например, если ввели число 123,
программа должна вывести сумму 1 + 24-3 = 6.
Сначала составим алгоритм решения этой задачи. Предположим, что
число записано в переменной N. Нам нужно как-то разбить число на
отдельные цифры.
Текущую цифру числа будем хранить в переменной digit.
Вспомним, что остаток от деления числа на 10 равен последней циф
ре его десятичной записи. Запишем эту цифру в переменную digit:
digit = N % 10
Сумму цифр будем хранить в целой переменной summa. В самом на
чале, пока ни одну цифру ещё не обработали, значение этой перемен
ной равно нулю:
summa = О
Для того чтобы добавить к предыдущей сумме новую цифру, нужно
заменить значение переменной summa на summa+digit, т. е. выполнить
присваивание
summa += digit
Для того чтобы получить следующую цифру числа, надо затем от
сечь последнюю цифру числа N. Для этого разделим N на 10 (основа
ние системы счисления):
N = N // 10
Эти три операции — выделение последней цифры числа, увеличение
суммы и отсечение последней цифры — нужно выполнять несколько
раз, пока все цифры не будут обработаны (и отсечены!) и в перемен
ной N не останется ноль:
N = int( input( "Введите число: " ) )
61
1 Программирование на языке Python
summa = О
while N != 0:
digit = N % 10
sununa += digit
N = N // 10
print ("Сумма цифр", sununa)
Выполним трассировку (ручную прокрутку) программы при N = 15.
В столбцы таблицы будем записывать изменение значений всех пере
менных:
Оператор Условие N digit sunnna
15
sum = 0 0
N != 0 да
digit = N % 10 5
sum += digit 5
N = N // 10 1
N != 0 да
digit = N % 10 1
sum += digit
N = N // 10 0
N != 0 нет
Алгоритм Евклида
Алгоритм Евклида — это один из самых древних известных алгорит
мов, который используется по сей день. Его автор — греческий ма
тематик Евклид — жил в III веке до нашей эры. Алгоритм Евклида
позволяет найти наибольший общий делитель (НОД) двух натуральных
чисел.
62
Циклы с условием §10
63
1 Программирование на языке Python
count = О
while а != 0 and Ь != 0:
count += 1
print ( a+b )
print ( "Шагов:", count )
Вместо многоточия нужно вставить условный оператор, как и в пре
дыдущем варианте программы. Обратите внимание, что оператор, уве
личивающий значение счётчика, записывается с отступом — он нахо
дится в теле цикла.
Бесконечные циклы
В некоторых задачах используются циклы, условие которых всегда ис
тинно (многоточие обозначает тело цикла):
while True:
64
Циклы с условием §10
Выводы
• С помощью циклов в программе можно выполнять повторяющиеся
действия.
• Цикл с условием выполняется до тех пор, пока некоторое условие
(условие продолжения работы цикла) не станет ложным.
• Если условие в заголовке цикла ложно с самого начала, тело цик
ла не выполнится ни разу.
• Если условие в заголовке цикла всегда остаётся истинным, цикл
работает бесконечно — программа зацикливается.
• Модифицированный алгоритм Евклида для вычисления НОД двух
натуральных чисел: заменять большее из чисел на остаток от де
ления большего на меньшее, пока этот остаток не станет равен
нулю. Тогда второе число и есть их НОД.
• Для досрочного выхода из цикла используют оператор break.
Вопросы и задания
1. В каком случае программа, содержащая цикл с условием, может
зациклиться?
2. В каком случае тело цикла с условием не выполняется ни разу?
3. Программист написал программу с циклом:
count = О
while count < 20:
print( "привет" )
count += 1
Определите, как изменится работа программы, если:
а) заменить условие на count != 20;
б) переставить две строки в теле цикла;
в) заменить условие на count <= 20;
г) заменить условие на count > 20;
65
Программирование на языке Python
66
Циклы с условием §10
д) к = 15
while к > б:
print ( к-1, end="" )
к -= 1
8. Напишите программу, которая вводит с клавиатуры количество
повторений и выводит столько же раз какое-нибудь сообщение.
9. Напишите программу, которая вводит с клавиатуры натуральное
число и определяет количество цифр в его десятичной записи.
10. Напишите программу, которая выводит на экран в столбик все
цифры числа в обратном порядке (начиная с последней).
*11 . Напишите программу, которая выводит на экран в столбик все
цифры числа, начиная с первой.
12. Напишите программу, которая вводит с клавиатуры натуральное
число и определяет количество чётных цифр в его десятичной за
писи.
13. Напишите программу, которая вводит с клавиатуры натуральное
число и определяет, сколько раз в его десятичной записи встре
чается цифра 1.
* 14. Напишите программу, которая вводит с клавиатуры натуральное
число и находит наибольшую цифру в его десятичной записи.
* 15. Напишите программу, которая вводит с клавиатуры натуральное
число и определяет, есть ли в его десятичной записи две одинако
вые цифры, стоящие рядом.
* 16. Напишите программу, которая определяет, верно ли, что введён
ное число состоит из одинаковых цифр (как, например, 222).
17. Напишите программу, которая вводит с клавиатуры натуральное
число и вычисляет целую часть квадратного корня из него — наи
большее число, квадрат которого не больше данного числа.
18. Напишите программу, которая предлагает ввести пароль и не пере
ходит к выполнению основной части, пока не введён правильный
пароль. Основная часть — вывод на экран «секретных сведений»
(придумайте их сами).
*19. Напишите программу, которая вводит с клавиатуры натуральное
число и определяет, простое оно или нет. Для этого нужно делить
число на все натуральные числа, начиная с 2, пока не получится
деление без остатка.
20. Напишите программу, которая вводит с клавиатуры два натураль
ных числа и находит их НОД с помощью алгоритма Евклида.
Программа должна подсчитать количество шагов цикла.
21. Напишите программу, которая вводит с клавиатуры два нату
ральных числа и сравнивает количество шагов для вычисления
их НОД с помощью «обычного» и модифицированного алгоритмов
Евклида.
67
1 Программирование на языке Python
Интересный сайт
mccme.ru/free-books/shen/shen-progbook.pdf — книга А. Шеня «Про
граммирование. Теоремы и задачи» (распространяется свободно)
§11
Анимация
Ключевые слова'.
• анимация • координаты объекта
• кадр • событие
• смена кадров • обработчик события
Принципы анимации
Слово «анимация» произошло от латинского слова animatio, что озна
чает «оживление». При анимации быстрая смена мало различающихся
рисунков (кадров) создаёт иллюзию движения. Если кадры меняются
чаще, чем 16 раз в секунду, человеческий глаз не успевает реагиро
вать на каждое изменение и видит плавное движение.
Допустим, мы нарисовали четыре кадра одинакового размера
(рис. 1.6) и меняем их на экране, скажем, через каждую секунду: сна
чала выводим кадр а, затем, через 1 секунду — кадр б, ещё через
1 секунду — кадр в и т. д.
68
Анимация § 11J
Рис. 1.6
Начальное положение
Сначала нарисуем фон — синий квадрат со стороной 400 пикселей:
brushcolor ( "blue" )
rectangle( 0, 0, 400, 400 )
Шарик будем изображать в виде круга жёлтого цвета, контур тоже
сделаем жёлтым. Базовой точкой, определяющей текущие коорди
наты шарика (т. е. координаты в данный момент времени) удобно
считать центр круга, обозначим его координаты через xCenter и
yCenter.
Шарик будем двигать слева направо по середине холста на уровне
yCenter = 200 (рис. 1.7).
69
1 Программирование на языке Python
400-Я
400
200 ф- о
Рис. 1.7
Когда шарик находится вплотную к левой границе, х-координата
его центра равна радиусу (обозначим его через R), а у правой границы
xCenter = 400 — R.
Теперь можно нарисовать сам шарик в начальном положении:
R = 10
xCenter = 10
yCenter = 200
penColor( "yellow" )
brushColor( "yellow" )
obj = circle( xCenter, yCenter, R )
Обратите внимание на последнюю строку: мы не только рисуем круг
с помощью команды circle, но и записываем в переменную obj
результат работы этой функции. А она возвращает специальный код
объекта-круга, с помощью которого им можно управлять, например
перемещать по холсту.
Анимация движения
Для того чтобы анимация заработала (шарик «поехал» вправо), нам
нужно периодически через малый интервал времени увеличивать
х-координату шарика, таким образом смещая его в новое место.
Перемещением объекта на экране занимается функция moveObjectBy
(от английских слов move — переместить, object — объект, by — пред
лог, указывающий на величину смещения). Команда
moveObjectBy( obj, dx, dy )
переместит объект так, чтобы его х-координата увеличилась на dx, а
{/-координата — на dy. Например, перемещение на 5 пикселей вправо
(без изменения {/-координаты) задаётся командой
moveObjectBy ( obj, 5, 0 )
Объединим команды, задающие движение шарика, в процедуру с
именем update (в переводе с английского — обновить):
70
Анимация §И
def update():
global xCenter # будем изменять xCenter
xCenter += 5 # новая х-координата центра
moveObjectBy ( obj, 5, 0 )
def update():
global xCenter # будем изменять xCenter
xCenter += 5 # новая х-координата центра
71
1 Программирование на языке Python
moveObjectBy( obj, 5, 0 )
if xCenter >= 400-R: close()
brushColor( "blue" )
rectangle( 0, 0, 400, 400 )
R = 10
xCenter = 10
yCenter = 200
penColor( "yellow" )
brushColor( "yellow" )
obj = circle( xCenter, yCenter, R )
onTimer( update, 20 )
run ()
72
Анимация §11
Выводы
• Анимация на компьютере — это быстрая смена рисунков, которая
создаёт иллюзию движения. Каждый из таких рисунков называют
кадром.
• Если менять кадры чаще, чем 16 раз в секунду, глаз перестаёт
замечать смену изображений и человеку кажется, что он видит
непрерывное движение.
• В графической библиотеке языка Python все элементы рисунка —
это объекты, которые умеют сами себя перерисовывать. Поэтому
анимация сводится к постепенному перемещению этих объектов.
• Переменные, которые введены в основной программе, можно ис
пользовать во всех процедурах. Они называются глобальными.
• Глобальные переменные, которые нужно изменять в процедуре,
необходимо перечислить в команде global.
• Для создания анимации нужно установить обработчик события
«таймер»: указать процедуру, которая будет вызываться при каж
дом срабатывании таймера.
• Если программа должна реагировать на нажатие клавиш, нужно
установить обработчик события «клавиша нажата». Внутри этой
процедуры определяется код нажатой клавиши и выполняются не
обходимые действия.
Вопросы и задания
1. Как вы думаете, можно ли заранее нарисовать все кадры анимации
для мульфильма? В компьютерных играх? Обоснуйте свой ответ.
2. Как можно изменить программу анимации, чтобы ускорить дви
жение шарика? Предложите два варианта решения этой задачи и
обсудите ограничения каждого из них.
3. Измените программу анимации так, чтобы после касания шариком
правой границы синего квадрата он останавливался, но окно не
закрывалось.
4. Доработайте программу анимации так, чтобы шарик после выхода за
границы синего квадрата вновь появлялся с другой стороны холста.
5. Выполните рефакторинг (переработку кода) программы анимации,
избавившись от «магических чисел» (5, 400): запишите их в гло
бальные переменные в самом начале основной программы и далее
везде используйте эти переменные.
6. Напишите программу, в которой через поле (синий прямоугольник)
движутся два квадрата навстречу друг другу.
*7. Доработайте предыдущую программу так, чтобы квадраты отталки
вались от границ поля и начинали движение в противоположном
направлении.
73
1 Программирование на языке Python
§12
Циклы по переменной
Ключевые слова.'.
• цикл по переменной • шаг изменения переменной цикла
• переменная цикла
Сделать N раз
Вернёмся снова к задаче, которую мы обсуждали в одном из парагра
фов — вывести на экран несколько раз слово «привет». Фактически нам
нужно организовать цикл, в котором блок операторов выполнится задан
ное число раз. Для этого можно применить ещё один вид цикла — цикл
по переменной (или цикл с параметром). На языке Python он записыва
ется так:
for i in range(10):
print( "привет" )
Здесь слово for означает «для», переменная i (её называют перемен
ной цикла) изменяется в диапазоне (in range) от 0 до 10, не включая
10 (т. е. от 0 до 9 включительно). Таким образом, цикл выполняется
для i = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 — ровно 10 раз. Переменная i —
это счётчик выполненных итераций цикла. Можно было записать этот
цикл и по-другому:
for i in [0,1,2,3, 4,5,6,7,8,9] :
print( "привет" )
В квадратных скобках через запятую перечислены все значения пе
ременной, при которых выполняется цикл. Если их много, такой спо
соб неудобен, лучше использовать встроенную функцию range.
Обратите внимание, что последовательность, которую строит функ
ция range, не бесконечна, т. е. цикл по переменной всегда заканчи
вается, программа не может зациклиться.
74
Циклы по переменной §12
75
1 Программирование на языке Python
Выводы
• Цикл по переменной применяют тогда, когда количество итера
ций цикла заранее известно или может быть вычислено до начала
цикла.
• Переменная, изменение которой определяет работу цикла, называ
ется переменной цикла.
• Цикл по переменной всегда заканчивается (программа не может
зациклиться).
• Цикл с условием, для которого количество итераций известно или
может быть вычислено заранее, можно заменить на равносильный
цикл по переменной.
• Любой цикл по переменной можно заменить на цикл с условием,
который выполняет те же действия.
• При вызове функции range указывают начальное значение, значе
ние-ограничитель (не входящее в последовательность) и шаг изме
нения переменной цикла.
Вопросы и задания
1. В каких случаях цикл по переменной не выполнится ни разу?
2. Может ли цикл по переменной работать бесконечно? Почему?
3. Сравните цикл по переменной и цикл с условием. Какие преимуще
ства и недостатки есть у каждого из них?
76
Циклы по переменной §12
77
1 Программирование на языке Python
78
Циклы в компьютерной графике §13
§13
Циклы в компьютерной графике
Ключевые слова'.
• цикл • вложенный цикл
• узор • процедура
Узоры
Узор — это рисунок, основанный на повторении одинаковых элемен
тов. В этом параграфе мы будем применять циклы для построения
разнообразных узоров.
79
1 Программирование на языке Python
Задача 1
Построим ряд из пяти окружностей радиуса 5 пикселей (рис. 1.8).
Вложенные циклы
Задача 2
Построим три одинаковых ряда окружностей, расположенных на рас
стоянии 20 пикселей по высоте друг от друга (рис. 1.9).
Три горизонтальных ряда на рис. 1.9 различаются лишь координа
той у. Поэтому можно применить такой цикл:
for у in range(20,61,20):
# построить ряд с выбранным у
80
Циклы в компьютерной графике §13
81
1 Программирование на языке Python
Пример
Задача 3
Построим на экране узор из ромбов (рис. 1.10).
82
Циклы в компьютерной графике §13
Штриховка
Во многих задачах компьютерной графики нужно заштриховать какие-
то области. Например, штриховкой обозначаются сечения на чертежах,
болота на картах местности.
Штриховка строится из параллельных линий, которые удобно ри
совать в цикле. Выполним вертикальную штриховку прямоугольника,
разделив его на N полос (рис. 1.11).
83
1 Программирование на языке Python
Выводы
• При выполнении узоров (повторяющихся рисунков) и штриховки
удобно использовать цикл по переменной.
• Для того чтобы легче было построить цикл, можно записать ко
манды для рисования нескольких элементов узора, в том числе
первого и последнего. После этого определить, какие величины
84
Циклы в компьютерной графике §13
Вопросы и задания
1. Что нужно изменить в решении задачи 1, чтобы окружности вы
строились по диагонали?
85
1 Программирование на языке Python
86
Глава 2
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ C++
§14
Первые программы
Ключевые слова'.
• компилятор • поток вывода
• препроцессор • поток ввода
• раздельная компиляция • пространство имён
• вывод данных • символьная строка
Язык C++
В начале 1970-х годов Деннис Ритчи, сотрудник компании Bell Labs,
разработал язык С, который в последующие годы стал одним из са
мых востребованных языков программирования и остаётся на лидиру
ющих позициях до настоящего времени1).
С одной стороны, язык С — это язык высокого уровня, независимый
от процессора, на котором выполняется программа. С другой стороны,
он позволяет напрямую работать с аппаратурой, заменяя чрезвычайно
сложное программирование в машинных кодах и на языке ассемблера.
В начале 1980-х годов Бьёрн Страуструп, сотрудник той же компа
нии Bell Labs, дополнил язык С новыми возможностями, которые были
нужны ему для моделирования сложных систем. Так был создан язык
C++, который стал одним из самых популярных языков программиро
вания. Отметим, что почти все программы на «чистом» С будут рабо
тать и в C++.
Одно из достоинств современного языка C++ — обширная стандарт
ная библиотека: набор готовых подпрограмм для решения часто встре
чающихся задач (например, для обработки символьных строк).
На языках С и C++ написано большинство современных операцион
ных систем и программ, которыми вы пользуетесь ежедневно, в том
числе абсолютное большинство компьютерных игр. Синтаксис С и C++
(правила написания команд) использовали при создании языков С#,
Objective-C, Java, JavaScript, Swift и других, поэтому, изучив C++, вы
легко можете перейти на эти языки при необходимости.
Перед запуском программа на C++ обрабатывается компилято
ром — специальным видом транслятора, который строит исполняемую
b В рейтинге популярности языков программирования от компании TIOBE в
январе 2018 года язык С занимал второе место после Java (https://www.tiobe.
com/tiobe-index/).
87
2 Программирование на языке C++
88
Первые программы §14
89
Программирование на языке C++
90
Первые программы §14
Выводы
• Любая программа на языке C++ содержит основную программу —
функцию с именем main.
• Символами // начинается комментарий, который действует до
конца строки. Комментариями считается также всё, что записано
между парами символов /* и */.
• Каждый оператор заканчивается точкой с запятой.
• Символьная строка — это последовательность символов, заключён
ная в кавычки. Апострофы используются для записи одиночных
символов (не строк).
• Стандартные (и не только стандартные) библиотеки подключаются
к программе с помощью команды #include. Её выполняет препро
цессор, обрабатывающий текст программы перед компилятором.
• Поток — это последовательность символов, которая поступает на
вход или на выход программы. Для вывода данных на экран ис
пользуют выходной поток с out, для ввода с клавиатуры — поток
cin.
• Пространство имён — это область видимости объектов программы,
в том числе переменных. Потоки ввода и вывода принадлежат
пространству имён std.
Вопросы и задания
1. Почему раздельная компиляция позволяет экономить время програм
миста при отладке программы?
2. Найдите ошибки в записи операторов вывода:
cout « "Смотрите фильм "Салют-7"!";
cout « "С"
cout « 'Hello, ' « "world!";
Как их можно исправить?
3. Найдите ошибки в программе,
cout « "Привет," « Вася!;
4. Заполните пропуск так, чтобы программа вывела на экран слова
Computer
science
(каждое слово в отдельной строке):
cout << "Comp" << ...;
cout << "псе";
91
2 Программирование на языке С++
§15
Диалоговые программы
Ключевые слова’.
• ввод данных • объявление переменной
• переменная • входной поток
92
Диалоговые программы §15
Переменные
Имена переменных (идентификаторы,) строятся по тем же правилам,
что и в языке Python: можно использовать латинские буквы, цифры и
знак подчёркивания «_». Строчные и прописные буквы различаются,
т. е. а и А — разные переменные. Имя не может начинаться с цифры.
Нужно выбирать «говорящие» имена переменных, которые облегча
ют понимание программы. Например, запись
animals = dogs + cats;
значительно понятнее, чем
а = d + с;
(по-английски animals — животные, cats — кошки, dogs — собаки).
Тип переменной в программе на C++ определяется явно при её объ
явлении. Мы будем использовать следующие основные типы данных:
2 Программирование на языке C++
94
Диалоговые программы
Сумма чисел
Сложить два заранее известных числа и вывести сумму на экран мож
но так:
cout « 12345 + 67890;
или так:
int numl = 12345, num2 = 67890;
cout << numl + num2;
Заметьте, что здесь в первой строке объявлены сразу две перемен
ные: numl и num2. Переменным присвоены начальные значения прямо
при объявлении. Если это не сделано, в переменных находятся слу
чайные данные — «мусор» и использовать эти значения бессмысленно
(и даже опасно — это может привести к серьёзной ошибке!).
Теперь напишем программу, которая складывает два числа, введён
ных с клавиатуры (вспомните, как мы делали это в языке Python).
Программа на C++ выглядит так:
int numl, num2, sum;
cin >> numl >> num2;
sum = numl + num2;
cout << sum;
Здесь и далее мы будем для экономии места писать только содержа
тельную часть основной программы.
В отличие от языка Python числа можно вводить по-разному: в од
ной строке через пробел, по одному в каждой строке и даже пропус
кая несколько строк между числами.
Теперь добавим приглашение к вводу и оформим вывод результата,
чтобы было понятно, что делает программа:
int numl, пшп2, sum;
cout << "Give me two numbers: ";
cin >> numl >> num2;
sum = numl + num2;
cout << numl << "+" << num2 << "=" << sum;
В этой задаче можно было обойтись и без переменной sum, потому
что выполнять вычисления можно прямо при выводе ответа на экран:
cout << numl << "+" << num2 << "=" << numl+num2;
Программа вычислит значение выражения numl+num2 и передаст
его в поток вывода. Однако если значение суммы понадобится далее,
лучше сохранить его в переменной, а потом везде использовать эту
переменную, не вычисляя результат заново.
95
2 Программирование на языке C++
Выводы
• Переменные в языке C++ нужно объявлять. При объявлении
определяется тип переменной и выделяется память, в которой её
значение размещается до конца своей «жизни».
• В переменную нельзя записывать значение другого типа, не
совместимого с типом переменной.
• Основные типы данных в C++: int — целое число; float —
вещественное число; char — символ; string — символьная стро
ка; bool — логическое значение.
• Тип переменной в C++ нельзя изменить во время работы програм
мы.
• При объявлении переменной лучше сразу задать ей начальное зна
чение. Если начальное значение не задано, в переменной находит
ся «мусор» — неопределённые данные, использовать их бессмыс
ленно и опасно).
Вопросы и задания
1. Чем различаются результаты работы двух операторов?
cout << "Мау!" << "Peace!" << "Cats!";
и
cout << "May!" << endl << "Peace!"
« endl « "Cats!";
2. Что выведет на экран эта программа?
string name = "Bond";
cout << name << ". James " << name <<
cout << endl;
cout << "name" << ". James " << "name" <<
3. Что выведет эта команда при а = 4, Ь = 5?
cout « "а" « "+Ъ" « "=" « а+Ь;
4. Исправьте ошибки в команде вывода:
cout << "с" << "-Ь" << = << sum;
так чтобы при а = 4, Ь = 5 и sum =9 программа вывела: 9-5=4
Интересный сайт
stepik.org/course/363/ — онлайн-курс «Введение в программирование
на C++»
96
Компьютерная графика §16
§16
Компьютерная графика
Ключевые слова:
• окно • цвет контура
• координаты • цвет заливки
• оси координат • код цвета
• пиксель • прозрачный цвет
Библиотека ТХ Library
Писать простые графические программы на C++ не всегда просто. Для
вывода графики требуется с помощью операционной системы создать спе
циальное окно, обеспечить его взаимодействие с пользователем и т. п.
Для того чтобы упростить вход в мир графического программиро
вания, были разработаны специальные библиотеки. На взгляд автора,
наиболее удобна библиотека ТХ Library1*, разработанная И. Р. Дедин-
ским. Для работы с графическими примерами её вначале нужно уста
новить на свой компьютер.
После установки библиотеки на рабочем столе появится «Ярлык для
ТХ», он открывает папку со справочной системой, примерами и самой
библиотекой. Справочная система расположена в файле TXLib Help,
советуем найти там раздел «Простейший пример» и прочитать его.
В разделе «Рисование» приведены описания графических функций биб
лиотеки.
Простейшая графическая программа, использующая эту библиотеку,
состоит всего из нескольких строк:
#include "TXLib.h"
int main()
{
txCreateWindow (800, 600);
}
Первая строка подключает библиотеку ТХ Library — файл TXLib.h,
который был скопирован на ваш компьютер во время установки
библиотеки.
Единственная строка основной программы создаёт окно для вывода
графики. Для этого вызывается команда txCreateWindow, ей переда
ются размеры окна — ширина 800 пикселей и высота 600 пикселей.
Холст — область рисования — заливается чёрным цветом.
Больше никаких команд не выполняется, окно закрывается при
нажатии любой клавиши.
97
2 Программирование на языке C++
Управляем пикселями
В ТХ Library используется стандартная для большинства графических
библиотек система координат: пиксель с координатами (0, 0) находится
в левом верхнем углу холста, ось ОХ направлена вправо вдоль верхней
границы, а ось OY — вниз вдоль левой границы холста (а не вверх,
как в математике!).
Для управления пикселями используется команда txSetPixel (от
английских слов set — установить, pixel — пиксель). Ей нужно пере
дать координаты пикселя и цвет, который мы хотим ему присвоить.
Например, так:
txSetPixel (10, 20, TX_LIGHTGREEN);
или так:
txSetPixel(10, 20, RGB(0,255,128));
98
Компьютерная графика § 16
Линии и фигуры
Цвет линий устанавливается командой txSetColor:
txSetColor( TX_PINK );
Можно вызывать функцию и с двумя аргументами: второй задаёт
толщину линий:
txSetColor ( TX_GREEN, 5 );
Для рисования линий используется команда txLine:
txLine( 10, 20, 100, 150 );
Ей передаются четыре аргумента: сначала координаты первого конца
отрезка, затем — координаты второго конца.
Линии рисуются тем цветом, который был задан до вызова txLine,
поэтому цвет надо задавать заранее, до рисования.
Замкнутые фигуры
Для замкнутых фигур нужно заранее определить не только цвет ли
нии, но и цвет заливки внутренней области. Цвет заливки задаёт ко
манда txSetFillColor (по-английски fill — заполнение, заливка):
txSetFillColor( TX_YELLOW );
После этого все фигуры будут заливаться жёлтым цветом, пока новая
команда txSetFillColor не изменит режим заливки.
Если заливка не нужна, необходимо установить прозрачный цвет
TX_TRANSPARENT:
txSetFillColor( TX_TRANSPARENT );
Нарисовать замкнутую ломаную линию можно с помощью команды
txPolygon:
POINT contour[3] = {{0,0}, {100,100}, {0,50}};
txPolygon ( contour, 3 );
Здесь мы сначала определяем координаты точек, по которым строится
ломаная: координаты каждой точки записываем в фигурных скобках
через запятую, а все пары координат вместе взяты ещё в одну пару
фигурных скобок. У нас получилась группа данных, которая в инфор
матике называется «массив». Имя массива — contour, он состоит из
пар координат — объектов типа POINT, а число 3 в квадратных скоб
ках — это количество точек ломаной линии.
При вызове команды txPolygon мы передаём ей массив точек и его
длину (количество точек). Ломаная автоматически замыкается: послед
няя точка соединяется с первой.
99
2 Программирование на языке C++
Выводы
• Для создания графических программ в этом пособии используется
библиотека ТХ Library.
• Цвет контура фигуры устанавливается с помощью команды
txSetColor.
• Замкнутые контуры (прямоугольник, окружность, замкнутая ло
маная) заливаются тем цветом, который установлен как цвет за
ливки командой txSetFillColor.
Вопросы и задания
1. Используя справочную систему или исходный код функции
txCreateWindow, выясните, какие ещё параметры она может прини
мать и что они означают.
2. Используя справочную систему или исходный код библиотеки
ТХ Library, выясните, можно ли передавать функции txSetPixel ве
щественные (дробные) координаты пикселя. Как она их обрабатывает?
3. Определите красную, зелёную и синюю составляющие цвета
TX_MAGENTA.
4. Выясните, каким цветом выполняется заливка по умолчанию (если
не вызывать команду txSetFillColor).
5. Выясните, как хранится в памяти цвет ТХ_Т RAN SPARENT. Можно ли
задать его с помощью модели RGB?
6. Внимательно прочитайте в справочной системе библиотеки
ТХ Library описание команды txTriangle и примените её. Соот
ветствует ли её действие описанию?
7. Проверьте, что произойдёт, если рисовать за пределами области
холста.
100
Процедуры §17
Интересный сайт
ded32.ru (txlib.ru) — сайт профессиональной проектной работы по
информатике для школьников, там же расположена библиотека
ТХ Library
§17
Процедуры
Ключевые слова:
• подпрограмма аргументы
• процедура параметры
• рефакторинг базовая точка
Длинная программа
Рассмотрим такую программу, которая рисует на экране машинку:
POINT a [4] = {{40, 70}, {65, 55},
{70, 55}, {70, 70} };
POINT b [4] = {{75, 55}, {95, 55},
{110, 70}, {75, 70}};
POINT c [8] = {{20, 95}, {20, 70},
{30, 70}, {60, 50},
{100, 50}, {120 , 70},
{160, 80}, {160 , 95} };
txSetFillColor( TX_LIGHTBLUE );
txPolygon( с, 8 );
txSetFillColor( TX_BLACK );
txPolygon( a, 4 );
txPolygon( b, 4 );
txSetFillColor( TX_GRAY );
txCircle ( 50, 115, 13 );
txCircle ( 120, 95, 13 );
101
2 Программирование на языке C++
txSetFillColor( TX_BLACK );
POINT a[4] = {{40, 70}, {65, 55},
{70, 55}, {70, 70}};
txPolygon( a, 4 );
POINT b[4] = {{75, 55}, {95, 55},
{110, 70}, {75, 70}};
txPolygon( b, 4 );
txSetFillColor( TX_GRAY );
txCircle( 50, 115, 13 );
txCircle( 120, 95, 13 );
В первый блок мы объединили строки, которые используют набор
(массив) точек с, во втором блоке задействованы переменные а и Ь,
в третьем вообще нет переменных.
Теперь попытаемся понять, что делает каждый блок. Сначала мож
но заключить в комментарии все блоки, кроме первого, и запустить
программу. Получится только кузов машины, поэтому делаем вывод:
первый блок рисует кузов. Тем же способом выясняем, что второй
блок рисует окна, а третий — колёса. Значит, ошибку нужно искать в
третьем блоке.
Рефакторинг
Выполним рефакторинг, т. е. сделаем программу более структурной и
понятной, не изменяя результатов её работы. В первую очередь нужно
дать переменным «говорящие» имена.
Набор точек с именем с назовём car Body (по-английски — кузов
машины), а наборы точек а и b — соответственно backWindow (по-
английски — заднее окно) и frontwindow (переднее окно).
102
Процедуры §17
void drawCarBody()
{
POINT carBody[8] = {{20, 95}, {20, 70},
{30, 70}, {60, 50},
{100, 50}, {120, 70},
{160, 80}, {160, 95} };
txSetFillColor( TX_LIGHTBLUE );
txPolygon( carBody, 8 );
}
Слово void (по-английски — пустой) означает, что эта подпрограм
ма не возвращает никакого результата. Такие подпрограммы называют
процедурами.
Круглые скобки после имени служат для того, чтобы передавать
подпрограмме данные (параметры), но в этой процедуре параметров
нет.
Всё тело процедуры взято в фигурные скобки, так же как и основ
ная программа (main).
Аналогично можно выделить ещё одну процедуру: рисование окон.
Назвать её можно, например, drawCarWindows (нарисовать окна маши
ны):
void drawCarWindows()
{
txSetFillColor( TX_BLACK );
103
2 Программирование на языке С++
void drawCarBody()
{
... // команды рисования кузова
}
void drawCarWindows ()
{
... // команды рисования окон
}
void drawCarWheels ()
{
... // команды рисования колёс
}
int main()
{
txCreateWindow( 500, 400 );
drawCarBody();
drawCarWindows();
drawCarWheels () ;
}
Вместо многоточий нужно подставить команды, которые входят в эти
процедуры.
Как и в языке Python, процедура может вызывать другие процеду
ры. Например, можно оформить рисование всей машинки в отдельную
процедуру (для удобства её вызова):
void drawCar()
{
drawCarBody();
drawCarWindows();
drawCarWheels();
}
В этом случае уже не придётся рисовать машинку тремя строка
ми — достаточно будет одного вызова функции drawCar.
Процедуры с параметрами
Пока процедуры в нашей программе неуправляемы — мы не можем
изменить положение машинки на экране, при каждом вызове она ри
суется в том же месте (это довольно скучно!). Чтобы устранить этот
недостаток, нужно передавать в процедуру координаты машинки (точ
нее, её базовой точки), например так:
drawCar( 100, 100 );
Данные, передаваемые в процедуру при вызове, называют аргумен
тами. В процедуре они обозначаются именами и называются пара
метрами:
104
Процедуры §17
}
В отличие от языка Python в C++ перед каждым параметром в заго
ловке функции нужно указать его тип: в нашем случае обе величины
целые: они относятся к типу int.
Значения координат нужно передать в три процедуры, которые ри
суют разные части машинки:
drawCarBody( х, у );
drawCarWindows( х, у );
drawCarWheels( х, у );
В эти три процедуры тоже придётся внести изменения, пересчитав
координаты всех точек через базовую точку.
Выберем в качестве базовой точки левый нижний угол кузова. Как
же пересчитать координаты? Несложно понять, что левый нижний
угол кузова — это первая точка в массиве carBody. Она сейчас имеет
координаты (20, 95), именно их мы обозначаем через (х, у) и будем
считать базовой точкой всей машинки.
Возьмём следующую точку, (20, 70). Её х-координата совпадает с
х-координатой базовой точки, а //-координата (70) на 25 пикселей
меньше, чем //-координата базовой точки. Поэтому для этой точки по
лучаем относительные координаты (относительно базовой точки машин
ки) (х, у-25).
Используя такой подход для всех остальных точек, получаем набор
координат точек для рисования кузова:
POINT carBody[8] = {{х, у}, {х, у-25},
{х+10, у-25}, {х+40, у-45},
{х+80, у-45}, {х+100, у-25},
{х+140, у-15}, {х+140, у}};
Координаты окон и колёс пересчитайте самостоятельно. Стоит толь
ко помнить, что базовая точка (х, у) выбирается для всей машинки,
а не для каждой из трёх частей независимо, иначе эти части будут
неверно размещены на рисунке.
В процедуру drawCar можно добавить и другие параметры, например
цвет кузова. Его нужно передать только в процедуру drawCarBody, а в
остальные процедуры передавать не нужно, так как их работа от цве
та кузова не зависит. Для объявления цвета используется специальный
тип данных COLORREF:
void drawCar( int х, int у, COLORREF color )
{
105
2 Программирование на языке C++
Выводы
• Процедура — это блок кода, имеющий имя и оформленный как
отдельная часть программы. Процедуру можно вызывать из дру
гих частей программы.
• Вызвать процедуру — значит запустить её на исполнение, записав
её имя с круглыми скобками, в которых перечисляются аргумен
ты — данные, передаваемые процедуре.
• Параметры — это данные, которые принимает процедура. В про
цедуре к параметрам можно обращаться по именам. В языке С++
каждый параметр имеет свой тип.
• Рефакторинг — это изменение программы, которое не влияет на
результат её работы, но делает её более понятной для человека и
удобной для внесения изменений.
Вопросы и задания
1. В программу рисования машинки добавьте строки, которые рисуют
двери.
2. Измените программу рисования машинки так, чтобы можно было
рисовать машинки в разных местах окна программы.
3. Доработайте процедуру drawCar так, чтобы можно было изме
нять цвет машинки. С помощью этой процедуры нарисуйте четыре
машинки разных цветов в разных местах холста.
4. Проект. Придумайте своих персонажей (например, героев вашей
будущей компьютерной игры) и напишите процедуру, которая по
зволяет рисовать персонажей в заданном месте холста, изменять их
цвета и т. п.
§18
Обработка целых чисел
Ключевые слова,'.
• арифметические выражения • форматный вывод
• частное • случайные числа
• остаток • зерно
106
Обработка целых чисел §18
Арифметические выражения
Арифметические выражения в C++ строятся по тем же правилам, что
и в других языках программирования. Поэтому мы не будем повто
ряться, а остановимся, прежде всего, на особенностях языка C++ и его
отличиях от Python.
Для возведения в степень в C++ используется не оператор, как в
Python, а функция. Чтобы возвести число х в степень у, нужно под
ключить библиотеку cmath:
#include <cmath>
а затем вызвать функцию pow (от английского power — степень), опре
делённую в этой библиотеке:
cout « pow(x, у);
Так же как и в Python, можно использовать каскадное присваива
ние:
х = у = 3;
Здесь в обе переменные записывается значение 3.
107
2 Программирование на языке C++
Деление и остаток
В языке C++ деление целых чисел выполняется особым образом: ре
зультат деления целого числа на целое число — это всегда целое чис
ло, а остаток при этом отбрасывается. Сам остаток от деления можно
найти с помощью операции %, как и в языке Python. Например, та
кая программа:
cout « 7 / 4 « " " « 7 % 4 « endl;
cout « 4 / 7 « " " « 4 % 7;
выведет
1 3
О 4
Программа, которая выделяет целые минуты и секунды (от 0 до
59) из интервала времени в секундах, выглядит почти так же, как на
языке Python:
108
Обработка целых чисел §18
109
2 Программирование на языке С++
Случайные числа
В стандартную библиотеку языка C++, random, входят функции для
генерации случайных (точнее, псевдослучайных) чисел. Эту библиотеку
нужно подключить командой
#include <random>
Функция rand возвращает случайное целое число на отрезке
[0; RAND_MAX], где RAND_MAX — это константа (постоянная), определён
ная в библиотеке cstdlib. Во многих системах значение RAND MAX
равно 32767. Программа
cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;
выводит три разных больших случайных числа.
Как же получить случайное целое число на заданном отрезке [а; &]?
Самый простой способ — использовать операцию взятия остатка от де
ления. Действительно, остаток от деления какого-то числа на N всегда
находится на отрезке [0; ДГ-1], так что оператор
k = rand () % N;
записывает в переменную к случайное число на этом отрезке. Если
добавить к этой величине значение а, то весь отрезок смещается так,
чтобы его левая граница была в точке а:
k = а + rand () % N;
Это число расположено уже на отрезке [а; а + N - 1]. Для того что
бы отрезок совпал с отрезком [а; &], нужно выбрать N так, чтобы вы
полнялось условие b = а + N - 1. Решив это уравнение относительно N,
находим: N = b - а + 1. Таким образом, нам нужен оператор
k = а + rand () % (Ь-а+1) ;
Если несколько раз запускать программу, использующую функцию
rand, мы увидим, что последовательность случайных чисел получается
всегда одна и те же. Дело в том, что она строится с помощью мате
матической формулы: по предыдущему числу рассчитывается следую
щее, так что вся последовательность полностью определяется началь
ным числом {зерном). А это зерно при каждом запуске программы
по умолчанию устанавливается одно и то же. Сделано это специаль
но, для упрощения отладки, чтобы можно было легко воспроизвести в
программе ошибочную ситуацию.
Изменяет значение зерна функция srand из библиотеки random.
Чтобы зерно каждый раз было разным, можно выбирать в качестве
зерна текущее время, которое возвращает функция time из библиотеки
ctime:
110
Обработка целых чисел §18
#include <random>
# include <ctime>
srand( time(O) );
cout « rand() << endl;
Теперь при каждом запуске мы будем строить новую последователь
ность случайных чисел.
Выводы
• Память для хранения переменных в C++ выделяется при объявле
нии переменных.
• На переменную типа int обычно выделяется 4 байта, она может
принимать значения от -231 до 231-1.
• Переменная типа int64_t занимает 8 байт в памяти.
• Операция деления / для целых чисел всегда даёт в результате
целое число (остаток отбрасывается). Если нужно получить веще
ственный результат, делимое или делитель надо явно преобразо
вать в вещественное число.
• Для взятия остатка от деления используют оператор %.
• Форматный вывод данных выполняется с помощью команд из биб
лиотеки iomanip.
• Случайные числа можно получить с помощью функции rand из
библиотеки random.
Вопросы и задания
1. Выполните следующую программу:
int i = 2147483647;
cout « i;
cout « endl << i+1;
Объясните результаты. Чтобы изучить вопрос более глубоко, найдите
в Интернете информацию о хранении отрицательных чисел в памяти
компьютера.
2. Оцените минимальное и максимальное значения для переменной
типа long long.
3. Исследуйте, как выполняются операции деления и взятия остатка
для отрицательных целых чисел (сравните результаты с работой ин
терпретатора языка Python).
4. Запишите эти операции в сокращённой форме:
а = а + 1;
Ь = (25 + а)*Ь;
с = с — 1;
Ь = b - 3*d;
111
2 Программирование на языке C++
112
Обработка вещественных чисел §19
Интересный сайт
ru.stackoverflow.com — сайт вопросов и ответов для программистов
§19
Обработка вещественных чисел
Ключевые слова'.
• вещественное число • форматный вывод
• научный формат • округление
• мантисса
113
2 Программирование на языке C++
Ввод и вывод
Ввести три вещественных числа из входного потока и записать их в
переменные х, у и z можно так:
float х, у, z;
cin >> х >> у » z;
Первое введённое число попадает в переменную х, второе — в у,
третье — в z. Числа при вводе можно разделять пробелами или сим
волами «новая строка» (нажимая клавишу Enter после ввода числа).
При выводе вещественных значений по умолчанию выводятся 6 зна
чащих цифр. Причём формат вывода — научный или с фиксированной
запятой — тоже выбирается автоматически.
Вывод можно настроить так, как вам нужно, используя специаль
ные средства средства библиотеки ioman ip — манипуляторы, управля
ющие выводом. Сначала эту библиотеку нужно подключить:
#include <iomanip>
Если мы хотим использовать формат с фиксированной запятой (а не
научный), нужно применить команду fixed (по-английски — фиксиро
Обработка вещественных чисел §19
115j
2 Программирование на языке C++
Случайные числа
Случайное вещественное число можно получить с помощью функции
rand из библиотеки random.
Пусть нам нужно случайное вещественное значение на отрезке [а, 5].
Результат работы rand — целое число на отрезке от 0 до RAND_MAX.
Преобразовав его в вещественное число и разделив на RAND_MAX, мы
получим значение на отрезке [0, 1]:
float xRand;
xRand = float( rand() )/RAND_MAX;
Если это значение умножить на W, получается число на отрезке
[О, W]:
xRand = W*float( rand() )/RAND_MAX;
Теперь остаётся сдвинуть начало отрезка так, чтобы он начинался в
точке а:
xRand = а + W*float( rand() )/RAND_MAX;
и выбрать значение W так, чтобы b = а + W. Окончательно
xRand = а + (b-a)*float( rand() )/RAND_MAX;
116
Обработка вещественных чисел §19
Выводы
• Для повышения точности вычислений с вещественными числами
используют переменные типа double (с двойной точностью).
• Вещественные числа можно записывать и выводить на экран в
формате с фиксированной запятой или в научном формате.
• Вычисления с вещественными числами, как правило, выполняют
ся неточно, с погрешностью.
• Для управления выводом вещественных чисел удобно использовать
команды из библиотеки ioman ip — манипуляторы. С их помощью
можно задать формат (с фиксированной запятой или научный),
точность, общее количество знаков для вывода числа.
• Для использования математических функций нужно подключить
библиотеку стаth.
Вопросы и задания
1. Умный Петя заменил во всех своих программах тип вещественных
переменных с float на double. Обсудите достоинства и недостатки
такого решения.
2. Что будет выведено в результате работы следующей программы?
float х = 172.36589012345678;
cout << х << endl;
cout << fixed << setprecision(2) ;
cout << setw(10) << x;
3. Напишите программу, которая возводит значение х в степень у.
С её помощью вычислите 27,25 и З1,5. Постарайтесь заранее (без вы
числений) примерно оценить диапазоны, в которых находится каж
дое из этих значений.
4. Экспериментально определите точность вычисления суммы 0,1 + 0,2
для переменных типа double.
*5. Напишите программу, которая округляет вещественное число до
ближайшего целого, не используя стандартные функции.
6. Напишите программу, которая вводит три числа и вычисляет
их среднее арифметическое и среднее геометрическое (узнайте из
дополнительных источников, что это такое).
7. Напишите программу, которая вычисляет, на какую высоту подни
мется теннисный мячик, брошенный вертикально вверх с заданной
скоростью, если не учитывать сопротивление воздуха. Необходимые
формулы и данные найдите в дополнительных источниках.
8. Напишите программу, которая вводит координаты вершин треуголь
ника и определяет его площадь.
9. Напишите программу, которая вводит координаты вершин тяжёлого
треугольника и определяет координаты его центра тяжести.
117
2 Программирование на языке C++
118
Ветвления §20
§20
Ветвления
Ключевые слова'.
• условный оператор • составной оператор
• полная форма • вложенный условный оператор
• неполная форма • логические переменные
Условный оператор
Ветвления применяют тогда, когда последовательность выполнения ко
манд зависит от исходных данных. Рассмотрим самую простую задачу:
записать в переменную М наибольшее из значений переменных а и Ь.
Условный оператор в языке C++ записывается так:
if ( а > Ь )
М = а;
else
М = Ь;
Отметим отличия от языка Python:
• всё условие после слова if обязательно берётся в скобки, после
него двоеточие не ставится;
• после слова else двоеточие не ставится;
• отступы не влияют на работу программы, но влияют на работу
программиста: делают программу более понятной.
Иногда бывает удобно записывать короткие выполняемые операторы
в той же строке, что и служебные слова if (else):
if ( а > b ) М = а;
else М = b;
До этого момента мы видели условные операторы в полной форме'.
одна часть (после слова if) выполняется, когда условие истинно, вто
рая (после else) — когда условие ложно.
119
2 Программирование на языке C++
120
Ветвления §20
121
2 Программирование на языке C++
Логические переменные
Так же, как и в Python, в C++ есть логические (булевы) перемен
ные, которые могут принимают значения true («истина») или false
(«ложь»). Они относятся к типу bool:
bool b = true;
b = false;
Интересно, что команда
cout << sizeof (bool);
выводит 1, т. e. переменная b занимает целый байт в памяти, хотя
для неё достаточно одного бита. Дело в том, что отдельные биты в па
мяти хранить невозможно — только целые байты, состоящие из вось
ми бит. Это связано с тем, что в памяти персональный адрес имеет
только каждый байт, но не отдельный бит.
В логической переменной можно хранить значение какого-то усло
вия и затем использовать его в условном операторе.
int а;
cin » а;
bool isEven = (а % 2 == 0);
Здесь переменная isEven будет равна true, если введённое значение
переменной а — чётное число, и false — если нечётное. Заметьте, что
переменная isEven будет хранить информацию о чётности значения а
на момент проверки, даже если значение а после этого изменится.
Пусть нужно выяснить, есть ли среди значений переменных а, b и
с хотя бы два равных. Нам нужно проверить равенство в трёх парах:
а и Ь, а и с, b и с. Используем логическую переменную вместо вло
женных условных операторов:
bool found = false; // пока не нашли пару равных
if( а == b ) found = true; // проверяем пару а, b
if( а == с ) found = true; // проверяем пару а, с
if( b == с ) found = true; // проверяем пару Ь, с
Первые две строки можно заменить одной:
bool found = (а == b);
которая записывает в переменную found значение true, если значения
а и b равны.
Теперь логическую переменную можно использовать вместо условия
в условном операторе:
if( found )
cout << "Нашли равные!";
else
cout << "Равных нет.";
122
Ветвления §20
Сложные условия
Сложные условия в языке C++ строятся из простых условий (отноше
ний) с помощью логических операций И, ИЛИ и НЕ. Этих операций
достаточно, чтобы построить любое условие, поэтому они называются
базовыми или базисными.
Операция И в C++ записывается как &&, операция ИЛИ — как | |,
а операция «НЕ» — как !. Однако стандарт языка разрешает использо
вать для этих операций и другие, более удобные обозначения: and, or
и not (такие же, как и в Python).
Проверим, является ли значение а двузначным числом. Для этого
нужно, чтобы одновременно были выполнены два условия: а больше,
чем 9, и меньше, чем 100. Используем операцию И:
if (9 < a and а < 100)
cout << "О, двузначное число!";
else
cout << "Ну вот. Не двузначное число.";
Можно было поступить иначе: число не двузначное, если оно мень
ше 10 или больше 99. Тут уже нужна операция ИЛИ — выполнение
одного из двух условий:
if (а < 10 or а>99)
cout << "Снова не двузначное число... :(";
else
cout << "Наконец-то двузначное число!";
Какой же из этих двух вариантов выбрать? Всегда выбирайте тот,
который понятнее для вас, который легче прочесть, в котором меньше
шансов сделать ошибку.
Операция НЕ применяется тогда, когда легко построить обратное
условие. Допустим, нужно вывести сообщение, если точка не попала
внутрь заштрихованного треугольника (рис. 2.1).
123
2 Программирование на языке C++
}
Если а = 0, то первое из двух условий ложно, и поэтому всё усло
вие тоже ложно, независимо от истинности второго условия. В этом
случае второе условие не будет проверяться. Заметим, что здесь такую
проверку делать нельзя: произойдёт деление на ноль и программа ава
рийно завершится.
124
Ветвления §20
}
Поэтому при ненулевом значении а проверка условия Ь # 0 не
выполняется.
Пример
Абоненты телефонной станции по сниженному тарифу оплачивают все
звонки в выходные дни, а также в рабочие дни в вечернее и ночное
время (с 1800 до 700).
В переменной day записан номер дня (1 — понедельник, 7 — воск
ресенье), а в переменной hour — время (в часах), когда был сде
лан звонок. На телефонной станции нужно определить, какой тариф
использовать — обычный или сниженный.
В этой задаче достаточно сложное условие, и для того чтобы сделать
программу более понятной, имеет смысл разбить его на части и ввести
логические переменные.
Пусть логическая переменная is Holiday принимает значение true,
если это выходной день (т. е. значение переменной day равно 6 или 7):
bool isHoliday = (day > 5);
Введём вторую логическую переменную: nightHour, которая при
нимает значение true, если время звонка — вечернее или ночное, то
есть значение переменной hour больше или равно 18 (вечер) или мень
ше или равно 6 (раннее утро):
bool nightHour = (hour >= 18 or hour <= 6) ;
Теперь можно записать нужное условие:
if ( isHoliday or (not isHoliday and nightHour) )
cout « "Сниженный тариф!";
else
cout << "Поздравляем! У вас полный тариф.";
Это условие можно ещё упростить. Ведь вечером и ночью в
выходные дни тоже действует сниженный тариф, поэтому условие not
isHoliday можно не писать:
if( isHoliday or nightHour )
cout « "Извините, сниженный тариф!";
else
cout << "Наконец-то! Полный тариф.";
В таком виде программа читается значительно легче, чем если бы мы
написали все три условия после if в виде одного сложного условия.
125
Программирование на языке C++
Выводы
• Условие в условном операторе if-else всегда записывается в
круглых скобках.
• Если при истинности (или ложности) условия нужно выполнить
несколько операторов, они объединяются в составной оператор
(блок) с помощью фигурных скобок.
• В обе ветви условного оператора можно вставлять любые операто
ры, в том числе и другие (вложенные) условные операторы.
• В логической переменной можно хранить логические значения:
true (истина) или false (ложь).
• Простые условия (отношения) в сложном условии не обязательно
брать в скобки.
• Операции И, ИЛИ и НЕ в сложных условиях обозначаются and,
or и not соответственно.
Вопросы и задания
1. Напишите программу, которая вводит три целых числа, записывает
их в переменные а, Ь и с и переставляет значения переменных в
памяти так, чтобы оператор
cout << а << " " « Ъ << " " « с;
всегда выводил их в порядке возрастания (неубывания).
2. Программист написал программу для выбора наименьшего из двух
чисел так:
if (а < b) min = а;
if (b < a) min = Ъ;
В каких случаях эта программа будет работать неправильно? Запи
шите программу правильно, используя один условный оператор в
полной форме.
3. Определите, результат какой математической операции выводит на
экран эта программа:
if (х < 0)
cout « -х;
else
cout << х;
4. Определите, чему будет равно значение переменной х после выпол
нения этого фрагмента программы:
int х = 5, у = 2;
if (х < у)
у = х + 2;
х += у;
Проверьте свой ответ с помощью программы, объясните результат.
126
Ветвления §
128
Циклы §21
§21
Циклы
Ключевые слова’.
• цикл с предусловием • цикл по переменной
• цикл с постусловием
Цикл с предусловием
Изучая язык Python, мы познакомились с двумя видами циклов:
циклами с условием и циклами по переменной. Причём в циклах с
условием в Python условие проверяется при входе в цикл, такой цикл
называется циклом с предусловием (т. е. с предварительной проверкой
условия).
Цикл с предусловием есть и в языке C++. Например, вывести 10
раз слово «crocodile» можно с помощью такого цикла:
int count = 0;
while( count < 10 ){ // заголовок цикла
cout « "crocodile" << endl;
count ++;
}
Здесь переменная count — это счётчик повторений цикла. Условие по
сле слова while обязательно заключается в скобки.
129
Программирование на языке C++
Циклы с постусловием
Цикл, в котором проверка условия выполняется в конце очередной
итерации (перед выполнением следующей), называется циклом с пост
условием. Общая форма такого цикла:
do {
}
while(условие);
Тело цикла, обозначенное многоточием, будет выполняться многократ
но, пока условие в скобках после слова while остаётся истинным.
У такого цикла есть важная особенность: поскольку условие прове
ряется после очередной итерации, цикл всегда выполняется хотя бы
один раз. Это может быть нужно, например, при вводе данных с про
веркой правильности ввода.
Пусть требуется ввести год рождения человека, причём допустимыми
будем считать значения от 1900 до 2018 включительно. Фрагмент про
граммы, в котором вводится год рождения с проверкой, выглядит так:
int yearBirth;
bool isVaiid;
do {
cout << "Введите год рождения: ";
cin >> yearBirth;
isValid = (1900 <= yearBirth and
yearBirth <= 2018);
if ( not isValid )
cout « "Неверный год рождения! Ай-ай-ай!"
« endl;
}
while( not isValid );
Переменная yearBirth используется для хранения года рождения,
а логическая переменная isValid принимает значение true (истина),
если введено правильное значение. Если введённое значение неверно,
эта переменная становится равной false, и выводится сообщение об
Циклы
}
Тело цикла, обозначенное многоточием, — такое же, как и в предыду
щем варианте программы.
Для того чтобы цикл выполнился в первый раз, нам обязательно
надо сделать так, чтобы при входе в цикл условие not isValid было
истинно. Для этого значение переменной isValid должно быть равно
false, мы присвоили его при объявлении переменной. Программист
может легко забыть о том, что надо записать такое начальное значе
ние, и тогда цикл сработает неверно.
Ещё один вариант решения этой задачи — бесконечный цикл с
досрочным выходом:
while( true ) {
cout << "Введите год рождения:
cin >> yearBirth;
isValid = (1900 <= yearBirth and
yearBirth <= 2018);
if ( isValid ) break;
cout << "Неверный год рождения! Ай-ай-ай!"
<< endl;
}
Условие цикла true — это всегда истинное условие. Поэтому выйти
из такого цикла можно только с помощью специального оператора,
который, как и в языке Python, называется break. Как только вво
дится правильное значение, переменная isValid принимает значение
true, и происходит выход из цикла (этот оператор выделен в програм
ме фоном).
В языке C++ любое значение, отличное от false, 0 и специальной
величины NULL, воспринимается как истинное условие. Поэтому часто
используют такую запись бесконечного цикла:
while ( 1 ) {
131
Программирование на языке C++
132
Циклы
Циклы по переменной
Циклы по переменной в языке C++ так же, как в Python, начинают
ся со служебного слова for. Например, чтобы 10 раз вывести слово
«hippo», можно использовать такой цикл:
for( int k=0; k<10; k++ )
cout « "hippo" << endl;
Здесь переменная цикла — это целая переменная к, она объявляет
ся прямо в заголовке цикла for.
Круглые скобки после слова for содержат три части, разделённые
точками с запятой (а не запятыми!). Первая часть (int k=0) выпол
няется один раз до входа в цикл: в переменную к записывается на
чальное значение 0. Вторая часть (к<10) — это условие выполнения
цикла; цикл заканчивает работу, как только это условие станет лож
ным. Третья часть (к++) выполняется каждый раз в конце очередного
повторения тела цикла. Таким образом, в нашем цикле переменная к
с каждым повторением тела цикла увеличивается на единицу и после
довательно «проходит» все целые значения от 0 до 9.
После завершения работы цикла переменная к, объявленная в заго
ловке цикла, не определена, обращение к ней приведёт к ошибке. Её
область видимости — только команда for.
Циклы по переменной удобно использовать для перебора вариан
тов. Найдём все двузначные автоморфные числа. Автоморфным назы
вается число, запись которого — это последние цифры его квадрата
(например, 252 = 625).
133
2 Программирование на языке C++
Выводы
• В языке C++ есть два вида циклов с условием — циклы с пред
условием и циклы с постусловием.
• В цикле с предусловием проверка условия выполняется в начале
очередной итерации цикла, в цикле с постусловием — в конце
очередной итерации.
• Цикл с постусловием всегда выполняется хотя бы один раз, цикл
с предусловием может не выполниться ни разу.
• Для досрочного выхода из цикла используют оператор break.
• В языке C++ есть цикл по переменной. В заголовке такого цик
ла (цикла for) задаются: начальное значение переменной цикла,
условие продолжения цикла и правило изменения переменной
цикла.
• Переменная цикла в C++ может быть как целой, так и вещест
венной.
134
______________________________________________ Ц—' д
Вопросы и задания
1. Найдите и исправьте ошибку в программе.
к = 0;
while( к < 10 )
cout << "crocodile";
к++;
2. Верны ли следующие утверждения для языка C++:
а) любой цикл for можно переписать как цикл с условием;
б) любой цикл с предусловием можно переписать как цикл for?
Если вы отвечаете на какой-то вопрос «да», предложите алгоритм
такого преобразования.
3. Используя дополнительные источники, выясните, что означают
специальные символы ' \t' и ' \п'.
4. Напишите программу, которая вводит с клавиатуры вещественное
число и вычисляет его квадратный корень с помощью формулы
Герона. Сравните результат ваших расчётов и результат стандарт
ной функции sqrt из библиотеки cmath.
5. Напишите программу, которая выводит на экран все трёхзначные
автоморфные числа.
6. Натуральное число называется числом Армстронга, если сум
ма цифр числа, возведённых в N-ю степень, где N — количество
цифр в числе, равна самому числу. Например, 153 = I3 + 53 + З3.
Найдите все трёхзначные числа Армстронга.
7. Ряд чисел Фибоначчи задается следующим образом: первые два чис
ла равны 1 (F1 = F2 = 1), а каждое следующее равно сумме двух пре
дыдущих: Fn = Fn_x + Fn_2. Напишите программу, которая вводит на
туральное число N и выводит на экран первые N чисел Фибоначчи.
**8. Напишите программу, которая определяет, сколько чисел из вход
ной последовательности натуральных чисел являются числами Фи
боначчи. Программа получает на вход количество чисел в последо
вательности, а затем — сами числа.
*9. Напишите программу, которая в последовательности натуральных
чисел определяет количество простых чисел. Программа получает
на вход количество чисел в последовательности, а затем — сами
числа.
10. Используя библиотеку ТХ Library, выполните задания 5-9 к § 13
на языке C++.
11. Напишите программу, которая в квадрате со стороной 400 пиксе
лей перекрашивает в случайные цвета 500 пикселей со случайны
ми координатами. Подсчитайте, сколько точек попадёт в каждый
из четырёх квадратов со стороной 200 пикселей, на которые мож
но разбить исходный квадрат.
Интересный сайт
cyberforum.ru — форум программистов и специалистов по компью
терной технике
135
2 Программирование на языке C++
§22
Анимация
Ключевые слова'.
• анимация • пауза
• процедура • нажатие клавиши
Принципы анимации
Вы уже знаете, что анимация основана на быстром изменении картин
ки на экране: если изображение меняется чаще, чем 16 раз в секун
ду, человеческий глаз не успевает реагировать на каждое изменение и
видит плавное движение.
Используя библиотеку ТХ Library, мы будем строить анимацию са
мостоятельно, программируя все её этапы.
Рассмотрим уже известную задачу: движение шарика (или любой
другой фигуры) на фоне. Пусть шарик расположен в точке холста с
координатами (х, у), и нужно переместить его в точку с координатами
(х + 5, у). Для этого нужно:
1) «стереть» шарик, т. е. восстановить фон в том месте, где сейчас
нарисован шарик;
2) изменить положение шарика (его координаты на холсте);
3) запомнить участок фона, который будет испорчен при выводе ша
рика в новом месте;
4) вывести изображение шарика поверх фона.
Мы будем использовать одноцветный фон, поэтому запоминать изо
бражение, перекрытое шариком, нам не нужно. Чтобы стереть шарик,
достаточно залить это место цветом фона.
В начале программы нужно подключить библиотеку ТХ Library:
#include "TXLib.h"
Рисуем шарик
Шарик будем изображать в виде круга жёлтого цвета, контур сдела
ем прозрачным. Базовой точкой, определяющей текущие координа
ты. шарика (т. е. координаты в данный момент времени), удобно счи
тать центр окружности. Обозначим его координаты через xCenter и
yCenter, а радиус шарика — через R.
Рисование шарика состоит из трёх команд:
txSetColor( TX_TRANSPARENT );
txSetFillColor( TX_YELLOW );
txCircle( xCenter, yCenter, R );
В первой команде выбираем прозрачный цвет контура, во второй —
жёлтый цвет заливки, с помощью третьей рисуем круг. Лучше офор
136
Анимация §22
Начальное положение
Сначала создаём графическое окно:
txCreateWindow ( 400, 400 );
Рисуем фон — синий квадрат:
txSetFillColor( TX_BLUE );
txRectangle( 0, 0, 400, 400 );
Шарик будем двигать слева направо по середине холста на уровне
137
2 Программирование на языке C++
Анимация движения
Анимация может быть построена в виде такого цикла:
while( /*шарик не вышел за границу холста*/ ) {
// рисуем шарик
// пауза
// стираем шарик
// двигаем шарик (меняем координаты)
}
Пока такая программа работать не будет: все действия и условие в
заголовке цикла записаны в виде комментариев. Такая запись назы
вается псевдокодом, он помогает понять и построить логику програм
мы. Но нам нужно переписать псевдокод на языке C++.
Обратите внимание, что между рисованием и стиранием нужно сде
лать небольшую паузу (например, длиной в 20 миллисекунд). Если па
узы не будет, мы не сможем увидеть движение — шарик проскочит
всю ширину холста раньше, чем мы успеем что-то заметить.
Движение шарика сводится к тому, что мы меняем его координа
ты — переменные xCenter и yCenter. Шарик во время изменения ко
ординат не должен быть виден, иначе мы будем стирать его не в том
месте, гда он был нарисован, и за ним на холсте останется след.
Для рисования шарика будем вызывать процедуру drawBall, а
для стирания — процедуру clearBall. Паузу нужно сделать с помо
щью функции txSleep (от английского sleep — спать) из библиотеки
ТХ Library, она принимает один параметр - время паузы в милли
секундах.
Условие «шарик не вышел за границу холста» выразим через его
х-координату: пока она не больше, чем 40 0 — R, шарик находится в
границах синего квадрата. В результате получаем такой цикл:
while( xCenter <= 400-R ) {
drawBall( xCenter, yCenter, R ) ;
txSleep( 20 );
clearBall( xCenter, yCenter, R ) ;
xCenter += 5;
}
Последняя строка в теле цикла говорит о том, что за одну итерацию
цикла шарик смещается на 5 пикселей вправо.
Собрать всю программу вы можете самостоятельно.
138
Анимация §22
Выводы
• Анимация в программе — это многократное повторение следую
щих действий:
1) рисование объекта;
2) пауза (чтобы увидеть объект);
3) стирание объекта;
4) изменение координат (перемещение объекта).
• Проверить нажатие клавиши можно с помощью функции
GetAsyncKeyState: она возвращает ненулевое значение, если кла
виша с указанным кодом нажата.
Вопросы и задания
1. Можно ли переставить команду txSleep в программе анимации в
другое место в теле цикла? Ответ обоснуйте.
2. Как можно изменить программу анимации, чтобы ускорить движе
ние шарика? Предложите два варианта решения этой задачи и обсу
дите ограничения каждого из них.
3. Как завершится выполнение программы анимации, если оператор
выхода по нажатию клавиши Escape поместить между вызовами
процедур drawBall и clearBall?
13
Программирование на языке C++
140
ОГЛАВЛЕНИЕ
Предисловие.................................................................................... 3
Глава 1. Программирование на языке Python................................. 5
§ 1. Первые программы............................................................................... 5
Что такое программа?............................................................................................ 5
Самая простая программа......................................................................................6
Вывод текста на экран............................................................................................ 7
Выводы......................................................................................................................... 8
§2. Диалоговые программы...................................................................... 9
Как тебя зовут?......................................................................................................... 9
Переменные.............................................................................................................. 10
Сумма чисел............................................................................................................ 12
Ввод данных в одной строке............................................................................... 14
Выводы....................................................................................................................... 15
§3. Компьютерная графика..................................................................... 16
Что такое компьютерная графика?.................................................................. 16
Графика в Python................................................................................................... 17
Система координат................................................................................................. 17
Управляем пикселями.......................................................................................... 18
Рисуем линии.......................................................................................................... 19
Прямоугольники ..................................................................................................... 20
Окружность.............................................................................................................. 21
Изменение координат............................................................................................ 21
Вы воды................................................................................................................... 22
§4 . Процедуры............................................................................................. 24
Зачем нужны процедуры?....................................................................................24
Процедура вызывает процедуру........................................................................ 26
Процедуры с параметрами................................................................................... 26
Выводы....................................................................................................................... 28
§5 . Обработка целых чисел..................................................................... 29
Арифметические выражения............................................................................... 29
Деление нацело....................................................................................................... 31
Вывод данных на экран........................................................................................ 32
Выводы....................................................................................................................... 33
§6 . Обработка вещественных чисел......................................................35
Что такое вещественное число?.........................................................................35
Ввод и вывод............................................................................................................ 37
Операции с вещественными числами................................................................ 38
Выводы.......................................................................................................................39
141
Оглавление
142
Оглавление
143
Оглавление
144
FFFFFF