using, understanding, updating, designing and implementing classes chapters 5 (5.4) and partially 6...

61
Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts of 7.1 and 7.2 are explained, but different examples are given Robot class implementation details

Upload: job-evans

Post on 02-Jan-2016

222 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Using, Understanding, Updating, Designing and Implementing ClassesChapters 5 (5.4) and partially 6 and 7

in Chapter 6, up to 6.2.3in Chapter 7

concepts of 7.1 and 7.2 are explained, but different examples are given

Robot class implementation details

Page 2: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

An Overview of Object Oriented (OO) Programming

In OO programming Data and Functions for a specific concept combined togethercalled a “class”

gives the general definitionprovides reusability

change the values of data and you end up with different objects with the same functionality

can be used by several applications

Page 3: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

An Overview of Object Oriented (OO) Programming An example without OO programming - Calendar display program

needs several utility functions leap year check day of week function

day

day of week

month

MonthName leap year

yearData

Functions

. . .

Is this structure complex? • for some yes, for some no

Page 4: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

An Overview of Object Oriented (OO) ProgrammingOO version - Calendar display program

Date concept is developed as a class data and functions combined together from the point of view of

programmer

Did you like this? • for some yes, for some no

OO approach is more suitable for a human being• human cognition is mostly based on objects

Data (day, month, year)

FunctionsDay of the weekMonth name…

Page 5: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Using classes (Section 5.4) Another way of looking at OO programming

Using only string, int, and double limits the kinds of programs we can write (games, calendars, …)

why don’t we have off-the-shelf components for programming? Using object-oriented techniques means we develop new types

that correspond to the real-world objects we’re writing code for for example: an online roulette game, chess, pişti, tavla some write for us and we use them

off-the-shelf components

New types are called classes, variables are called objects User defined classes

Tapestry Classes: classes written by Owen Astrachan (author of our book) for educational and practical purposesBigInt and other classes (like Date and Dice) that we will see

Robot class is not a Tapestry class, but it is a user-defined one

Page 6: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

The class DiceComputer simulated dice

not real dice, but have the same functionality random number between 1 and “number of sides”

in this class, we can have dice objects with any number of sides

Accessible to client programmers using #include "dice.h"Why are quotes used instead of angle brackets < > ?

Dice objects will work as pseudo-random number generatorsNot truly random in a strict mathematical senseStill useful to introduce randomness into programs

Page 7: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

The class DiceA small class

better to show basic implementation details on a small example

Statenumber of sidesroll count

Member functions

Dice(int sides); // constructor – constructs a die with given number of sides

int Roll(); // return the random rollint NumSides() const; // how many sides int NumRolls() const; // # of times this die rolled

Page 8: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Using the class Dice

cout << "rolling " << cube.NumSides() << " sided die" << endl; cout << cube.Roll() << endl; cout << cube.Roll() << endl; cout << "rolled " << cube.NumRolls() << " times" << endl;

member functions

Dice cube(6); // construct six-sided die

Dice dodeca(12); // construct twelve-sided die

See roll.cpp for full program

constructor

Page 9: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

What you can and cannot do with Dice Cannot define a Dice object without specifying number of sides

Not a bug, just a design decision You may modify the class implementation to have a default constructor

Dice d(2); // ok, like a coinDice cube; // NOT ok, won’t compile

How random is a Dice object – how can we test this? Calculate number of rolls needed to obtain a target sum

repeat this several times and find the average in order to approach to the expected value

repeat for all target values between 2 and 12 using two 6-sided dice

Any expectations? Needs probability knowledge. See testdice.cpp

Page 10: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Classes: From Use to Implementation (Chapter 6.1)

We’ve used several classesA class is a collection of objects sharing similar characteristicsA class is a type in C++, like int, bool, doubleA class encapsulates state and behavior

string (this is a standard class), needs #include <string>Objects: "hello", "there are no frogs", …Methods: substr(…), length(…), find(…),operators such as + and <<

Date needs #include "date.h"Objects: December 7, 1949; November 22, 1963Some Methods: MonthName(), DayName(), operator - etc.

Page 11: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

State and BehaviorBehavior of a class is what a class does

described in verbs babies eat, cry dice are rolled

In OO programming terminology, behavior is defined by public member functionsfor Dice class, member functions are the Dice constructor, NumRolls(), NumSides() and Roll()

