Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2015 20:16:22

shotokan
Зарегистрирован: 2015-07-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще одна задача от Майкла Доусона

Следуя учебника для новорожденных в питоне, нужно было выполнить такую задачу:

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

Ничего сложного, если действительно, использовать пары.
В данном случае, код у меня получился такой:
MENU = ("""
0 - Выход
1 - Определить обьект для изменения просмотра
2 - Добавить новый объект
""")
MENU_EXIST = ("""
0 - Вернуться на уровень выше
1 - Просмотр данных
2 - Изменение данных
3 - Удаление данных
""")
MENU_NEW = ("""
0 - Вернуться на уровень выше
1 - Добавить новые данные
""")
son_father = {"Петров Сергей":"Петров Иван",
            "Михайлов Никита":"Михайлов Иван",
            "Джаггер Джорджия":"Джаггер Мик",
            "1":"test"
             }
option1 = None # Выбор пункта основного меню
option2 = None # Выбор пункта меню "MENU_EXIST"
option3 = None # Выбор пункта меню "MENU_NEW"
son = ""
father = ""
dlina = None
while option1 != 0:
    print(MENU)
    option1 = int(input("Выберите пункт меню:"))
    if option1 == 0:
        print("Пока!")
    elif option1 == 1:
        son = str(input("Введите имя потомка: "))
        while son not in son_father:
            print("Ошибка, такого потомка нет в базе")
            son = str(input("Введите имя потомка: "))
        while option2 != 0:
            print(MENU_EXIST)
            option2 = int(input("Выберите пункт подменю:"))
            if option2 == 0:
                print("Выход в главное меню")
            elif option2 == 1:
                print("\nРодителем", son, "является", son_father[son])
            elif option2 == 2:
                print("Введите родителя для", son)
                father = str(input(":"))
                son_father[son] = father
                print("Данные изменены.")
            elif option2 == 3:
                del son_father[son]
                print("Объект удален.")
            else:
                print("Такого пункта в меню нет")
                                            
    elif option1 == 2:
        while option3 != 0:
            print(MENU_NEW)
            option3 = int(input("Выберите пункт подменю:"))
            if option3 == 0:
                print("Выход в главное меню")
            elif option3 == 1:
                son = str(input("Введите имя потомка"))
                father = str(input("Введите имя родителя"))
                son_father[son] = father
            else:
                print("Такого пункта в меню нет")
    else:
        print("Такого пункта в меню нет")
        

Загвоздка возникла только в блоке удаления пары. Если удалить пару из словаря и сбросить значение переменной son в None, при обращении к словарю, получаем ошибку:
Traceback (most recent call last):
  File "C:/Python34/other_v.py", line 48, in <module>
    print("\nРодителем", son, "является", son_father[son])
KeyError: None
Ума не приложу, как сделать так, чтобы при удалении, у пользователя запрашивалось заново значение переменной son.

И еще один вопрос, как быть с многодетными родителями, у которых несколько детей?

Понимаю, что для опытных вопросы покажутся глупыми, но я бьюсь над ними сегодня с 10 утра. Возможно, иду не в том направлении. Кто-то подскажет верное?

Отредактировано shotokan (Июль 7, 2015 20:16:50)

Офлайн

#2 Июль 7, 2015 20:52:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Еще одна задача от Майкла Доусона

Куча ифов!
Вам же Доусон показал, как пользоваться словарями. Засуньте всё ваше меню в словарь, ключами будут пункты меню, а значениями - функции. Код станет гораздо чище. Или до функций вы еще не дочитали?



Офлайн

#3 Июль 7, 2015 20:53:48

shotokan
Зарегистрирован: 2015-07-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще одна задача от Майкла Доусона

FishHook
Куча ифов!Вам же Доусон показал, как пользоваться словарями. Засуньте всё ваше меню в словарь, ключами будут пункты меню, а значениями - функции. Код станет гораздо чище. Или до функций вы еще не дочитали?
Нет, не дочитал.

Офлайн

#4 Июль 7, 2015 21:59:26

shotokan
Зарегистрирован: 2015-07-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще одна задача от Майкла Доусона

Переписал все заново, так как при тестировании вывалило кучу глюков.
Упростил меню:

MENU = ("""
0 - Выход
1 - Просмотр данных
2 - Изменение данных
3 - Удаление данных
4 - Добавить новый объект
""")
son_father = {"Петров Сергей":"Петров Иван",
            "Михайлов Никита":"Михайлов Иван",
            "Джаггер Джорджия":"Джаггер Мик",
            "1":"test"
             }
option1 = None # Выбор пункта основного меню
son = ""
father = ""
while option1 != 0:
    print(MENU)
    option1 = int(input("Выберите пункт меню:"))
    if option1 == 0:
        print("Пока!")
        
    elif option1 == 1:
        son = str(input("Введите имя потомка: "))
        if son in son_father:
            print("\nРодителем", son, "является", son_father[son])
        else:
            print("Ошибка, такого потомка нет в базе")
    elif option1 == 2:
        son = str(input("Введите имя потомка: "))
        if son in son_father:
            father = str(input("Введите имя родителя: "))
            son_father[son] = father
            print("\nРодителем", son, "является", son_father[son])
        else:
            print("Ошибка, такого потомка нет в базе")
            
    elif option1 == 3:
        son = str(input("Введите имя потомка: "))
        if son in son_father:
            del son_father[son]
            print("\nУдалено")
        else:
            print("Ошибка, такого потомка нет в базе")
                
    elif option1 == 4:
        son = str(input("Введите имя потомка: "))
        if son in son_father:
            print("\nТакая запись уже существует")
        else:
            father = str(input("Введите имя родителя: "))
            son_father[son] = father
            print("Добавлено в базу")

Отредактировано shotokan (Июль 7, 2015 22:00:29)

Офлайн

#5 Июль 8, 2015 20:22:27

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Еще одна задача от Майкла Доусона

shotokan
Если удалить пару из словаря и сбросить значение переменной son в None, при обращении к словарю, получаем ошибку:

Всё верно.

d = {}
son = None
d[son]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: None

Как ты присвоил son ссылку на None? И зачем?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version