Difference between revisions of "CSC111 Homework 10 Solution 2014"
(Created page with "--~~~~ ---- <onlydft> =Program 1= <source lang="python"> class Cat: def __init__( self, name, age, vac, neut, breed ): self.name = name self.age ...") |
|||
Line 113: | Line 113: | ||
=Problem #2 = | =Problem #2 = | ||
<source lang="python"> | <source lang="python"> | ||
+ | class Person: | ||
+ | # a class containing 4 private member variables: | ||
+ | # - name of the person (string) | ||
+ | # - age (integer) | ||
+ | # - gpa (float) | ||
+ | # - major (string, uppercase) | ||
+ | # methods: | ||
+ | # getName(): returns the name of the person (string) | ||
+ | # getAge(): returns the age of the person (int) | ||
+ | # setAge(x): sets the age of the person to x (int) | ||
+ | # constructor: intializes a person with all fields | ||
+ | def __init__(self, n, a ): | ||
+ | self._name = n | ||
+ | self._age = a | ||
+ | |||
+ | # returns a string with the name and age. | ||
+ | def __str__( self ): | ||
+ | return "%s, %d years old" % ( self._name, self._age ) | ||
+ | |||
+ | # returns the name | ||
+ | def getName( self ): | ||
+ | return self._name | ||
+ | |||
+ | # set the age to a new value x | ||
+ | def setAge( self, x ): | ||
+ | self._age = x | ||
+ | |||
+ | # returns the age of the person | ||
+ | def getAge( self ): | ||
+ | return self._age | ||
+ | |||
+ | |||
+ | class Dog: | ||
+ | # a class containing 2 private member variables: | ||
+ | # - name-tag of the dog (string) | ||
+ | # - whether the dog is vaccinated or not (boolean) | ||
+ | # methods: | ||
+ | # isVaccinated(): returns True if the dog is vaccinated, False otherwise | ||
+ | # getName(): returns the name-tag of the dog | ||
+ | # setName(x): sets the name-tag of the dog | ||
+ | # constructor | ||
+ | def __init__( self, tag, vaccinated ): | ||
+ | self._tag = tag | ||
+ | self._vaccinated = vaccinated | ||
+ | |||
+ | # default string representation for the dog | ||
+ | def __str__( self ): | ||
+ | if self._vaccinated==True: | ||
+ | return "%s (vaccinated)" % self._tag | ||
+ | return "%s (not vaccinated)" % self._tag | ||
+ | |||
+ | # isVaccinated: returns True if the dog is vaccinated, False otherwise | ||
+ | def isVaccinated( self ): | ||
+ | return self._vaccinated | ||
+ | |||
+ | # returns the name of the dog | ||
+ | def getNameTag( self ): | ||
+ | return self._tag | ||
+ | |||
+ | # changes the name-tag | ||
+ | def setNameTag( self, tag ): | ||
+ | self._tag = tag | ||
+ | |||
+ | |||
+ | class ListPeopleDog: | ||
+ | # a class that maintains a list of pairs. The first | ||
+ | # element of a pair is a Person object, the second a Dog object | ||
+ | # if the person doesn't have a dog, the second element of the pair is None | ||
+ | # Methods supported: | ||
+ | # isEmpty(): returns True if the list is empty, False othewise | ||
+ | # append( p, d ): appends a pair( person, dog) to the list | ||
+ | # getDogOf( name ): returns the dog object associated with the given person's name | ||
+ | # getOwnerOf( tag ): returns the person object associated with the given dog tag | ||
+ | # size( ): returns the number of pairs in the list | ||
+ | # getPersonDogAt( i ): returns the person object and the dog object located | ||
+ | # at Index i in the list. | ||
+ | |||
+ | # constructor | ||
+ | def __init__( self ): | ||
+ | self._L = [] | ||
+ | |||
+ | # returns a string formatted as several lines, each representing | ||
+ | # a person and his/her dog. | ||
+ | def __str__( self ): | ||
+ | s = "" | ||
+ | for person, dog in self._L: | ||
+ | if dog==None: | ||
+ | s = s + str( person )+ " [No dogs]\n" | ||
+ | else: | ||
+ | s = s + str( person )+ " ["+str( dog ) +"]\n" | ||
+ | return s | ||
+ | |||
+ | # returns True if the list is empty. False otherwise. | ||
+ | def isEmpty( self ): | ||
+ | return len( self._L )==0 | ||
+ | |||
+ | # add a new pair to the list | ||
+ | def append( self, person, dog ): | ||
+ | self._L.append( (person, dog) ) | ||
+ | |||
+ | # returns the dog associated with the first person who's name is passed. | ||
+ | def getDogOf( self, name ): | ||
+ | name = name.strip().lower() | ||
+ | for person, dog in self._L: | ||
+ | if dog==None: | ||
+ | continue | ||
+ | if person.getName().lower() == name: | ||
+ | return dog | ||
+ | return None | ||
+ | |||
+ | # returns the person object associated with the first dog in the list with the | ||
+ | # tag passed as a parameter. | ||
+ | def getOwnerOf( self, name ): | ||
+ | name = name.strip().lower() | ||
+ | for person, dog in self._L: | ||
+ | if dog==None: | ||
+ | continue | ||
+ | if dog.getNameTag()==name: | ||
+ | return person | ||
+ | return None | ||
+ | |||
+ | # returns the number of pairs in the list. | ||
+ | def size( self ): | ||
+ | return len( self._L ) | ||
+ | |||
+ | # returns the person and dog located at Index i in the list. | ||
+ | def getPersonDogAt( self, i ): | ||
+ | if i < len( self._L ): | ||
+ | return self._L[i][0], self._L[i][1] | ||
+ | return None, None | ||
+ | |||
+ | # ================================================ | ||
+ | # main | ||
+ | # ================================================ | ||
+ | def main(): | ||
+ | text = """Joe, 23, Fido, vaccinated | ||
+ | Debra, 30, Rex, not vaccinated | ||
+ | Frida, 10, Ralph, vaccinated | ||
+ | Maria, 21, Gizmo, vaccinated | ||
+ | Frank, 31, , | ||
+ | Millie, 25, Maxi, not vaccinated""" | ||
+ | |||
+ | # create a new ListPeopleDog object | ||
+ | L = ListPeopleDog() | ||
+ | |||
+ | # parse the text and add it as people-dog pairs in the list | ||
+ | for line in text.split( "\n" ): | ||
+ | if len( line.split(',') ) != 4: | ||
+ | continue | ||
+ | name, age, tag, vacc = line.split(',') | ||
+ | name = name.strip() | ||
+ | age = int( age.strip() ) | ||
+ | tag = tag.strip() | ||
+ | vacc = "not" not in vacc.lower() | ||
+ | |||
+ | if len( tag )==0: | ||
+ | L.append( Person(name, age), None ) | ||
+ | else: | ||
+ | L.append( Person(name, age), Dog( tag, vacc ) ) | ||
+ | |||
+ | # Display the list | ||
+ | for i in range( L.size() ): | ||
+ | p, d = L.getPersonDogAt( i ) | ||
+ | if d != None: | ||
+ | print( p, "has a dog: ", d ) | ||
+ | else: | ||
+ | print( p, "does not have a dog" ) | ||
+ | |||
+ | #list of unvaccinated dogs | ||
+ | print( "\nUnvaccinated dogs: " ) | ||
+ | for i in range( L.size() ): | ||
+ | p, d = L.getPersonDogAt( i ) | ||
+ | if d != None and d.isVaccinated(): | ||
+ | print( p, d ) | ||
+ | |||
+ | # people without dogs | ||
+ | print( "\nPeople without dogs" ) | ||
+ | for i in range( L.size() ): | ||
+ | p, d = L.getPersonDogAt( i ) | ||
+ | if d == None: | ||
+ | print( p, "does not have a dog" ) | ||
+ | |||
+ | # oldest person who has a dog | ||
+ | print( "\nOldest person with a dog" ) | ||
+ | maxi = 0 | ||
+ | maxAge = 0 | ||
+ | for i in range( L.size() ): | ||
+ | p, d = L.getPersonDogAt( i ) | ||
+ | if d == None: | ||
+ | continue | ||
+ | if p.getAge() > maxAge: | ||
+ | #print("updating maxi=",maxi,p, d) | ||
+ | maxi = i | ||
+ | maxAge = p.getAge() | ||
+ | p, d = L.getPersonDogAt( maxi ) | ||
+ | print( p, "with dog", d ) | ||
+ | |||
+ | main() | ||
</source> | </source> | ||
</onlydft> | </onlydft> |