State of a class depends on physical propertiescars have four wheels, different colorsdice have a number of sidesIn OO programming, State is defined by private data in the header

file also called member data, instance variables, or data fields for Dice class, mySides and myRollCount (see dice.h)

Page 12: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

ObjectsAn object is an instance of a class

When created, in memory a set of private data members are allocated and initialized according to the constructor function In other words, each object has a different state

However, objects share member function implementationsThe same function name is used on all objects of the same

class

When a member function is called on an object, that object’s private data members are accessed and/or modified

Page 13: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Anatomy of the Dice classThe class Dice

Objects: 6-sided dice, 32-sided dice, one-sided diceMethods: Roll(), NumSides(), NumRolls()

A Dice object has state and behaviorEach object has its own state, just like each int has its own

value Number of times rolled, number of sides

All objects in a class share method (member function) implementations, but access their own stateHow to respond to NumRolls()? Return my own # of rolls

Page 14: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

The header file dice.hNeed #include "dice.h“ to use the dice class

class Dice{ public: Dice(int sides); // constructor int Roll(); // return the random roll int NumSides() const; // how many sides int NumRolls() const; // # times this die rolled private: int myRollCount; // # times die rolled int mySides; // # sides on die};

The compiler reads this header file to know what’s in a Dice object

Each Dice object has its own mySides and myRollCount generally initialized by the constructor function

Page 15: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

The header file is a class declaration

Private data are called instance variables (a.k.a. private data members)each object has its own private data

Public functions are called methods, member functions, these are called by client programsAll objects of a particular class share the method implementations

The header file is an interface, not an implementationDescription of behavior, analogy to DVD player

Do you know how DVD player operates? You do not mind, just press the button (interface) and watch!

Square root button on a calculator, how does it calculate? Do you care?

Header file provides information to compiler and to programmersCompiler determines what methods/member functions can be called

for the objects of a classProgrammer reads header file to determine what methods are

available, how to use them and other information about the class

Page 16: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

What to know?Client programmer (programmer who uses the classes) needs

to know the interface from the header filepublic member functions and constructors

parameters, how they behavedoes not need to know private data (instance variables)does not need to know how the member functions are

implemented just need to know where (in which file) it is implemented in order to

include the implementation file in the project

As a good programmer who will design and/or update classes, YOU may need to know about the class implementations

Page 17: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

From interface to use, the class Dice

#include "dice.h"int main(){ Dice cube(6); Dice dodeca(12); cout << cube.Roll();

int k; for(k=0; k < 6; k++) { cout << dodeca.Roll(); } return 0;}

Objects constructed

0

myRollCount mySides

6

cube

0

myRollCount mySides

12

dodeca

Method invoked

1

myRollCount mySides

6

cube

After for loop

6

myRollCount mySides

12

dodeca

Page 18: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

From Interface to Implementation

The header file provides compiler and programmer information about how to use a class, but no information about how the class is implemented Important separation of concepts

use without complete understanding of implementation

Implementation file is a cpp file with no main function member function and constructor bodies are given

sometimes some other functions are also given

Page 19: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementation: the .cpp file In the implementation file we see all member functions

written, similar idea as the functions we’ve seen so farEach function has a name, parameter list, and return typeA member function’s name includes its class name

return_type class_name :: function_name (parameters)A constructor is a special member function for initializing an

object, constructors have no return typeclass_name :: class_name (parameters)

:: is the scope resolution operatorspecifies the class of the function

Each method can access private data members of an object (the object on which this member function will operate)This way, at each invocation, member function can access

different objects’ private data cube.NumSides() compared to dodeca.NumSides()

dot operator . is used when a member function is called

Page 20: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

dice.cpp (Implementation file) – 1/2

Dice::Dice(int sides)// postcondition: all private fields initialized

{ myRollCount = 0; mySides = sides;}

int Dice::NumSides() const// postcondition: return # of sides of die { return mySides;}

Constructor

Page 21: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

dice.cpp (Implementation file) – 2/2

int Dice::NumRolls() const// postcondition: return # of times die has been rolled{ return myRollCount;}

int Dice::Roll()// postcondition: number of rolls updated// random 'die' roll returned { RandGen gen; // random number generator myRollCount= myRollCount + 1; // update # of rolls return gen.RandInt(1,mySides); // in range [1..mySides]}

