Без проверок код был бы намного меньше, но сделал с проверками на всякий случай. Если нужно проще - пишите. По сути достаточно функции calculate_cost. И я ещё другую функцию сделал calculate_cost_old, она не используется, но в ней дифференцированный подход вычислений используется, то есть до нижней границы вычисляется по ставке 1,1, дальше вычисляется по тарифу, а больше верхней границы по тарифу 0,9. Мне кажется, так логичнее:
def calculate_cost(N:int,A:int,B:int,T:float):
s = 0
if N <= A: s = 1.1*N
elif A < N <= B: s = N
else: s = 0.9*N
return round(T*s,2)
def calculate_cost_old(N:int,A:int,B:int,T:float):
"""Данная функция вычисляет стоимость услуг и возвращает значение"""
s1 = 0
s2 = 0
s3 = 0
# вычислим стоимость до нижней границы включительно
if N <= A: s1 = 1.1*N
else: s1 = 1.1*A
# вычислим стоимость между нижней (исключительно) и верхней (включительно) границами
if A < N <= B: s2 = N-A
elif N > B: s2 = B-A
# вычислим стоимость от верхней границы (исключительно)
if N > B: s3 = 0.9*(N-B)
return round(T*(s1+s2+s3),2)
def calculator():
"""основная функция"""
names = ['Количество минут', 'Нижняя граница тарифа', 'Верхняя граница тарифа', 'Стоимость тарифа']
while True:
chk = True
a = list(map(str, input('Начните ввод: ').split()))
if len(a) != 4:
print('Ошибка ввода: введите четыре параметра через пробел')
continue
for i in range(len(a)):
if i != 3:
try:
a[i] = int(a[i])
if a[i] < 0: raise ValueError
if i == 2 and a[i-1] > a[i]: raise ValueError
except ValueError:
print(f'Ошибка ввода: значение "{names[i]}" ({i+1}-й параметр) должно быть целым не отрицательным числом', '> нижней границы' if i == 2 else '')
chk = False
else:
try:
a[i] = float(a[i])
if a[i] <= 0: raise ValueError
except ValueError:
print(f'Ошибка ввода: значение "{names[i]}" ({i+1}-й параметр) должно быть целым положительным числом')
chk = False
if chk: break
print()
print('--- Рассчёт окончен ---')
print('Стоимость учлуг составляет: {:.2f}'.format(calculate_cost(a[0],a[1],a[2],a[3])))
print()
print('--- Рассчёт стоимости услуг связи ---')
print()
print('Введите через пробел: \n - количество потраченных за месяц минут (целое число >= 0)\n - нижнюю границу тарифа (целое число >= 0)\n - верхнюю границу тарифа (целое число >= нижней границы)\n - стоимость (вещественное число > 0)')
print()
while True:
calculator()
if input('Повторить вычисления? (y/n): ') == 'n': break
32768
Объяснение:
Данная незамысловатая функция Excel VBA формирует строку, согласно условию.
Function replstr(str As String, n As Integer) As String
Dim a(1 To 3), b(1 To 3) As String, i, j As Integer
a(1) = "A": a(2) = "B": a(3) = "AB"
b(1) = "AB": b(2) = "AB": b(3) = "A"
For i = 1 To n
j = (i - 1) Mod 3 + 1
str = Replace(str, a(j), b(j))
Next
replstr = str
End Function
Аргументы функции:
1) Исходная строка (а данном случае “AA”)
2) Число операций с исходной строкой
Значение первых 13 операций:
=replstr("AA";1) ABAB
=replstr("AA";2) AABAAB
=replstr("AA";3)
=replstr("AA";4) ABABABAB
=replstr("AA";5) AABAABAABAAB
=replstr("AA";6)
=replstr("AA";7) ABABABABABABABAB
=replstr("AA";8) AABAABAABAABAABAABAABAAB
=replstr("AA";9)
=replstr("AA";10)
=replstr("AA";11)
=replstr("AA";12)
=replstr("AA";13)
Для подсчета символов “A” в строке, используем еще одну функцию:
Function chrcount(str1 As String, str2 As String) As Integer
Dim str() As String
str = Split(str1, str2)
chrcount = UBound(str, 1)
End Function
Аргументы функции:
1) Cтрока
2) Символ (последовательность символов), число которых требуется найти
Например, результатом использования функции =chrcount(replstr("AA";20);"A") в ячейке Excel будет число 256
Используя описанные функции, посчитаем символы “A”в первых 13 строках
Номер операции (i) Число символов “A” в строке
1 2
2 4
3 4
4 4
5 8
6 8
7 8
8 16
9 16
10 16
11 32
12 32
13 32
Как видно из таблицы, число символов в строке образует числовую последовательность 2^1; 2^2; 2^2; 2^2; 2^3; 2^3; 2^3; … 2^([(i-2)/3]+2)
Таким образом, мы получили формулу для вычисления числа символов “A”в строке по номеру операции.
Соответственно, 2^([(43-2)/3]+2) = 32768