Вы находитесь на странице: 1из 16

Programming

Languages

Лабораторная работа #06


Базовый синтаксис языка Python.
Условные конструкции.
Разветвляющиеся алгоритмы

LEARN. GROW. SUCCEED.


® 2020-2021. Department: <Software of Information Systems and Technologies>
Faculty of Information Technology and Robotics
Belarusian National Technical University
by Viktor Ivanchenko / ivanvikvik@bntu.by / Minsk
Python Basic Syntax. Conditional Statements. Branching Algorithms

ЛАБОРАТОРНАЯ РАБОТА #06


Базовый синтаксис языка Python.
Условные конструкции.
Разветвляющиеся алгоритмы
Цель работы
Изучить и практически закрепить применение условных конструкций языка Py-
thon на примере разработки простейших интерактивных консольных приложе-
ний с использование разветвляющихся алгоритмов.

Общее задание
Разработать интерактивную программу «Quadric Equation» («Квадратное урав-
нение») для решения квадратных уравнений вида: 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0. Программа
должна запрашивать у пользователя соответствующие параметры a, b и с и, в
зависимости от вычисленного дискриминанта D, выдавать соответствующий
результат. В случае отрицательного дискриминанта программа должна выво-
дить сообщение о том, что действительных корней нет.

Индивидуальное задание
Согласно своему варианту необходимо реализовать на языке Python задания,
которые были даны на лабораторной работе «Разветвляющиеся алго-
ритмы» по параллельной специализированной дисциплине «Основы алго-
ритмизации и программирования» за первый семестр первого курса обучения.

Дополнительное задание
1) Напишите программу, которая бы эмулировала игру «Dice» (игра в кости). Суть
игры заключается в броске двух шестигранных кубиков (костей) и подсчёта об-

1 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

щей суммы очков, которые выпали на первой и второй костей. Для генериро-
вания случайного значения на костях воспользуйтесь функциями из стандарт-
ного модуля random.

2) Напишите программу – «Сake Simulator» with a "surprise" (симулятор пирожков


с «сюрпризом»). Программа должна выводить пирожок и один из пяти (можно
больше) различных «сюрпризов», который бы выбирался случайным образом.

3) Напишите программу «Mood Sensor» (эмулировать датчика настроения), кото-


рая «залазит» в душу пользователя и определяет его настроение в текущий мо-
мент времени. Приложение будет генерировать случайное число, в зависимо-
сти от значения которого на экран выводится одно из псевдографических «лиц»,
которое и будет отображать настроение пользователя.

Before you start, always think about users.


This is the only way to create a truly high-quality product!

Требования к выполнению заданий


1) Необходимо спроектировать блок-схемы разветвляющих алгоритмов решений
соответствующих заданий согласно своему варианту (варианты назначаются
преподавателем) и на базе данных алгоритмов разработать интерактивные
консольные приложения.
2) Если логически не подразумевается или в заданиях иного не указано, то вход-
ными и выходными данными являются вещественные числа (числа с плаваю-
щей запятой).

2 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

3) Все задания необходимо решать используя только базовые операции (простые


операторы), определённые над числами в языке Python, встроенные математи-
ческие функции и условные конструкции (т.е. не нужно использовать циклы,
списки и другие контейнеры, строковые данные и операции над ними и т.д.).
4) Рекомендуется избегать использования глобальных переменных при написа-
нии основной логики приложения.
5) Все программы должны быть разбиты на отдельные функции. При выполнении
заданий необходимо по максимуму пытаться разрабатывать универсальный,
масштабируемый, легко поддерживаемый и читаемый код.
6) Также рекомендуется придерживаться Single Responsibility Principle, SRP
(принципа единственной ответственности) – постарайтесь вынести основную
бизнес-логику задания в отдельную функцию (т.е. архитектура приложения
должна минимум состоять из нескольких функций).
7) В соответствующих компонентах бизнес-логики необходимо предусмотреть
«защиту от дурака».
8) При проверки работоспособности приложений необходимо проверить все те-
стовые случаи.
9) Программы должны обязательно быть снабжены комментариями на англий-
ском языке, в которых необходимо указать краткое предназначение программ,
номер лабораторной работы и её название, версию программы, ФИО разра-
ботчика, название бригады (если есть), номер группы и дату разработки. Исход-
ный текст программного кода и демонстрационной программы рекомендуется
также снабжать поясняющими краткими комментариями.
10) Программы должны быть снабжены дружелюбным и интуитивно понятным
интерфейсом для взаимодействия с пользователем. Интерфейс программ дол-
жен быть на английском языке.
11) При разработке программ придерживайтесь соглашений по написанию кода
на Python (Python Code Convention).