Page 22: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Understanding Class Implementations

Private data members are global such that they are accessible by all class member functionse.g. in the implementation of Roll function, mySides and myRollCount are not defined, but used

Page 23: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Understanding Class Implementations

Constructors should assign values to each instance variablethis is what construction isnot a rule, but a general programming style

Page 24: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Understanding Class Implementations

Methods (member functions) can be broadly categorized as accessors or mutatorsAccessor methods may access information about an object but

do not change the state (private data members)Dice::NumRolls() and Dice::NumSides()are accessor

methods since they do not change the private data membersMutator methods change the state of an object

Dice::Roll(), since it changes an object’s myRollCount

Page 25: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Class Implementation Heuristics

All data should be privateProvide accessor and mutator member functions as needed

Make accessor functions constby putting const after all parameters

in both class definition (header file) and class implementation A const function cannot modify the state of an object

precaution against poor implementations compilers do not allow to update private data in const functions

int Dice::NumSides() const// postcondition: return # of sides of die { return mySides;}

Page 26: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

RandGen Class A Tapestry class for random number generation Add randgen.cpp to your project and have #include "randgen.h" in your program

Four member functionsint RandInt(int max = INT_MAX);

returns a random integer in [0..max) int RandInt(int low, int max);

returns a random integer in [low..max] double RandReal();

returns a random double value in [0..1) double RandReal(double low, double max);

returns a random double value in the range of [low..max]

see numberguess.cpp for an example program that use RandGen

Page 27: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Overloading

In RandGen class, there are two different functions named RandInt so as RandReal

Using the same name for more than one function is called overloading. They are differentiated by parameter types and/or return types.

All member and free functions can be overloaded.

Page 28: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

The class DateThe class Date is accessible to client

programmers#include "date.h"

to get access to the classThe compiler needs this information.It may also contain documentation for the programmer

Link the implementation in date.cppAdd this cpp to your project

The class Date models a calendar date:Month, day, and year make up the state of a Date

objectDates can be printed, compared to each other, day-

of-week determined, # days in month determined, many other behaviorsBehaviors are called methods or member functions

Page 29: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Constructing Date objects – see usedate.cpp Date today; Date republic(10,29,1923); Date million(1000000); Date y2k(1,1,2000); cout << "today: " << today << endl; cout << "Republic of Turkey has been founded on: "

<< republic << endl;

cout << "millionth day: " << million << endl; OUTPUT

today: November 20 2007Republic of Turkey has been founded on: October 29 1923millionth day: November 28 2738

Page 30: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Constructing/defining an object

Date objects (as all other objects) are constructed when they’re first definedThree ways to construct a Date

default constructor, no params, initialized to today’s date single long int parameter, number of days from January 1, 1 three params: month, day, year (in this order).

Constructors for Date objects look like function callsconstructor is special member functionDifferent parameter lists mean different constructors

Once constructed, there are many ways to manipulate a Date Increment it using ++, subtract an integer from it using -, print it

using cout, …MonthName(), DayName(), DaysIn(), …

See date.h for more info on date constructors and member functions

Page 31: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Date Member FunctionsDate MidtermExam(8,3,2009);

Construct a Date object given month, day, year

MidtermExam.DayName()Returns the name of the day (“Saturday” or “Sunday”, or ...)

in this particular case, returns “Saturday” since November 24,2007 is a Saturday

MidtermExam.DaysIn()Returns the number of days in the particular month

in our case return 30, since November 2007 has 30 days in it

Add, subtract, increment, decrement days from a dateDate GradesDue = MidtermExam + 7;GradesDue is December 1, 2007

Let’s see usedate.cpp in full and datedemo.cpp now

Page 32: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Example: Father’s day (not in book) Father’s day is the third Sunday of June

write a function that returns the date for the father’s day of a given year which is the parameter of the function

In main, input two years and display father’s days between those years

Date fathersday(int year)// post: returns fathers day of year{Date d(6,1,year); // June 1

while (d.DayName() != "Sunday") { d += 1;

}

// d is now the first Sunday, third is 14 days later return d + 14;}

See fathersday.cpp for full program

Page 33: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

What if there were no date class?It would be very cumbersome to deal with dates without a

