Difference between revisions of "CSC111 Homework 9 2015"

From dftwiki3
Jump to: navigation, search
Line 179: Line 179:
 
<br />
 
<br />
 
<source lang="python">
 
<source lang="python">
#  
+
# hw9_2start.py
 +
# D. Thiebaut
 
class Person:
 
class Person:
 
     # a class containing 4 private member variables:
 
     # a class containing 4 private member variables:
Line 192: Line 193:
  
 
     # constructor: intializes a person with all fields
 
     # constructor: intializes a person with all fields
     def __init__(self, n, a ):
+
     def __init__(self, n, a, dg ):
         self._name = n
+
         self.name = n
         self._age = a
+
         self.age = a
 +
        self.dog  = dg
  
 +
    def getDog( self ):
 +
        return self.dog
 +
   
 
     # returns a string with the name and age.
 
     # returns a string with the name and age.
 
     def __str__( self ):
 
     def __str__( self ):
         return "%s, %d years old" % ( self._name, self._age )
+
         return "{0:1}, {1:1} years old".format( self.name, self.age )
  
 
     # returns the name
 
     # returns the name
 
     def getName( self ):
 
     def getName( self ):
         return self._name
+
         return self.name
  
 
     # set the age to a new value x
 
     # set the age to a new value x
 
     def setAge( self, x ):
 
     def setAge( self, x ):
         self._age = x
+
         self.age = x
  
 
     # returns the age of the person
 
     # returns the age of the person
 
     def getAge( self ):
 
     def getAge( self ):
         return self._age
+
         return self.age
  
  
Line 223: Line 228:
 
     # constructor
 
     # constructor
 
     def __init__( self, tag, vaccinated ):
 
     def __init__( self, tag, vaccinated ):
         self._tag = tag
+
         self.tag = tag
         self._vaccinated = vaccinated
+
         self.vaccinated = vaccinated
  
 
     # default string representation for the dog
 
     # default string representation for the dog
 
     def __str__( self ):
 
     def __str__( self ):
         if self._vaccinated==True:
+
         if self.vaccinated==True:
             return "%s (vaccinated)" % self._tag
+
             return "{0:1} (vaccinated)".format( self.tag )
         return "%s (not vaccinated)" % self._tag
+
         return "{0:1} (not vaccinated)".format( self.tag )
  
 
     # isVaccinated: returns True if the dog is vaccinated, False otherwise
 
     # isVaccinated: returns True if the dog is vaccinated, False otherwise
 
     def isVaccinated( self ):
 
     def isVaccinated( self ):
         return self._vaccinated
+
         return self.vaccinated
  
 
     # returns the name of the dog
 
     # returns the name of the dog
 
     def getNameTag( self ):
 
     def getNameTag( self ):
         return self._tag
+
         return self.tag
  
 
     # changes the name-tag  
 
     # changes the name-tag  
 
     def setNameTag( self, tag ):
 
     def setNameTag( self, tag ):
         self._tag = 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().lower()==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
 
#                    main
Line 323: Line 262:
 
               Millie, 25, Maxi, not vaccinated"""
 
               Millie, 25, Maxi, not vaccinated"""
 
      
 
      
     # create a new ListPeopleDog object   
+
     # create a list of people, and their dog (if they own one)
     L = ListPeopleDog()
+
     people = []
 
      
 
      
 
     # parse the text and add it as people-dog pairs in the list
 
     # parse the text and add it as people-dog pairs in the list
Line 337: Line 276:
  
 
         if len( tag )==0:
 
         if len( tag )==0:
             L.append( Person(name, age), None  )
+
             p = Person(name, age, None  )
 
         else:
 
         else:
             L.append( Person(name, age), Dog( tag, vacc ) )
+
             p = Person(name, age, Dog( tag, vacc ) )
 +
 
 +
        # add this new person to the list
 +
        people.append( p )
  
 +
       
 
     # Display the list
 
     # Display the list
     for i in range( L.size() ):
+
     for person in people:
         p, d = L.getPersonDogAt( i )
+
          
        if d != None:
+
        if person.getDog() != None:
             print( p, "has a dog: ", d )
+
             print( person, ", has a dog: ", person.getDog(), sep="" )
 
         else:
 
         else:
             print( p, "does not have a dog" )
+
             print( person, ", does not have a dog", sep="" )
  
 
main()
 
main()
 +
 +
 
</source>
 
</source>
 
<br />
 
<br />

Revision as of 06:35, 31 March 2015

--D. Thiebaut (talk) 22:47, 30 March 2015 (EDT)



<showafterdate after="20150402 16:00" before="20150601 00:00">

This assignment is due the evening of Tuesday 4/7/15, at 11:55 p.m.







Problem #1: Lost Cat

(image from nicepixy.net)

Cats.jpg


The program below is missing its class! And it is also missing its documentation! It used to contain a class defined, with methods and member variables, and a fully developped documentation, but unfortunately all of them got erased.

We do have the output of a run of the program, though, when it still had its class definition. Both the incomplete code and the output are shown below.


#
# missing class goes here...
#