Best of LUCK with it, and remember to HAVE FUN while you’re learning :)
Victor Ivanchenko

3 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Что нужно запомнить (краткие тезисы)


1. В языке Python 3 (в отличии от других С-подобных языках программирования:
С/C++/C# JavaScript, …) имеется только одна условная конструкция для реали-
зации одной из основных алгоритмических структур организации кода – ветв-
ления. Эта условная конструкция if-elif-else.
2. Отличие операций (простых операторов) от конструкций (сложных операто-
ров) заключается в том, что операции возвращают результат своего выполне-
ния, а конструкции используются для управления ходом выполнения про-
граммы. Следовательно, условная конструкция if-elif-else является управляю-
щей и никогда не может стоять справой стороны оператора присваивания, т.к.
она не возвращает результат.
3. Классическая условная конструкция if-elif-else покрывает в программирова-
нии абсолютно все ветвления (разветвляющиеся алгоритмы) и является одной
из самых распространённых конструкций не только в языке Python, но и в раз-
личных языках программирования.
4. Если необходимо покрыть только одно условие в языке Python, то применяется
сокращённая версия условной конструкции, где используется только ключевое
слово if.
5. Если необходимо покрыть два условия в языке Python, то применяется сокра-
щённая версия условной конструкции, где используется только ключевые
слова if-else.
6. Если необходимо покрыть более двух условий в языке Python, то применяется
полная версия условной конструкции if-elif-else. Данный вид условной кон-
струкции иногда в других C-подобных языках программирования может ча-
стично эмулировать оператор множественного выбора switch-case-default, но
функционал полной условной конструкции if-elif-else гораздо шире оператора
множественного выбора.
7. Согласно синтаксису языка Python любой набор операторов или выражений,
которые должны идти следом за соответствующими ключевыми словами if, elif
или else должны отделяться отступом. Отступ в языке Python показывает при-
надлежность (вложенность) части кода от другого кода или конструкций языка.
8. Отступ лучше всегда делать с помощью клавиши Tab!

4 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

9. В качестве условия в ветках if и elif условной конструкции if-elif-else должно


стоять выражение, результат которого можно привести к значению булевского
типа.
10. Не забываем, что в языке Python 3 для обозначения истинности и ложности
есть два булевских литерала – True и False, а также то, что в языке Python 3 всё,
что не ноль, – будет интерпретироваться языком как истина, т.е. True, в против-
ном случае – ложь, т.е. False. К примеру, число ноль или пустой список (или кор-
теж, или словарь, …) будет восприниматься как False, а любое другое число,
отличное от нуля, или непустой список (кортеж, словарь, …) – как True.

5 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Графическое представление алгоритмов


Для общего представления решения задачи без привязки к конкретному языку
программирования на практике используют блок-схемы. Они позволяют в графиче-
ском виде представить алгоритм решения задачи, который понятен не только раз-
работчику, но даже домохозяйке.

Для графического представления алгоритмов решения задачи использую спе-


циальные унифицированные блоки, каждый из которых несёт в себе определённую
смысловую нагрузку. Кратко каждый из наиболее востребованных блоков описыва-
ется в нижеприведённой таблице.

Таблица 1 – Наиболее часто используемые блоки

# Shape (блок) Description (описание)


Блок начала/окончания выполнения программы
1.

Блок данных – используется для ввода, объявления


и инициализации переменных программы
2.

Блок действия – используется для вычисления лю-


бых выражений программы
3.

Блок вызова процедур или функций – используется


для обозначения вызова пользовательской функции
4. или процедуры, код или реализация которой нахо-
дится в другом файле
Блок условия – задаёт соответствующие условия
5. дальнейшего выбора хода выполнения кода про-
граммы
Блок вывода данных – используется для обозначе-
6. ния выводимых данных или результата работы про-
граммы

6 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Продолжение таблицы 1

Блок соединитель на странице – использу-


ется в случае, если блок-схема алгоритма не
7.
может идти всё время сверху вниз и требу-
ется её перенести на другую часть свобод-
ного места на том же листе
Блок соединитель между страницами– ис-
пользуется в случае, если блок-схема алго-
8. ритма не помещается на одной странице и
одну из её частей нужно перенести на дру-
гую страницу

7 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Пример выполнения общего задания


Задание
Разработать интерактивную программу «Quadric Equation» («Квадратное урав-
нение») для решения квадратных уравнений вида: 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0. Программа
должна запрашивать у пользователя соответствующие параметры a, b и с и, в
зависимости от вычисленного дискриминанта D, выдавать соответствующий
результат. В случае отрицательного дискриминанта программа должна выво-
дить сообщение о том, что действительных корней нет.

Решение
Перед написание основного приложения разработаем алгоритм решения за-
дания.
Вербальное описание алгоритма (словесная последовательность действий) со-
стоит из следующих шагов:
1) вводим соответствующие коэффициенты a, b и c;
2) проверяем правильности ведённых данных, в частности коэффициента a,
который не должен быть равен нулю, иначе, во-первых, у нас получиться не квад-
ратное уравнение и, во-вторых, может произойти деление на ноль. Примем, что
если коэффициент a равен нулю, то осуществляем вывод соответствующего сооб-
щения и переходим к пункту 7;
3) вычисляем дискриминант;
4) если дискриминанта больше нуля, то вычисляем 2 корня и выводим их на
экран, а затем переходим к пункту 7
5) если дискриминанта равен нулю, то вычисляем один корень и выводим его
на экран, а затем переходим к пункту 7
6) если дискриминанта меньше нуля, то выводим сообщение о том, что дей-
ствительных корней нет;
7) завершаем выполнение программы.
Блок схема работы алгоритма решения задачи была построена в Microsoft Of-
fice Visio 2013 и приведена на рисунке 1.
Программа была написана и тестировалась с использованием среды разра-
ботки JetBrains PyCharm Community Edition. Код программы представлен ниже, а те-
стирование всех случаев (условий) выполнения программы – на соответствующих
рисунках 2, 3, 4 и 5.