date classimagine banking applications where each transaction has

associated date fields

Classes simplify programming they are designed and tested.then they can be used by programmers

You are lucky if you can find ready-to-use classes for your needsotherwise ???

Page 34: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Updating a Class (not in book)

Suppose you want to add more functionality to the date classneed to change the header file (date.h)need to add implementation of new function(s) to

date.cppExample: a new member function to calculate and

return the remaining number of days in the object’s month any ideas? do you think it is too difficult?have a look at the existing member functions and see if

they are useful for you

Page 35: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Updating a Class (not in book)We can make use of DaysIn member function

Prototype in Date class (add to the header file)int RemainingDays () const;

Implementationint Date::RemainingDays () const{return DaysIn() - myDay;

}In a member function implementation private

data and other member functions referred without the dot operator. They operate on the object for which the member

function is called

Page 36: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Updating a Class (not in book)

Example use of RemainingDays

Date today;cout << "There are " << today.RemainingDays() << " days left in the current month" << endl;

See date_modified.h, date_modified.cpp and demodatemodified.cpp

When RemainingDays is called,call to DaysIn is for object today

since it is the object on which RemainingDays is calledmyDay is today’s myDay

since it is the object on which RemainingDays is called

Page 37: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Design Heuristics What is an heuristic?

a set of guidelines and policies may not be perfect, but mostly useful exceptions are possible

e.g. making all state data private is an heuristicwe will see two more class design heuristics

cohesion and coupling Make each function or class you write as single-purpose as possible

Avoid functions that do more than one thing, such as reading numbers and calculating an average, standard deviation, maximal number, etc., If source of numbers changes how do we do statistics? If we want only the average, what do we do?

Classes should embody one concept, not several. This heuristic is called Cohesion.

Functions (both member and free functions) and classes should be cohesive, doing one thing rather than several things.

Easier to re-use in multiple contexts and several applications

Page 38: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Design Heuristics continued (Coupling)

Coupling: interactions among functions and classesFunctions and classes must interact to be useful

One function calls anotherOne class uses another, e.g., as the Dice::Roll()

function uses the class RandGen

Keep interactions minimal so that classes and functions don’t rely too heavily on each other: it is better if we can change one class or function (to make it more efficient, for example) without changing all the code that uses it

Some coupling is necessary for functions/classes to communicate, but keep coupling loose and be aware of them

Page 39: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Designing classes from scratch

Chapter 7 (especially 7.1 and 7.2)a good development strategy

“iterative enhancement” approachREAD those sections, you are responsible

we won’t cover all, because it takes too much time and becomes boring!

I will give a simpler class design example hereless iterativebut similar application

Page 40: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementing Classes – Iterative Enhancement

It is difficult to determine what classes are needed, how they should be implemented, which functions are required

Experience is a good teacher, failure is also a good teacher

Good design comes from experience, experience comes from bad design

Design and implementation combine into a cyclical process: design, implement, re-visit design, re-implement, test, redesign, …

Grow a working program, don’t do everything at the same time

Page 41: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Design and Implementation Heuristics

A design methodology says that

“look for nouns, those are classes”, and then “look for verbs and scenarios, those are member functions”

Not every noun is a class, not every verb is a member functionsome functions will be free ones or will be implemented in main

(these are design decisions)

Concentrate on behavior (member functions) first when designing classes, then on state (private part)private data will show its necessity during the implementation of

the public part

Page 42: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Example class design Quiz class

simple quiz of addition questions Scenarios

user is asked a number of questionscomputer asks random questionsuser enters his/her answer

correct / not correct feedback and correct answer are displayed

correct answers are counted There may be two classes

questionquiz

but I will have one class which is for question and implement quiz in mainBe careful! This example is similar but different than the one in book

(Sections 7.1 and 7.2)

Page 43: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class

Question behaviors (verbs). A question iscreatedaskedansweredchecked

These are candidate member functionsmore? less? we will see

A question is simply two random integers (to keep it simple say between 1 and 100) to be addedthose numbers are definitely in class private datawhat else?

we will see

Page 44: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class

simplemathquest.h (first draft)class Question

{

public:

Question(); // create a random question

void Ask() const; // ask the question to user

int GetAnswer() const; //input and return user answer

bool IsCorrect(int answer) const; //check if correct

private:

int myNum1; // numbers used in question

int myNum2;

};

