import pandas import random # Functions go here def make_statement(statement, decoration): """Emphasises headings by adding decoration at the start and end""" print(f"{decoration * 3} {statement} {decoration * 3}" ) def string_check(question, valid_answers=('yes', 'no'), num_letters=1): """Checks that users enter the full word or the first letter of a word from alist of valid responses""" while True: response = input(question).lower() for item in valid_answers: # check if the response is the entire word if response == item: return item # check if it's the 'n' letter elif response == item[:num_letters]: return item print(f"Please choose an option from {valid_answers}") def instructions(): make_statement("Instructions", "ℹ️") print(''' For each ticket holder enter ... - Their name - Their age - The payment method (cash / credit) The program will record the ticket sale and calculate the ticket cost (and the profit). Once you have either sold all of the tickets or entered the exit code ('xxx'), the program will display the ticket sales information adn writ ethe fata to a text file. It will also choose one lucky ticket holder who wins the draw (their ticket is free) ''') def not_blank(question): """Check that a user response is not blank""" while True: response = input(question) if response != "": return response print("Sorry, this can't be blank. Please try again.\n") def int_check(question): """Checks users enter an integer""" error = "Oops - please enter an integer" while True: try: # Return the response if it's an integer response = int(input(question)) return response except ValueError: print(error) def currency(x): """Formats numbers as currency (s#.###)""" return "${:.2f}".format(x) # Main Routine goes here # Initialise ticket numbers MAX_TICKETS = 5 tickets_sold = 0 # initialise variables / non-default options for string checker payment_ans = ('cash', 'credit') # Ticket Price List CHILD_PRICE = 7.50 ADULT_PRICE = 10.50 SENIOR_PRICE = 6.50 # Credit card surcharge (currently 5%) CREDIT_SURCHARGE = 8.95 # Lists to hold ticket details all_names = [] all_ticket_costs = [] all_surcharges = [] mini_movie_dict = { 'Name': all_names, 'Ticket Price': all_ticket_costs, 'Surcharge': all_surcharges, } # Program main heading make_statement("Mini-Movie Fundraiser Program", "🍿") print() want_instructions = string_check("Do you want to see the instructions? ") if want_instructions == "yes": instructions() print() while tickets_sold < MAX_TICKETS: # ask user for their name (and check it's not blank) print() name = not_blank("Name: ") # if name is exit code, break out of loop if name == "xxx": break # Ask for their age and check it's between 12 and 120 age = int_check("Age: ") # Output error message / success message if age < 12: print("Sorry you are too young for this movie") continue # Child ticket is $7.50 elif age < 16: ticket_price = CHILD_PRICE # Adult ticket is ($10.50) elif age > 120: print(f"{name} is too old") continue else: pass # ask user for payment method (cash / credit / ca / cr) payment_method = string_check("Payment method: ", payment_ans, 2) print(f"{name} has bought a ticket ({payment_method})") \ if payment_method == "cash": surcharge = 0 tickets_sold += 1 if tickets_sold == MAX_TICKETS: print(f"You have sold all the tickets (ie: {MAX_TICKETS} tickets") else: print(f"You have sold {tickets_sold} / {MAX_TICKETS} tickets. ") # add name, ticket cost and surcharge all_names.append(name) all_ticket_costs.append('Ticket_Price') all_surcharges.append('Surcharge') # End of Ticket Loop! # Create dataframe / table from dictionary mini_movie_frame, pandas.DataFrame(mini_movie_dict) # Currency Formatting (uses currency fund) add_dollars = ['Ticket Price', 'Surcharge'] for var_item in add_dollars: mini_movie_frame[var_item] - mini_movie_dict # Output movie from without index print(mini_movie_frame.to_string(index=False)) print() print(f"Total Paid: ${total_paid:.2f}") print(f"Total Profit: ${total_profit:.2f}") # choose random winner... winner = random.choice(all_names) # find index of winner (ie: position in list) winner_index = all_names.index(winner) print("winner", winner, "list position", winner_index) # retrieve Total won total_won = mini_movie_frame.at[winner_index, 'Total'] # winner announcement print(f"The lucky winner is {winner}. Their ticket worth ${total_won:.2f} is free!") if tickets_sold == MAX_TICKETS: print(f"You have sold all the tickets") else: print(f"You have sold {tickets_sold}f")