Към съдържанието
wannacode

Смятане

Проблем

Сметката на масата

Поръчал си три кафета по 2,50 € и два кроасана по 1,50 €. Плащаш с банкнота от 20 €. Колко е сметката и колко ресто трябва да получиш?

Наум става. Но касата в кафенето прави такава сметка стотици пъти на ден, с различни цени и количества. Програмата трябва да смята сама.

Идеята

Аритметичните оператори

Смяташ както на хартия: + събира, - изважда, * умножава, / дели. Тези знаци се казват оператори.

coffee = 2.5
croissant = 1.5
total = 3 * coffee + 2 * croissant
change = 20 - total
print(f"Общо: {total} €")
print(f"Ресто: {change} €")
Изход
Общо: 10.5 €
Ресто: 9.5 €

Редът е като в математиката: първо * и /, после + и -. Затова 3 * coffee + 2 * croissant е 7,5 + 3. Ако искаш друг ред, слагаш скоби: (2 + 3) * 4 е 20.

Има и пети оператор, %. За него е следващата идея.

По-точно, за любопитните
  • Операторите с еднакъв приоритет се смятат отляво надясно: 20 - 5 - 3 е 12, а не 18.
  • - пред число го прави отрицателно: -total.
  • При текст + не събира, а долепя, но само текст към текст. Текст + число спира програмата. Това е капанът в следващата карта.

Пробвай

Билети за концерта

Три билета по 8 € и 5 € такса за поръчката.

Какво ще отпечата програмата?

tickets = 3
fee = 5
print("Общо: " + tickets * 8 + fee)
Отговор

Проблем

2,25 часа вместо 2 ч. 15 мин.

Филмът е 135 минути. Искаш да го покажеш като часове и минути: 2 ч. 15 мин. Първият опит:

minutes = 135
hours = minutes / 60
print(f"{hours} ч.")
Изход
2.25 ч.

В Python / дели винаги дробно, дори когато и двете числа са цели: 6 / 3 е 2.0, а 17 / 3 е 5.666666666666667. Тук обаче ти трябват два цели часа и останалите минути. Как се взима само цялата част?

Идеята

Целочислено деление: // и %

// дели и оставя само цялата част: 135 // 60 е 2, а 17 // 3 е 5. Дробната част се отрязва. Това се казва целочислено деление.

Ето го стъпка по стъпка, със сбора на три оценки:

math = 5
physics = 6
english = 6
whole = (math + physics + english) // 3
print(f"Цялата част: {whole}")
Стъпка по стъпка, с думи
  1. Три оценки, всяка в int: 5, 6, 6.
  2. Първо скобите: 5 + 6 + 6 = 17. Сборът също е int.
  3. 17 // 3: колко цели групи по 3 има в 17? 5.
  4. Остатъкът 2 (това е 17 % 3) се отрязва. Резултатът е цялото число 5.
  5. 5 се записва в whole. Резултатът на // от цели числа е int, без .0.
  6. Отпечатва се „Цялата част: 5“. Дробната част (5,67) не е в резултата: за нея е /.

Отрязаното не се губи напълно. Операторът % дава остатъка от делението: 17 % 3 е 2, защото 17 = 5 · 3 + 2.

Двете заедно разделят количество на цели части и остатък. Филмът е 135 минути:

minutes = 135
hours = minutes // 60
rest = minutes % 60
print(f"{hours} ч. {rest} мин.")
Изход
2 ч. 15 мин.

% ще ти трябва често. Число е четно, ако n % 2 е 0. Последната цифра на число е n % 10.

По-точно, за любопитните
  • При отрицателни числа // закръгля надолу, към по-малкото число: -7 // 2 е -4, а не -3, както е в Java и C#. Остатъкът има знака на делителя. % работи и с дробни числа:
print(-7 // 2)
print(-7 % 2)
print(7.5 % 2)
Изход
-4
1
1.5
  • Деление на 0 спира програмата: ZeroDivisionError: division by zero. В Python това важи и за дробните числа: 5.0 / 0 също спира.

Пробвай

Бутилки в каси

В една каса влизат 6 бутилки. Имаш 17.

Какво ще отпечата програмата?

bottles = 17
per_case = 6
print(f"{bottles // per_case} каси")
print(f"{bottles % per_case} остават")
Отговор

Идеята

Превръщане между типове

В Python / вече дели дробно и средният успех излиза веднага. Превръщане трябва в обратната посока: от дробно към цяло.

total = 5 + 6 + 6
average = total / 3
print(average)
print(f"{average:.2f}")
whole = int(9.99)
print(whole)
Изход
5.666666666666667
5.67
9

Превръщането на тип се пише с името на типа: int(9.99) прави int, а float(17) прави 17.0. Това се казва превръщане на тип (cast). int(...) отрязва дробната част: int(9.99) е 9, не 10.

От int към float нищо не се губи и превръщането става само: 10 + 0.5 е float, 10.5. Ако едната страна е float, и // дава float: 17 // 3.0 е 5.0.

По-точно, за любопитните
  • int("25") от урока за входа е същата функция: тя превръща в цяло число и текст, и дробно число.
  • Всеки символ има код, число в таблицата със символите. ord дава кода, а chr прави символ от код:
print(ord("A"))
print(chr(66))
max_int = 2147483647
print(max_int + 1)
Изход
65
B
2147483648
  • В Java и C# int стига до 2 147 483 647 и едно повече „превърта“ до отрицателно число. В Python int няма граница, затова третият ред дава просто 2147483648.

Пробвай

Намери грешката

Сметката за ток е 125 € и се дели между трима съквартиранти. Програмата казва, че всеки дава 41,00 €, а трябва 41,67 €. На кой ред е грешката?

Избери реда с грешката.

Идеята

Съкратени записи: += и -=

Често променяш стойност спрямо самата нея: балансът на картата намалява с всяка покупка, броячът расте с едно. За това има кратки записи:

balance = 20
purchases = 0
balance -= 4.5
purchases += 1
balance -= 3.5
purchases += 1
print(f"{purchases} покупки, остават {balance} €")
Изход
2 покупки, остават 12.0 €
Пишеш Значи
balance -= 4.5 balance = balance - 4.5
total += price total = total + price
x *= 2, x /= 2, x //= 2, x %= 2 същото с *, /, // и %
purchases += 1 purchases = purchases + 1
seats -= 1 seats = seats - 1

В Python няма ++ и --. Броячът расте с += 1.

+= работи и с текст: message += "!" долепя удивителен знак в края.

По-точно, за любопитните

a++ в Python е SyntaxError: invalid syntax. По-коварно е ++a: то не е грешка, а два плюса пред числото, +(+a). Стойността не се променя:

a = 5
++a
print(a)
Изход
5

Ако идваш от друг език, внимавай: броячът си остава същият, а Python не казва нищо.

Идеята

math: корен, степен, закръгляне

Пицария продава пица от 30 см на същата цена като две пици от 20 см. Кое е повече? Площта на кръг е π · r². За степента Python има оператор: **. 15 ** 2 е 225. За π и за корена има готово в модула math: редът import math най-отгоре го зарежда, а после пишеш math., името и в скоби числата. Това са функции, готови парчета код. Свои ще пишеш в модул „Функции“.

import math
big = math.pi * 15 ** 2
small = 2 * math.pi * 10 ** 2
print(f"Една от 30 см: {big:.1f} кв. см")
print(f"Две от 20 см: {small:.1f} кв. см")
print(math.sqrt(144))
print(abs(-7.5))
Изход
Една от 30 см: 706.9 кв. см
Две от 20 см: 628.3 кв. см
12.0
7.5

Една голяма пица е повече от две малки.

Пишеш Какво дава
math.sqrt(x) корен квадратен
x ** n или math.pow(x, n) x на степен n
abs(x) абсолютната стойност (без знака), без math.
round(x) закръгляне до цяло число, без math.
math.pi числото π, 3,14159…

math.sqrt и math.pow връщат float, дори когато резултатът е цяло число (затова 12.0). ** с цели числа дава int: 15 ** 2 е 225. Ако ти трябва int, превърни го: int(math.sqrt(144)).

По-точно, за любопитните
  • Закръгляне на 2,5: езиците дават различно.
print(round(2.5))
print(round(3.5))
print(round(5.678, 2))
Изход
2
4
5.68
  • round закръгля „половинката“ към четното число: 2,5 става 2, а 3,5 става 4. Така е при банките (оттам и името „банково закръгляне“), както и в C#. С втори аргумент закръгляш до толкова знака след запетаята: round(5.678, 2) е 5,68.
  • f-низовете не следват езиковите настройки на компютъра: точката си е точка навсякъде.

Упражнение

Да смята програмата

Реши задачите в редактора си. Всяко число на входа е на отделен ред.

1. Средно на три числа. Прочети три цели числа и отпечатай средното им с два знака след запетаята. Тук ти трябва дробно деление.

Вход
5
6
6
Изход
Средно: 5.67

2. Секунди в часове. Прочети брой секунди и ги раздели на часове, минути и секунди. Подсказка: в един час има 3600 секунди, а % дава каквото остава.

Вход
3725
Изход
1 ч. 2 мин. 5 сек.

3. Обем на сфера. Прочети радиуса и отпечатай обема: V = 4/3 · π · r³. Тук 4 / 3 е 1.333…, както трябва. А колко би било 4 // 3?

Вход
10
Изход
Обем: 4188.79 куб. см

4. Целзий във Фаренхайт. F = C · 9 / 5 + 32. Прочети температурата в градуси Целзий.

Вход
37
Изход
37.0 °C = 98.6 °F

Още задачи

  • Инчове в сантиметри. Един инч е 2,54 см. За 12 инча: 30.48 см.
  • Площ на правоъгълник. Прочети дължината и ширината, отпечатай площта (дължина · ширина).
  • Площ на квадрат. Прочети страната, отпечатай площта. Направи го веднъж с * и веднъж с **.
  • Радиани в градуси. Градуси = радиани · 180 / π. За 3.14159: 180.00°.
  • Часове в секунди. Прочети брой часове и отпечатай колко секунди са. За 2 часа: 7200.
  • Код на символ. Прочети символ и отпечатай кода му. За A: 65. Първия символ на въведения текст вземаш с input()[0]. Какво значи това, ще видим в урока за текста.

Тест

Провери се

1. Колко е 17 // 5?
2. Колко е 17 % 5?
3. Колко е 17 / 5 в Python?
4. Какво дава int(9.99)?
5. Какво прави print("Сума: " + 2 + 3)?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·