David <[email protected]> wrote:


Hi, I am going through Wesley Chun's book and this is Exercise 8-11;
Write a program to ask the user to input a list of names, format "Last Name" "comma" "First Name". Write a function that manages the input so that when/if the user types in the names in the wrong format the error is corrected, and keep track of the number of errors. When done sort the list.

Questions;

This;
answers = raw_input('Enter Name: ')
index = answers.find(',')

Does not seem to be a very good to me, how could I check for a comma between two words?

And This;
try:
     total_names = int(raw_input('Enter Total Number of Names: '))
except ValueError:
     print 'You must enter a number!'
     total_names = int(raw_input('Enter Total Number of Names: '))

Does not handle the second input for exceptions.

thanks,
-david


#!/usr/bin/python
import string

names = []

def get_names():
     wrong_format = 0
     count = 0
     try:
         total_names = int(raw_input('Enter Total Number of Names: '))
     except ValueError:
         print 'You must enter a number!'
         total_names = int(raw_input('Enter Total Number of Names: '))

     while count < total_names:
         print 'Format: LastName, First Name'
         answers = raw_input('Enter Name: ')
         index = answers.find(',')
         answers = answers.title()
         index = answers.find(',')
         if index != -1:
             names.append(answers)
             count += 1
         else:
             wrong_format += 1
             print '\nWrong Format!!!'
             if wrong_format > 1:
                 print 'That is %i Fixing Format ...' % wrong_format
             else:
print 'You have done this %i times, Fixing Format ...' % wrong_format
                 print 'Done, continue:\n'
                 answers = answers.split()
                 answers = string.join(answers, ', ')
                 names.append(answers)
                 count += 1

def show_names():
     print 'Your Names Are: \n'
     for i in sorted(names):
         print i

def main():
     get_names()
     if names:
         show_names()

if __name__ == "__main__":
     main()

For your second question, there are several things that could be wrong with the user's input. Usually it's easiest to make that a separate function to make it readable. Then the function returns whenever the result passes its validation.

def getTotalNumber(prompt):
   while True:
       try:
           numstr = raw_input(prompt)
           n = int(numstr)
           if  0 < n < 50:            #some validation
                return n
           print "Number is not reasonable, try again"
      except ValueError:
           print "You must enter a number!"

This way there are two forms of validation happening. If the exception fires, the user gets one print statement, and if the validation fails, he gets the other. The purist might complain that the return is in the middle of the function, so if you want to fix that, move the return n to the end, and change the existing one to a break..

The first question can be solved in a similar way, though the meaning of "the error is corrected" is unclear. You can correct the error by asking the user to fix it. Or you could take a wild guess that instead of
     lastname,  firstname
the user has entered
    firstname lastname

But since many names have multiple spaces (Dr. William Smith, or Henry James, Jr.) or even other punctuation, I'd think the only safe thing would be to ask the user separately for the fields you want. And each field may contain spaces or commas, or periods.

Anyway, since it's just an exercise, I'd probably model it the same way as the first function, and just ask the user again. So the function would look quite similar, with the one difference that it would return an error count as well as the name. Then the main function would accumulate the counts and print the summary at the end.

DaveA
_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to