8 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

1
Start
Блок начала
алгоритма
Блок для ввода данных
2

a, b, c

Блок-действия 3
True False
a != 0

D = b2 – 4ac Блок-ветвления, задающий


условие дальнейшего вы-
полнения программы

5 False
9 False
D>0 D == 0

True True
6 10
True
x1=(-b+sqrt(D))/(2a)
x = -b / (2a)
x2=(-b-sqrt(D))/(2a)

7 11 12 13
«"a" must be
x1, x2 x «not real roots»
nonzero»

8 Блок вывода
Блок окончания End данных
алгоритма

Рисунок 1 – Блок-схема алгоритма решения квадратного уравнения

9 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Исходный код программы решения квадратного уравнения:

# The program solves quadratic equation: ax**2 + bx + c = 0


#
# Laboratory work №6 (basic task)
# Subject theme: Python Basic Syntax. Conditional Statements
# Version: 2.0
# Author: vikvik
# Company: FITR BNTU
# Date: 20.11.2019

import math

def solve_equation(a, b, c):


""" The function solves quadratic equation: ax**2 + bx + c = 0"""
if a != 0:
discriminant = b ** 2 - 4 * a * c

if discriminant > 0:
x1 = (-b + math.sqrt(discriminant)) / (2 * a)
x2 = (-b - math.sqrt(discriminant)) / (2 * a)
msg = "There are two roots of equation: x1 = {}, x2 = {}".format(x1.x2)
elif discriminant == 0:
x = -b / 2 / a
msg = "There is only one root of equation: x = " + str(x)
else:
msg = "There isn't real roots of equation."
else:
msg = "Input Error: First coefficient must be nonzero!"

return msg

# main part of program

print("The program solves quadratic equation: ax**2 + bx + c = 0")

a = float(input("Input a: "))
b = float(input("Input b: "))
c = float(input("Input c: "))

result = solve_equation(a, b, c) Обратите внимание, как приятно


print(result) читать и сопровождать данный
код. Рекомендуется следовать та-
input("\nPress the Enter for exit...")
кому же стилю написания про-
граммного кода

10 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Разберём более подробно вышеприведённый код программы.

# The program solves quadratic equation: ax**2 + bx + c = 0


#
# Laboratory work №6 (basic task)
# Subject theme: Python Basic Syntax. Conditional Statements
# Version: 2.0
# Author: vikvik
Мощный комментарий для описа-
# Company: FITR BNTU
# Date: 20.11.2019 ния предназначения данной про-
граммы и её атрибутов
import math

Подключения пространства имён модуля math, чтобы


пользоваться функциями, описанных в данном модуле

Объявление функции для решения квадратного уравнения. Помните, название функции


