Ошибка с кодом, я не уверен, в чем проблема, но кажется, что зацикливание - PullRequest
0 голосов
/ 10 сентября 2018
name = ["Hetty", "Poppy", "Blue Skies", "Bay View", "Happy Days", "Summer Joy", 
"Walkers Rest", "Bertie","Green Forest Lodge", "Coppice Lodge" ]
cap = [4, 4, 4, 6, 6, 6, 8, 8, 10, 10]
peak = [400, 400, 500, 650, 695, 800, 950, 1050, 1200, 1500]
offpeak = [250, 250, 350, 500, 550, 600, 750, 850, 950, 1150]
onoff = False
cost = 0
print("Here are our avaliable lodges")
for elem in name:
    print("- " + elem)

desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()

while True: 
    for i in range (0,10):
        if desired_room == name [i].lower():
            print("Name: ", name[i])
            print("Capacity: ",  cap[i])
            print("Off Peak Rate: 0" + str(offpeak[i]))
            print("Peak Rate: 0" + str(peak[i]))
            exit
    print("Invalid Room Name Entered Try Again")
    desired_room = (str(input("Enter The Name Of The Room You Would Like To Book:   "))).lower()

week = int(input("Enter The Week Your Stay Starts "))

Это мой код. Когда пользователь вводит имя комнаты, она работает, но затем по какой-то причине она зацикливается и спрашивает пользователя, какую комнату он хочет забронировать. Как я могу это исправить, чтобы вместо ввода комнаты, которую пользователь хочет забронировать, был задан вопрос «Введите неделю, с которой начинается ваше пребывание»? Ссылка на изображение https://imgur.com/a/QAtnHT9

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Хотя точки, поднятые в ответе @ abarnert, действительны, вы можете вместо этого использовать конструкцию for-else, как показано ниже, чтобы избежать использования отдельной функции для выхода из вложенного цикла:

while True: 
    for i in range (0,10):
        if desired_room == name[i].lower():
            print("Name: ", name[i])
            print("Capacity: ",  cap[i])
            print("Off Peak Rate: 0" + str(offpeak[i]))
            print("Peak Rate: 0" + str(peak[i]))
            break
    else:
        print("Invalid Room Name Entered Try Again")
        desired_room = (str(input("Enter The Name Of The Room You Would Like To Book:   "))).lower()
        continue
    break
0 голосов
/ 10 сентября 2018

Решение

name = [ 
    "Hetty", "Poppy", "Blue Skies", "Bay View", "Happy Days", "Summer Joy", 
    "Walkers Rest", "Bertie", "Green Forest Lodge", "Coppice Lodge" 
]
cap = [4, 4, 4, 6, 6, 6, 8, 8, 10, 10] 
peak = [400, 400, 500, 650, 695, 800, 950, 1050, 1200, 1500]
offpeak = [250, 250, 350, 500, 550, 600, 750, 850, 950, 1150]
onoff = False
cost = 0 

print("Here are our avaliable lodges")
[print(f"-{elem}") for elem in name]

desired_room = input("Enter The Name Of The Room You Would Like To Book: " \
    ).title()

while desired_room.title() not in name:
    print("Invalid Room Name Entered Try Again")
    desired_room = input("Enter The Name Of The Room You Would Like To" + 
        " Book:").title()

for i in range(len(name)) :
    if desired_room == name [i]:
        print("Name: ", name[i])
        print("Capacity: ",  cap[i])
        print("Off Peak Rate: 0" + str(offpeak[i]))
        print("Peak Rate: 0" + str(peak[i]))

week = int(input("Enter The Week Your Stay Starts "))

Было бы проще работать с вашим кодом, если бы вы просто немного разбили то, что пытаетесь сделать. Если вы создаете цикл while, который проверяет, что сначала существует desired_room, то вы можете войти в следующий цикл, зная, что desired_room является действительной записью.

Также, преобразовав входные данные в title вместо lower, вы можете проверить с помощью name быстрее, поскольку вы знаете, что все записи имеют формат регистра.

Мысли

В том виде, в каком вы находитесь, вы сопоставляете все индексы для каждого списка, чтобы получить правильную информацию (name[0], cap[0], peak[0],... give us информация Хетти). Это нормально, но то, что происходит, когда у вас 100 комнат и у вас нет 67-й записи, будет непросто пройтись по каждому списку и проверить индекс 67. Вместо этого вы можете использовать список словарей, чтобы хранить информацию о каждой комнате вместе. Просто пытаясь дать некоторые идеи, добавьте также некоторые идеи форматирования печати,