def getNewCat():
    print( "\nPlease enter the information for the new cat:")
    name = input(       "Cat name?         " )
    age  = int( input(  "Age, in years?    " ) )
    vac  = input(       "Vaccinated (Y/N)? " ).strip().lower()
    vac  = vac in ['y', 'yes']
    neut = input(       "Neutered (Y/N)?   " ).strip().lower()
    neut = neut in ['y', 'yes' ]
    breed= input(       "Breed?            " ).strip()
    
    return Cat( name, age, vac, neut, breed )

def display( catList, caption ):
    print( "\n\n"+caption )
    print( "=" * len( caption ) )
    for cat in catList:
        print( cat )

def main():
    #comments below are for debugging purpose
    #text="""Minou, 3, Yes, Yes, stray
    #       Max, 1, Yes, No, Burmese
    #        Gizmo, 2, No, No, Bengal
    #        Garfield, 4, Yes, Yes, Orange Tabby"""

    file = open( "cats.csv", "r" )
    text = file.read()
    file.close()

    for line in text.split( "\n" ):
        words = line.strip().split( "," )
        if len( words ) != 5:
            continue
        name, age, vaccinated, neutered, breed = words
        age = int( age.strip() )
        if vaccinated.strip().lower() == "yes":
            vaccinated = True
        else:
            vaccinated = False

        neutered = neutered.strip().lower() == "yes"
        
        cat = Cat( name.strip(), age, vaccinated, neutered, breed.strip() )
        try:
            cats.append( cat )
        except NameError:
            cats = []
            cats.append( cat )

    display( cats, "List of cats:" )

    vaccinatedNeuteredCats = []
    for cat in cats:
        if cat.isVaccinated() and cat.isNeutered():
            vaccinatedNeuteredCats.append( cat )

    display( vaccinatedNeuteredCats, "Vaccinated and neutered cats:" )
    
    
main()


Example cats.csv File


Minou, 3, Yes, Yes, stray
Max, 1, Yes, No, Burmese
Gizmo, 2, No, No, Bengal
Garfield, 4, Yes, Yes, Orange Tabby


Corresponding Output


List of cats:
=============
Cat: Minou, age: 3, vaccinated, neutered (stray)
Cat: Max, age: 1, vaccinated, not neutered (Burmese)
Cat: Gizmo, age: 2, not vaccinated, not neutered (Bengal)
Cat: Garfield, age: 4, vaccinated, neutered (Orange Tabby)

List of cats with new addition:
===============================
Cat: Minou, age: 3, vaccinated, neutered (stray)
Cat: Max, age: 1, vaccinated, not neutered (Burmese)
Cat: Gizmo, age: 2, not vaccinated, not neutered (Bengal)
Cat: Garfield, age: 4, vaccinated, neutered (Orange Tabby)

Vaccinated and neutered cats:
=============================
Cat: Minou, age: 3, vaccinated, neutered (stray)
Cat: Garfield, age: 4, vaccinated, neutered (Orange Tabby)


Question

Recreate the original program with its Cat class. Make sure that it will generate the same output shown above if fed the same cat information.

Document your code well, including the main(), getNewCat() and display() functions. Document the class using the same approach as in Part 2, below.
Store your program in a file called hw9_1.py and submit it to the Moodle HW9 PB1 section.




Problem #2: Of dogs and people...

PersonAndDog.jpg

(image from naturesmightypictures.blogspot.com)

Create a new program with the code below. Call it hw9_2.py.

# hw9_2start.py
# D. Thiebaut
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, dg ):
        self.name = n
        self.age  = a
        self.dog  = dg

    def getDog( self ):
        return self.dog
    
    # returns a string with the name and age.
    def __str__( self ):
        return "{0:1}, {1:1} years old".format( 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 "{0:1} (vaccinated)".format( self.tag )
        return "{0:1} (not vaccinated)".format( 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


         
# ================================================
#                     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 list of people, and their dog (if they own one)
    people = []
    
    # 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:
            p = Person(name, age, None  )
        else:
            p = Person(name, age, Dog( tag, vacc ) )

        # add this new person to the list
        people.append( p )

        
    # Display the list
    for person in people:
        
        if person.getDog() != None:
            print( person, ", has a dog: ", person.getDog(), sep="" )
        else:
            print( person, ", does not have a dog", sep="" )

main()


Your Assignment


  • Without modifying any of the classes, make your program output
    1. the list of people who have unvaccinated dogs
    2. the list of people without dogs
    3. the oldest person who has a dog


An example of the output of the solution program is shown below:

Joe, 23 years old has a dog:  Fido (vaccinated)
Debra, 30 years old has a dog:  Rex (not vaccinated)
Frida, 10 years old has a dog:  Ralph (vaccinated)
Maria, 21 years old has a dog:  Gizmo (vaccinated)
Frank, 31 years old does not have a dog
Millie, 25 years old has a dog:  Maxi (not vaccinated)

Debra, 30 years old has a non vaccinated dog called Rex
Millie, 25 years old has a non vaccinated dog called Maxi

Frank, 31 years old doesn't have a dog

The oldest person to own a dog is Debra, 30 years old and the dog is Rex (not vaccinated)


Store your program in a file called hw9_2.py and submit it to Moodle, in the HW9 PB2 section.



</source> </showafterdate>