должно быть глаголом и говорящим, т.е. подсказывать, для чего она предназначена!!!

def solve_equation(a, b, c):


Объявление формальных параметров функции

""" The function solves quadratic equation: ax**2 + bx + c = 0"""

Комментарий-разработчика для пояснения предназначения функции. Ре-


комендую всегда брать такой комментарий в двойные тройные кавычки.

С помощью условной конструкции if-else реализуем «защиту от дурака»

if a != 0:
Высчитываем дискриминант в случае
верных переданных функции данных

discriminant = b ** 2 - 4 * a * c

С помощью условной конструкции if-elif-else проверяем значение дискриминанта и


направляем программу на выполнения соответствующих действий

if discriminant > 0:
Находим два корня уравнения в случае
положительного дискриминанта

x1 = (-b + math.sqrt(discriminant)) / (2 * a)
x2 = (-b - math.sqrt(discriminant)) / (2 * a)
msg = "There are two roots of equation: x1 = {}, x2 = {}".format(x1, x2)

11 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

elif discriminant == 0:
Находим единственный корень уравнения в
случае, когда дискриминант равен нулю

x = -b / 2 / a
msg = "There is only one root of equation: x = " + str(x)
else:
msg = "There isn't real roots of equation."

Убеждаемся, что действительных корней нет в


данной квадратном уравнении
else:
msg = "Input Error: First coefficient must be nonzero!"

return msg
Возвращаем соответствующее сообщение о
неверных переданных данных

Основная запускаемая часть программы

# main part of program

print("The program solves quadratic equation: ax**2 + bx + c = 0")

a = float(input("Input a: "))
b = float(input("Input b: ")) Ввод пользовательских данных и преоб-
c = float(input("Input c: ")) разования их к вещественному типу

result = solve_equation(a, b, c)

Вызов функции
Объявление промежуточной
переменной, которой будет
присваиваться возвращаемое
функцией значение Вывод соответствующего результата в си-
стемную консоль (терминал) с помощью
встроенной функции print()
print(result)

input("\nPress the Enter for exit...")

Вывод подсказки пользователю, что ему


дальше делать. Не забывайте думать о ко-
нечном пользователе!

Результаты работы программы представлен ниже.

12 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Рисунок 2 – Результат работы программы для решения квадратного уравнения при


положительном дискриминанте

Рисунок 3 – Результат работы программы для решения квадратного уравнения при


дискриминанте равном нулю

Рисунок 4 – Результат работы программы для решения квадратного уравнения при


отрицательном дискриминанте

13 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Рисунок 5 – Результат работы программы для решения квадратного уравнения в


случае, если пользователь ввёл в качестве значения нулевой коэффициент a

14 | We hope you enjoy working with Python!


Python Basic Syntax. Conditional Statements. Branching Algorithms

Контрольные вопросы
1. Перечислите основные фундаментальные конструкции,
которые используются при построении любой
компьютерной программы.
2. Зачем нужно в начале разрабатывать алгоритм решения
задачи и проектировать будущее приложение, а затем лишь преступать к
непосредственному написанию кода программы?
3. Опишите основные элементы блок-схемы для графического предоставления
алгоритма решения задачи?
4. Как в языке Python реализуется механизм истинности-ложности? Может ли
само значение выступать в качестве условия? Какое при этом используется
правило?
5. Опишите синтаксис сокращённой условной конструкции if, которая
используется для исполнения кода при определённом условии. Представьте
примерную блок-схему конструкции.
6. С помощью каких операторов (операций) можно комбинировать в одной
условной конструкции if несколько условий чтобы объединить результат?
Кратенько опишите принцип их действия. Какой механизм оптимизации
применяет интерпретатор Python для эффективного вычисления результата
комбинированных условных выражений?
7. Опишите синтаксис средней условной конструкции if-else, которая
используется для выбора вариантов продолжения выполнения кода при
определённом условии. Представьте примерную блок-схему конструкции.
8. Опишите синтаксис полной условной конструкции if-elif-else, которая
используется для множественного выбора исполнения кода на основе
нескольких условий. Представьте примерную блок-схему конструкции.
9. Чем использование полной условной конструкции if-elif-else будет
отличаться от использования вложенных конструкций if-else в случае
использования их при решении одного и того же алгоритма?
10. Как сгенерировать случайную последовательность чисел с использованием
функций randint(…) и randrange(…)? Чем они отличаются? Какие ещё есть
полезные для вас функции в модуле random?

15 | We hope you enjoy working with Python!