def print_info(something):
    r_width = len(something['name'])
    print("-"*15 + "-"*(r_width+1))
    print("Name:".ljust(15), f"{something['name']}".rjust(r_width))
    print("Capacity:".ljust(15), f"{something['cap']}".rjust(r_width))
    print("Off Peak Rate:".ljust(15), f"{something['offpeak']}".rjust(r_width))
    print("Peak Rate:".ljust(15), f"{something['peak']}".rjust(r_width))
    print("-"*15 + "-"*(r_width+1))

rooms = [
    {'name': 'Hetty', 'cap': 4, 'peak': 400, 'offpeak': 250},
    {'name': 'Poppy', 'cap': 4, 'peak': 400, 'offpeak': 250},
    {'name': 'Blue Skies', 'cap': 4, 'peak': 500, 'offpeak': 350},
    {'name': 'Bay View', 'cap': 6, 'peak': 650, 'offpeak': 500},
    {'name': 'Happy Days', 'cap': 6, 'peak': 695, 'offpeak': 550},
    {'name': 'Summer Joy', 'cap': 6, 'peak': 800, 'offpeak': 600},
    {'name': 'Walkers Rest', 'cap': 8, 'peak': 950, 'offpeak': 750},
    {'name': 'Bertie', 'cap': 8, 'peak': 1050, 'offpeak': 850},
    {'name': 'Green Forest Lodge', 'cap': 10, 'peak': 1200, 'offpeak': 950},
    {'name': 'Coppice Lodge', 'cap': 10, 'peak': 1500, 'offpeak': 1050}
]

onoff = False
cost = 0

room_avail = []
for i in rooms:
    room_avail.append(i['name'])

print("Here are our avaliable lodges")
for i in rooms:
    print(f"-{i['name']}")

desired_room = input("Enter The Name Of The Room You Would Like To Book: " \
    ).title()

while desired_room not in room_avail:
    print("Invalid Room Name Entered Try Again")
    desired_room = input("Enter The Name Of The Room You Would Like To" +
        " Book:").title()

for i in rooms:
    if desired_room == i['name']:
        print_info(i)

week = int(input("Enter The Week Your Stay Starts "))

выход

(xenial)vash@localhost:~/python$ python3.7 hotel.py
Here are our avaliable lodges
-Hetty
-Poppy
-Blue Skies
-Bay View
-Happy Days
-Summer Joy
-Walkers Rest
-Bertie
-Green Forest Lodge
-Coppice Lodge
Enter The Name Of The Room You Would Like To Book: coppice lodge
-----------------------------
Name:           Coppice Lodge
Capacity:                  10
Off Peak Rate:           1050
Peak Rate:               1500
-----------------------------
Enter The Week Your Stay Starts
0 голосов
/ 10 сентября 2018

Первая проблема заключается в том, что вы хотите break, а не exit.

. Оператор break выходит из цикла, что вы и хотите делать.

exit не является заявлением.Это имя функции, которую вы не вызываете, так что она ничего не делает, так же, как не может написать sorted.Кроме того, он не предназначен для использования, кроме как в интерактивном режиме;если вам нужно выйти из скрипта в середине скрипта, вы используете sys.exit().Кроме того, вам не нужно хотеть завершить весь сценарий здесь, в любом случае, только цикл.


Но у вас есть другая проблема помимо этого: у вас есть один цикл, вложенный внутрьдругой.Выход из первого не будет выходом из второго.

Вам нужно реорганизовать свою логику таким образом, чтобы было легко выбраться из этого кода, где вы хотите, и самым чистым способомсделать это обычно, написав функцию, которую вы можете return из:

def book_room():
    desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()

    while True: 
        for i in range (0,10):
            if desired_room == name [i].lower():
                return i
        print("Invalid Room Name Entered Try Again")
        desired_room = (str(input("Enter The Name Of The Room You Would Like To Book:   "))).lower()

И теперь, вы можете просто вызвать эту функцию:

room = book_room()
print("Name: ", name[room])
print("Capacity: ",  cap[room])
print("Off Peak Rate: 0" + str(offpeak[room]))
print("Peak Rate: 0" + str(peak[room]))

Пока мыВы можете упростить этот код несколькими способами.Вы можете просто попросить input в верхней части цикла вместо того, чтобы делать это дважды;вам не нужно вызывать str для чего-то, что уже является строкой;Вы можете использовать форматирование строк вместо того, чтобы вручную преобразовывать вещи в строки и объединять…

def book_room():
    while True: 
        desired_room = input("Enter The Name Of The Room You Would Like To Book: ")).lower()
        for i in range(0,10):
            if desired_room == name[i].lower():
                return i
        print("Invalid Room Name Entered Try Again")

room = book_room()
print(f"Name: {name[room]}")
print(f"Capacity: {cap[room]}")
print(f"Off Peak Rate: 0{offpeak[room]}")
print(f"Peak Rate: 0{peak[room]}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...