CSC11 Homework 10 Solution Programs 2014

From dftwiki3
Revision as of 05:59, 23 April 2014 by Thiebaut (talk | contribs) (Program 2)
Jump to: navigation, search

--D. Thiebaut (talk) 06:53, 23 April 2014 (EDT)


Program 1


# hw10a.py
# Joyce Xue ( aa )
# (slightly edited by D. Thiebaut)
# 04.15.2014
#
# This program contains a class Cat that describe a cat with its name, age,
# being vaccinated or not, being neutered or not and breed
#
# To create an object of this type, simply use the constructor, as follows:
#
#        cat = Cat(name, age, vaccinated, neutered, breed)
#
# The methods supported are:
#
# isVaccinated(): returns if the cat is vaccinated
#
# isNeutered(): returns the  name of the planet with the largest diameter
#
# __str__(): convert the object to a string
# ------------------------------------------------------------------------------------------------------
class Cat:
    # contructor. Initialize all memebers.
    def __init__( self,name, age, vaccinated, neutered, breed):
        self._name=name
        self._age=age
        self._vac=vaccinated
        self._neu=neutered
        self._breed=breed

    #==================================================================
    # __str__() : When call print(cat), this function
    #                      automatically converts the cat to a string
    #==================================================================
    def __str__(self):
        # make up the return string by following the required format
        temp = "Cat: "+self._name+","+" age: "+str(self._age)+", "

        # convert boolean value to string
        if self._vac: temp=temp+"vaccinated, "
        else: temp=temp+"not vaccinated, "

        if self._neu: temp=temp+"neutered "
        else: temp=temp+"not neutered "

        temp=temp+"("+self._breed+")"
        
        return temp

    #==================================================================
    # isVaccinated(): return if the cat is vaccinated
    #==================================================================
    def isVaccinated(self):
        return self._vac

    #==================================================================
    # isNeutered(): return if the cat is neutered
    #==================================================================
    def isNeutered(self):
        return self._neu


#==================================================================
# getNewCat(): ask for user input to create a new
#                       cat and return it
#==================================================================
def getNewCat():
    # user input for name, age, if vaccinated, if neutered and breed
    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 )

#==================================================================
# display(): print each cat in a Cat collection
# L       - a list of cats
# caption - the subject of the list to be printed
#==================================================================
def display( L, caption ):
    # print the subject
    print( "\n\n"+caption )
    print( "=" * len( caption ) )
    # go over the list and print each cat's info
    for cat in L:
        print( cat )

#==================================================================
# main(): 
#  * creates a list of cat objects, displays it.
# 
#==================================================================
def main():
    # inital cats' info
    text="""Minou, 3, Yes, Yes, stray
            Max, 1, Yes, No, Burmese
            Gizmo, 2, No, No, Bengal
            Garfield, 4, Yes, Yes, Orange Tabby"""

    # use the text as the initial data, generate cats
    for line in text.split( "\n" ):
        # split each line into items
        words = line.strip().split( "," )
        # if data is not exactly 5, skip
        if len( words ) != 5:
            continue
        # set items to variables
        name, age, vaccinated, neutered, breed = words
        # convert age to int
        age = int( age.strip() )
        # convert user inputs to booleans
        if vaccinated.strip().lower() == "yes":
            vaccinated = True
        else:
            vaccinated = False

        neutered = neutered.strip().lower() == "yes"

        # construct a cat
        cat = Cat( name.strip(), age, vaccinated, neutered, breed.strip() )

        try:
            # add the cat to the list
            cats.append( cat )
        except NameError:
            # if the cats list is not initialized, initialize it and append the first cat
            cats = []
            cats.append( cat )

    # output the cat list
    display( cats, "List of cats:" )

    # let user input a new cat's info and append it into the list
    cats.append( getNewCat() )

    # output the list again
    display( cats, "List of cats with new addition:" )

    # -------------------------------------------------------------------
    # Code Addition
    # -------------------------------------------------------------------
    # Go through each cat and add those who is both vaccinated and neutered into a list
    vaccinatedNeuteredCats = []
    for cat in cats:
        if cat.isVaccinated() and cat.isNeutered():
            vaccinatedNeuteredCats.append( cat )

    # output the cats in this new list (both vaccinated and neutered)
    display( vaccinatedNeuteredCats, "Vaccinated and neutered cats:" )

    
# Main entry point for the program
main()


Program 2


# hw10b.py
# Katerina Popova ( af )
# (Slightly edited by D. Thiebaut)
# 04.15.2014
# =====================================================================
# A program containing 3 classes: Person, Dog, and ListPeopleDog
# Descpription of each class and its method is found within each class.
# This program creates a list object of people and their dog (if they have one).
# Only 1 dog per person, at most, is allowed in this program.
# The program gets the data from a string provided in main()
# An example of the output generated by the 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)
#
# =====================================================================

class Person:
    # a class containing 2 private member variables:
    # - name of the person (string)
    # - age (integer)
    # 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" )
    print ()

    # =====================================================
    # Challenge 1
    # Prints the list of people who have unvaccinated dogs.
    # =====================================================

    # for every item in the L list
    # get the person-dog binome
    for i in range( L.size()):
        p, d = L.getPersonDogAt( i )

        # if a person does not own a dog
        # continue (skip)
        if d == None:
            continue

        # if dog is not vaccinated
        # output the owner with the name of the dog
        if d.isVaccinated() == False:
            print ( "%s has a non vaccinated dog called %s."
                    % (p, d.getNameTag()))
    print()

    # =======================================
    # Challenge 2
    # Prints the list of people without dogs.
    # =======================================
    for i in range( L.size()):
        p, d = L.getPersonDogAt( i )

        # if a person does not own a dog
        # output their name 
        if d == None:
            print ( p, "doesn't have a dog." )

    print()

    # ========================================
    # Challenge 3
    # Displays the oldest person who has a dog.
    # ========================================

    # initializing a maxAge to 0
    maxAge = 0
    
    for i in range( L.size()):
        p, d = L.getPersonDogAt( i )

        # if person does own a dog
        if d != None:

            # if the age of a person is
            # bigger than maxAge
            # the new maxAge is reset
            # and this person and his dog
            # are initialized in new variables
            if p.getAge() > maxAge:
                maxAge = p.getAge()
                oldestPerson = p
                dogOldestPerson = d

    # desired output
    print( "The oldest person to own a dog is %s and the dog is %s."
           % (oldestPerson, dogOldestPerson))
 

# main entry point for the program
main()