Page 45: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Quiz program (main - simplequiz.cpp) – Draft 1

int qNum = PromptRange("how many questions: ",1,5); int k, ans, score =0;

for(k=0; k < qNum; k++) {

Question q;q.Ask();ans = q.GetAnswer();if (q.IsCorrect(ans)){ cout << ans << " correct answer" << endl << endl;

score++;}else{ cout << "Sorry, not correct. Correct answer was " <<

???????? << endl << endl;}

} cout << "Score is " << score << " out of " << qNum << " = " << double(score)/qNum * 100 << "%" << endl;

Something missing: a function to return the correct result

Page 46: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class simplemathquest.h (second draft)

class Question

{

public:

Question(); // create a random question

void Ask() const; // ask the question to user

int GetAnswer() const; //input and return user answer

bool IsCorrect(int answer) const; //check if correct

int CorrectAnswer() const; //return the correct answer

private:

int myNum1; // numbers used in question

int myNum2;

};

Page 47: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Quiz program (simplequiz.cpp) – Draft 2

int qNum = PromptRange("how many questions: ",1,5); int k, ans, score =0;

for(k=0; k < qNum; k++) {

Question q;q.Ask();ans = q.GetAnswer();if (q.IsCorrect(ans)){ cout << ans << " correct answer" << endl << endl;

score++;}else{ cout << "Sorry, not correct. Correct answer was " <<

q.CorrectAnswer() << endl << endl;}

} cout << "Score is " << score << " out of " << qNum << " = " << double(score)/qNum * 100 << "%" << endl;

Page 48: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class implementationsimplemathquest.cpp (draft 1)

void Question::Ask() const

{

cout << myNum1 << " + " << myNum2 << " = ";

}

Question::Question(){ RandGen gen; myNum1 = gen.RandInt(1,100); myNum2 = gen.RandInt(1,100);}

constructor

int Question::GetAnswer() const

{

int ans;

cin >> ans;

return ans;

}

Ooops! We did not access or modify the object’s state. It is better not to have this function

as a member function

Page 49: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class implementationsimplemathquest.cpp (draft 1) - continued

Problem: Where is the correct answer stored? a new private data field would be good

bool Question::IsCorrect(int answer) const

{

return ?????? == answer;

}

int Question::CorrectAnswer() const

{

return ??????;

}

Page 50: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class simplemathquest.h (final)

class Question

{

public:

Question(); // create a random question

void Ask() const; // ask the question to user

bool IsCorrect(int answer) const; //check if correct

int CorrectAnswer() const; //return the correct answer

private:

int myNum1; // numbers used in question

int myNum2;

int myAnswer; // store the answer

};

int GetAnswer() const; //input and return user answer

Page 51: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class implementation simplemathquest.cpp (final)

Question::Question(){ RandGen gen; myNum1 = gen.RandInt(1,100); myNum2 = gen.RandInt(1,100); myAnswer = myNum1 + myNum2;}

void Question::Ask() const{ cout << myNum1 << " + " << myNum2 << " = ";}

int Question::GetAnswer() const{

int ans;cin >> ans;return ans;

}

Page 52: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Question class implementation simplemathquest.cpp (final) - continued

bool Question::IsCorrect(int answer) const

{

return myAnswer == answer;

}

int Question::CorrectAnswer() const

{

return myAnswer;

}

Page 53: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Quiz program (simplequiz.cpp) – Final

int qNum = PromptRange("how many questions: ",1,5);

int k, ans, score =0;

for(k=0; k < qNum; k++)

{

Question q;

q.Ask();

cin >> ans;

if (q.IsCorrect(ans))

{ cout << ans << " correct answer" << endl << endl;

score++;

}

else

{ cout << "Sorry, not correct. Correct answer was " << q.CorrectAnswer() << endl << endl;

}

}

cout << "Score is " << score << " out of " << qNum

<< " = " << double(score)/qNum * 100 << "%" << endl;

Page 54: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Thinking furtherWhat about a generic question class

not only addition, but also other arithmetic operationsmay need another private data member for the operation

that is also useful to display the sign of operation in Askmay need parameter in the constructor (for question type)will do this week in recitations

What about questions for which answers are strings?maybe our generic question class should have string type answers to serve

