Анализ алгоритмов. Этапы решения задачи на компьютере.
10 класс, углублённый уровень — занятие первое.
Сегодня мы напишем пять программ. Точнее — одну, пять раз.
После ОГЭ — довольно много.
if, else.for, while — задание 16.Дана программа и данные.
Что она выведет?
Дана программа и нужный результат.
Какие данные подать, чтобы он получился?
Первый вопрос вы решали всегда. Второй — новый, и он сложнее: ответов может быть много, ни одного, или ровно один.
a = input()
b = input()
print(a + b)
На вход подаются две строки: 12 и 34.
46
1234
input() всегда возвращает строку. Для строк
«плюс» — это склейка, а не сложение. Чтобы получить 46, нужно
int(input()).
int(input()) — и рука привыкла, а голова нет.x = int(input())
if x % 7 == 0:
print("Да")
else:
print("Нет")
Назовите такое x от 50 до 60, чтобы вывелось «Да».
56 — единственное. 49 меньше пятидесяти, 63 больше шестидесяти.
Обратите внимание: чтобы ответить, программу не нужно запускать. Нужно понять, что она делает. Это и называется анализом алгоритма.
Пять шагов. Программирование — только четвёртый из них.
1. Постановка задачи. Что дано, что требуется, в каком виде. «Посчитать доставку» — это ещё не постановка.
2. Модель. Какими величинами описать задачу: километры, килограммы, час — числа; тариф — формула.
3. Алгоритм. Порядок действий. На бумаге, словами или формулой — без Python.
4. Программа. Запись алгоритма на языке программирования.
5. Отладка и анализ. Проверка там, где ответ известен заранее, в том числе на крайних данных. Программа работает — но всегда ли?
| Инструмент | Что делает |
|---|---|
| Транслятор | переводит вашу программу в понятное машине. Бывает двух видов |
| — компилятор | переводит всю программу заранее, целиком (C++, Pascal) |
| — интерпретатор | переводит и сразу выполняет, строка за строкой. Так работает Python |
| Отладчик | останавливает программу в нужном месте и показывает значения переменных |
| Профилировщик | измеряет, сколько времени заняла каждая часть. Нужен, когда программа работает, но медленно |
Отладчик у вас уже стоит — он встроен в IDLE. Разберём его на следующих двух слайдах: сегодня он понадобится.
Отладчик живёт в главном окне IDLE — том, где приглашение
>>>. Не в окне с программой.
1. В главном окне: меню
Debug → Debugger. Откроется окошко Debug Control,
а в Shell появится строка [DEBUG ON].
2. Поставьте в Debug Control галочки
Locals и Globals — иначе значений переменных
видно не будет.
3. Переходите в окно с программой и жмите
F5, как обычно. Программа остановится на первой
строке и будет ждать вас.
Debug → Debugger
ещё раз. Пока отладчик включён, каждый запуск идёт по шагам —
забыв выключить, вы решите, что «программа перестала работать».| Кнопка | Что делает |
|---|---|
| Step | выполнить одну строку и снова остановиться |
| Over | то же, но не заходя внутрь функции |
| Out | доработать текущую функцию и встать после выхода из неё |
| Go | бежать дальше — до точки останова или до конца |
| Quit | прервать программу |
Главное — не кнопки, а список Locals под ними: там живые значения всех переменных прямо сейчас. Нажали Step — значения обновились.
input(), программа ждёт
строку там.В окне с программой щёлкните по нужной строке правой кнопкой →
Set Breakpoint. Строка станет жёлтой.
Теперь Go домчит программу прямо до этой строки и
остановится перед её выполнением. Убрать — правой кнопкой →
Clear Breakpoint.
h = int(input())
cost = 330
if 22 <= h <= 6: <- сюда точку останова
cost = cost * 1.4
print(cost)
Введите час 23 и нажмите Go. Программа встанет на строке
if. В Locals видно: h = 23 — час
действительно ночной.
Жмём Step. И программа перескакивает сразу на
print, минуя умножение. Значит условие оказалось ложным —
при том, что h правильный.
km = input() # строка "10"
km = int(input()) # целое 10
kg = float(input()) # дробное 3.5
А если два числа в одной строке — 10 3.5?
km, kg = input().split()
km = int(km)
kg = float(kg)
split() режет строку по пробелам и отдаёт части.
Каждую всё равно нужно превратить в число.
print(135 / 60) 2.25
print(135 // 60) 2
print(135 % 60) 15
// — сколько целых раз влезло. % — что
осталось. Вместе они переводят 135 минут в «2 ч 15 мин».
/ даёт дробное
число всегда. print(10 / 5) напечатает
2.0, а не 2.cost = 330
print(f"Стоимость: {cost:.2f} руб.") Стоимость: 330.00 руб.
:.2f — ровно два знака после точки. Недостающие нули
дописываются, лишние округляются. Без него получится
330 или 330.0 — и это будет другой ответ.
print(1, 2, sep="-", end="")
print(3) 1-23
sep ставится между значениями, end — в
конце вместо перевода строки.
Ночной тариф действует с 22:00 до 05:59. Час хранится в h.
if 22 <= h <= 6:
if h >= 22 or h < 6:
Не бывает числа, которое одновременно не меньше 22 и не больше 6. Левая запись всегда ложна — программа запустится, ошибок не выдаст, ночного тарифа просто не будет.
| Подача курьера | 150 руб. |
| За каждый километр | 12 руб. |
| За каждый килограмм | 20 руб. |
| Ночью, с 22:00 до 05:59 | вся сумма × 1,4 |
| Если вышло меньше 200 руб. | доставка стоит 200 руб. |
Пять программ, и каждая следующая дорастает из предыдущей. Последняя — обратная: «на сколько километров хватит тысячи рублей?»
zadanie1.py … zadanie5.py.Проверка.bat в общей
папке — откроется окно. Оно прогоняет каждую программу на семи наборах
данных и говорит, где сломалось.| Сдано заданий | 4 | 3 | 2 |
|---|---|---|---|
| Отметка | 5 | 4 | 3 |
Попыток сколько угодно: оболочка не «ставит двойку», а показывает, на каких данных программа ошиблась. Исправил — запустил снова.
Открывайте практикум из общей папки.
И помните про input() без приглашения:
вывод вашей программы читает машина.