# Задание:
# Эта программа являет собой упрощенный симулятор банкомата, пользователь вводит номер карты и пин код,
# в случае успеха программа предлагает меню для выбора действий, где он может проверить счет, или снять деньги.
#
# Эта задача не так похожа на другие, но она, как никогда прежде приближена к реалиям разработки общего проекта.
#
# Ваша задача исправить ошибки логики, и выполнить проверки данных, которые вводит пользователь.
# Обязательно убедитесь, что вы выполнили все проверки, попробуйте сами сломать свою программу вводя неверные данные!
import re
person1 = {'card': 4276123465440000, 'pin': 9090, 'money': 100.90}
person2 = {'card': 4276123465440001, 'pin': 9091, 'money': 200.90}
person3 = {'card': 4276123465440002, 'pin': 9092, 'money': 300.90} # номер карты = 16, пин код = 4
bank = [person1, person2, person3]
def get_person_by_card(card_number):
for person in bank:
if person['card'] == card_number:
return person
def is_pin_valid(person, pin_code):
if person['pin'] == pin_code:
return True
return False
def check_account(person):
return round(person['money'], 2)
def withdraw_money(person, money):
if person['money'] - money >= 0: # исправил условие возможности снятия денег
person['money'] -= money
return 'Вы сняли {} рублей.'.format(money)
else:
return 'На вашем счету недостаточно средств!'
def process_user_choice(choice, person):
if choice == 1:
print(check_account(person))
elif choice == 2:
count = input('Сумма к снятию: ')
if check_input_money(count):
count = float(count)
if count > 0: # можно снять только сумму > 0!
print(withdraw_money(person, count))
else:
print('Вводите только допустимую сумму!')
return False
else:
print('Вводите только допустимую сумму!')
return False
def check_input_money(money): # добавил функцию проверки снимаемых денег
try:
float(money)
return True
except ValueError:
print('Вводите только допустимую сумму!')
return False
def is_valid_choice(number): # добавил функцию проверки на число выбора действия
try:
int(number)
return True
except ValueError:
print('Вводите только числа!')
return False
def check_card_pin(string): # добавил функцию проверки регулярным выражением на правильность ввода
if len(string) == 21: # длина строки = номер карты 16 + пробел 1 + пин код 4
pattern = '(\\d{16}\\s\\d{4})'
result = re.search(pattern, string)
if result:
return True
else:
return False
def start():
input_str = input('Введите номер карты и пин код через пробел: ')
if check_card_pin(input_str): # проверка на длину и число корректного ввода номера карты и пин кода
card_number, pin_code = input_str.split()
card_number = int(card_number)
pin_code = int(pin_code)
person = get_person_by_card(card_number)
if person and is_pin_valid(person, pin_code):
while True:
choice = input('Выберите пункт:\n'
'1. Проверить баланс\n'
'2. Снять деньги\n'
'3. Выход\n'
'---------------------\n'
'Ваш выбор:')
if is_valid_choice(choice): # проверка на число
choice = int(choice)
if choice == 3:
break
elif choice == 1 or choice == 2: # добавил блок вызова функции при выборе 1 или 2
process_user_choice(choice, person)
else:
print('Номер карты или пин код введены не верно!')
start()