not only to arithmetic questions but any type of questions see Sections 7.1 and 7.2

Page 55: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementation of Robot Class - 1

Your next homework will be about updating the Robot class you will add some new member functions that requires to deal with

robots.h and robots.cpp files (actually in the homework, you will use an updated class for which the file names are robots_modified.h and robots_modified.cpp)

and you will use those newly added functions in an application It is a good idea to have a look at how this class is implemented

It is designed and implemented by Ersin Karabudak Albert Levi and I have made some changes later

Robot class implementation is quite complexRobot, RobotWindow and RobotWorld are different structures

we will not deal with RobotWindow and RobotWorld, but the implementation file contains robot class implementation and the details of RobotWindow and RobotWorld too. Do not get confused.

Robots are maintained as a circular doubly linked list it is a data structure that uses pointers (probably will see in CS202) but do not get thrilled! you will not need those complex structures for the

member functions that you will add.

Some details you have to know will be given now and more details will be given in recitations this week

Page 56: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementation of Robot Class - 2

enum Direction { east, west, north, south };

enum Color { white, yellow, red, blue, green, purple, pink, orange };

class Robot

{

public:

Robot (int x, int y, Direction dir = east, int things = 0);

~Robot ();

void Move (int distance = 1);

bool Blocked ();

void TurnRight ();

bool PickThing ();

bool PutThing ();

void SetColor (Color color);

bool FacingEast ();

bool FacingWall ();

bool CellEmpty ();

bool BagEmpty ();

constr

uctor

Destructor (not needed in HW)

member functions

continued on the next slide

Page 57: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementation of Robot Class - 3

private:int xPos; //x coordinate of the location of robotint yPos; //y coordinate of the location of robotDirection direction; //current direction of robotColor color; //current color of robotint bag; //current # of things in the bag of robotbool stalled; //true if the robot is deadbool visible; //true if the robot is visible

Robot *next;Robot *prev;static Robot *list;

friend struct RobotWindow; };

Private Data

pointers for the data structure you will not need them

RobotWindow may refer Robot’s private data

Page 58: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementation of Robot Class - 4

Previous two slides were in the robots.h (now robots_modified.h). Now let’s go over the robots.cpp (now robots_modified.cpp) file in

VC++ environment

In the next homework, you are going to add some member functions to the robot class Some of the member functions will be done in recitations this week

Hints try to use currently available member functions

e.g. for PickAll, try to use PickThing in a loop rather than writing some thing similar to PickThing

do not hesitate to modify or access private data members when needed e.g. you will need such an update for Turn function

if you change the state of a robot within the current cell, use the following to update the windowtheRobotWindow->Redraw(this);

Page 59: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Implementation of Robot Class - 5

Hints for the next homework (cont’d) you will need to use the function called IsPressed defined in miniFW.h

(it is going to be renamed as miniFW_modified.h) so include this header file to your main program file this function (IsPressed) is to check whether a key (e.g. an arrow key) is

pressed or not - details are in recitations

Some other changes in the Robot World and Robot Class If a robot hits another robot, both die! No automatic message is displayed when a robot dies Now the bag content is written in robots (if not zero)

Use robots_modified.h, robots_modified.cpp, miniFW_modified.h and miniFW_modified.cpp files in HW3 They will be provided to you in the homework and/or recitation package

Page 60: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Functions that return values from the Robot ClassRobot class has several member functions

Move, TurnRight and SetColor are void functionsRobot class also has member functions that return values. Some are

below:bool Blocked ()

is the robot blocked?

bool FacingEast () is the robot facing east?

See RobotWorld.pdf file for the complete list of those functions.

Page 61: Using, Understanding, Updating, Designing and Implementing Classes Chapters 5 (5.4) and partially 6 and 7 in Chapter 6, up to 6.2.3 in Chapter 7 concepts

Free functions and member functionsThe functions in <cmath> are free functions, they aren’t

part of a classC++ is a hybrid language, some functions belong to a class,

others do notJava and C# are pure object-oriented languages, every function

belongs to a classSimilarly, IsLeapYear is also a free functionActually any function that does not operate on an object

is a free functionHowever, Move, TurnRight are functions for Robot

classthey are not free, they operate on robots onlythat is why they are called member functionsall robot functions are member functions