TurkuPythonExercises / Week 6 Files and errors /[Fixed] 12. Add names and years to list
KaiquanMah's picture
Fixed with approach 3
e44fd07 verified
'''
Write a program that asks the user for their name and year of birth.
If there is no error in the name or year, they are added to the tuple list.
When the user replaces the name with an empty string, the program prints the list and terminates.
See the sample output below for a description of how the program should react to various error situations.
The earliest accepted year of birth is 1800, the minimum length of the name is 2 characters.
The program assumes that the year is 2021 - so the person cannot have been born after that date.
Name: Alex
Year of birth: 1904
Name: Lena
Year of birth: 1999
Name: A
Year of birth: 1987
Name's too short!
Name: Alex
Year of birth: 1765
You're too old!
Name: Tina
Year of birth: 2042
You're not born yet!
Name: Mark
Year of birth: in the fifties
Year must be given in a numerical form!
Name:
List: [('Alex', 1904), ('Lena', 1999)]
'''
# approach 1
def main():
people = []
current_year = 2021
while True:
name = input("Name: ")
if name == "":
break
if len(name) < 2:
print("Name's too short!")
continue
year = input("Year of birth: ")
if not year.isdigit():
print("Year must be given in a numerical form!")
continue
year = int(year)
if year < 1800:
print("You're too old!")
elif year > current_year:
print("You're not born yet!")
else:
people.append((name, year))
print("List:", people)
main()
'''Error
Error in program execution
line 68, in
main()
File "/tmp/untrusted/test08c6d0c3d-26b8-4214-8bab-fff48628c30b/test.py", line 35, in main
name = input("Name: ")
File "/tmp/untrusted/test08c6d0c3d-26b8-4214-8bab-fff48628c30b/test.py", line 17, in input
raise Exception("The program asked for too many values in the input statement! The maximum number of values to ask for was "
Exception: The program asked for too many values in the input statement! The maximum number of values to ask for was 17
'''
########################################################
# approach 2
def main():
people = []
current_year = 2021
while True:
# Ask for name and year in a single input
user_input = input("Name and year of birth (or leave blank to exit): ").strip()
if user_input == "":
break
# Split input into name and year
parts = user_input.split()
if len(parts) < 2:
print("Please provide both name and year of birth!")
continue
name = parts[0]
year = parts[1]
if len(name) < 2:
print("Name's too short!")
continue
if not year.isdigit():
print("Year must be given in a numerical form!")
continue
year = int(year)
if year < 1800:
print("You're too old!")
elif year > current_year:
print("You're not born yet!")
else:
people.append((name, year))
print("List:", people)
main()
'''actual output
Name and year of birth (or leave blank to exit): Sam
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): 1972
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): Alex
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): 1904
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): Lena
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): 1999
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): A
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): 1987
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): Alex
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): 1765
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): Tina
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): 2042
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): Mark
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): in
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): the
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit): fifties
Please provide both name and year of birth!
Name and year of birth (or leave blank to exit):
List: []
'''
'''expected output
Name: Sam
Year of birth: 1972
Name: Alex
Year of birth: 1904
Name: Lena
Year of birth: 1999
Name: A
Year of birth: 1987
Name's too short!
Name: Alex
Year of birth: 1765
You're too old!
Name: Tina
Year of birth: 2042
You're not born yet!
Name: Mark
Year of birth: in
Year must be given in a numerical form!
Name: the
Year of birth: fifties
Year must be given in a numerical form!
Name:
List: [('Sam', 1972), ('Alex', 1904), ('Lena', 1999)]
'''
########################################################
# approach 3
# added strip() to input
# moved 'len(name) < 2' check down
def main():
people = []
current_year = 2021
while True:
# Ask for name
name = input("Name: ").strip()
# Break if name is blank
if name == "":
break
continue
# Ask for year of birth
year = input("Year of birth: ").strip()
# Check if name is too short
if len(name) < 2:
print("Name's too short!")
continue # also added this, moved this below year input needed by 'autograder's expected output'
# Check if year is numerical
if not year.isdigit():
print("Year must be given in a numerical form!")
continue
year = int(year)
# Check if year is valid
if year < 1800:
print("You're too old!")
elif year > current_year:
print("You're not born yet!")
else:
people.append((name, year))
print("List:", people)
main()
actual and expected output
'''
Name: Sam
Year of birth: 1972
Name: Alex
Year of birth: 1904
Name: Lena
Year of birth: 1999
Name: A
Year of birth: 1987
Name's too short!
Name: Alex
Year of birth: 1765
You're too old!
Name: Tina
Year of birth: 2042
You're not born yet!
Name: Mark
Year of birth: in
Year must be given in a numerical form!
Name: the
Year of birth: fifties
Year must be given in a numerical form!
Name:
List: [('Sam', 1972), ('Alex', 1904), ('Lena', 1999)]
'''