1 Chapter 6: Classes Chapter Goals To be able to implement your own classesTo be able to implement...

32
1 Chapter 6: Classes Chapter 6: Classes Chapter Goals Chapter Goals To be able to implement your own To be able to implement your own classes classes To master the separation of interface To master the separation of interface and implementation and implementation To understand the concept of To understand the concept of encapsulation encapsulation To design and implement accessor and To design and implement accessor and mutator member functions mutator member functions To understand object construction To understand object construction To learn how to distribute a program To learn how to distribute a program over multiple source files over multiple source files

Transcript of 1 Chapter 6: Classes Chapter Goals To be able to implement your own classesTo be able to implement...

Page 1: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

11

Chapter 6: ClassesChapter 6: Classes

Chapter GoalsChapter Goals• To be able to implement your own classes To be able to implement your own classes • To master the separation of interface and To master the separation of interface and

implementation implementation • To understand the concept of encapsulation To understand the concept of encapsulation • To design and implement accessor and To design and implement accessor and

mutator member functions mutator member functions • To understand object construction To understand object construction • To learn how to distribute a program over To learn how to distribute a program over

multiple source files multiple source files

Page 2: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

22

Discovering ClassesDiscovering Classes (1) (1) If you find yourself defining a number of If you find yourself defining a number of

related variables that all refer to the same related variables that all refer to the same concept, define a class that abstracts the concept, define a class that abstracts the concept and contains these variables as concept and contains these variables as data fields. data fields.

Example:Example: • Suppose you are reading information about Suppose you are reading information about

computers: computers: Model Name Model Name Price Price Score between 0 and 100 Score between 0 and 100

• Sample data: Sample data: ACMA P600, 995, 77ACMA P600, 995, 77 Alaris Nx868, 798, 57 Alaris Nx868, 798, 57

Page 3: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

33

Discovering ClassesDiscovering Classes (2) (2)

Sample code excerpt: Sample code excerpt: if (next_score / next_price > if (next_score / next_price >

best_score / best_price) { best_score / best_price) { best_name = next_name; best_name = next_name; best_score = next_score; best_score = next_score; best_price = next_price; best_price = next_price; } } Each of these sets of variables Each of these sets of variables

describes a describes a productproduct (a best product, (a best product, and the next product read in). We and the next product read in). We need to develop a Product class. need to develop a Product class.

Page 4: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

44

Discovering Classes (bestval.cpp)-1Discovering Classes (bestval.cpp)-1 #include#include <iostream> <iostream>  #include#include <string> <string>    usingusing namespacenamespace std; std;   int  int mainmain() {  () {      string best_name = "";    string best_name = "";    double best_price = 0;    double best_price = 0;    int best_score = 0;    int best_score = 0;      bool more =     bool more = truetrue;;        whilewhile (more) {  (more) {         string next_name;       string next_name;       double next_price;       double next_price;       int next_score;       int next_score;         cout << "Please enter the model name: ";       cout << "Please enter the model name: ";              getlinegetline(cin, next_name);(cin, next_name);       cout << "Please enter the price: ";       cout << "Please enter the price: ";       cin >> next_price;       cin >> next_price;       cout << "Please enter the score: ";       cout << "Please enter the score: ";       cin >> next_score;       cin >> next_score;       string remainder;        string remainder; /* read remainder of line *//* read remainder of line */              getlinegetline(cin, remainder); (cin, remainder);

Page 5: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

55

Discovering Classes (bestval.cpp)-2Discovering Classes (bestval.cpp)-2

          ifif (next_score / next_price > (next_score / next_price > best_score / best_price){  best_score / best_price){ 

         best_name = next_name;best_name = next_name;         best_score = next_score;best_score = next_score;         best_price = next_price;best_price = next_price;

}     }     cout << "More data? (y/n) ";cout << "More data? (y/n) ";

string answer; string answer; getlinegetline(cin, answer);(cin, answer); ifif (answer != "y") more = (answer != "y") more = falsefalse;;

} }   cout << "The best value is " << best_name cout << "The best value is " << best_name      << " (Score: " << best_score      << " (Score: " << best_score      << " Price: " << best_price << ")\n";      << " Price: " << best_price << ")\n";   returnreturn 0; 0;

}}   

Page 6: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

66

InterfaceInterface To define a class, we first need to specify an To define a class, we first need to specify an

interfaceinterface. .

The interface consists of all member functions we The interface consists of all member functions we want to apply to objects of that type. want to apply to objects of that type.

The interface is specified in the The interface is specified in the class definitionclass definition. .

Example:Example: Product class member functions: Product class member functions: • Make a new product. Make a new product. • Read in a product object. Read in a product object. • Compare two products and find out which one Compare two products and find out which one

is better. is better. • Print a product. Print a product.

Page 7: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

77

Interface (cont.)Interface (cont.)

ProductProduct class header class header

class Product{class Product{public:public:  Product();  Product();  void read();  void read();  bool is_better_than(Product b) const;  bool is_better_than(Product b) const;  void print() const;  void print() const;private:private:  …   … implementation detailsimplementation details}; };

Page 8: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

88

Interface (Syntax 6.1 : Class Definition)Interface (Syntax 6.1 : Class Definition) General syntaxGeneral syntax

class class Class_name Class_name { { public:public:

-constructor declarations -constructor declarations -member function (operations) -member function (operations)

declarationsdeclarationsprivate:private:

-data fields -data fields -private functions-private functions

}; };

Purpose:Purpose: Define the interface and data fields of a Define the interface and data fields of a class. class.

Page 9: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

99

Interface (Syntax 6.1 : Class Definition)Interface (Syntax 6.1 : Class Definition)

Example:Example:

class Point { class Point { public: public: Point (double xval, double yval); Point (double xval, double yval); void move(double dx, double dy); void move(double dx, double dy); double get_x() const; double get_x() const; double get_y() const; double get_y() const;

private: private: double x; double x; double y; double y;

}; };

Page 10: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1010

Class Interface (cont.)Class Interface (cont.)

The class interface is usually placed The class interface is usually placed in “.h” (header) file.in “.h” (header) file.

The name of the file is The name of the file is “<class_name>.h”“<class_name>.h”

The interface must be included The interface must be included inside: #ifndef … #endif inside: #ifndef … #endif preprocessor statements preprocessor statements • This defines a macro that avoids This defines a macro that avoids

multiple declarations of same elementsmultiple declarations of same elements

Page 11: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1111

Class Interface (cont.)Class Interface (cont.)

Example of header file for previous class: Example of header file for previous class:

// File: Point.h// File: Point.h#ifndef __POINT_H__#ifndef __POINT_H__#define __POINT_H__#define __POINT_H__

class Point { class Point { public: public:

Point (double xval, double yval); Point (double xval, double yval); void move(double dx, double dy); void move(double dx, double dy); double get_x() const; double get_x() const; double get_y() const; double get_y() const;

private: private: double x; double x; double y; double y;

}; };

#endif#endif

Final implementation will be in file: “Point.cpp” …Final implementation will be in file: “Point.cpp” …

Page 12: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1212

InterfaceInterface The first member function is a The first member function is a constructorconstructor: the function that : the function that

is is used to initialize new objectsused to initialize new objects. . This constructor has This constructor has no parametersno parameters so it is called a so it is called a default default

constructorconstructor.. Default constructors are automatically used when you Default constructors are automatically used when you

construct an object without parameters. construct an object without parameters.

Example:Example: Product best; /* default construction */Product best; /* default construction */

Every class Every class should have a default constructorshould have a default constructor, and there , and there might be other constructors. might be other constructors.

The read() member function is a The read() member function is a mutatormutator function function - an - an operation that modifies the object. operation that modifies the object.

The last two member functions are The last two member functions are accessoraccessor functions functions - - functions that query the object for some information without functions that query the object for some information without changing it. changing it.

The The keyword constkeyword const indicates that the indicates that the implicit parameter implicit parameter object is not modified by the member functionobject is not modified by the member function. .

Page 13: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1313

EncapsulationEncapsulation Classes are broken into public and private Classes are broken into public and private

sections. sections. The data items (attribute fields) are defined in the The data items (attribute fields) are defined in the

private sections of the class definition. private sections of the class definition. Example:Example:

class Product { class Product { public: public:

Product(); Product(); void read(); void read(); bool is_better_than(Product b) const;bool is_better_than(Product b) const;void print() const; void print() const;

private: private: string name; string name; double price; double price; int score; int score;

};};

Page 14: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1414

Encapsulation (cont.)Encapsulation (cont.)

Only constructors and member functions Only constructors and member functions can access private data. can access private data.

Hiding data is called Hiding data is called encapsulationencapsulation. .

Encapsulation forces Encapsulation forces indirect accessindirect access to the to the data, guaranteeing that it cannot data, guaranteeing that it cannot accidentally be put in an incorrect accidentally be put in an incorrect statestate. . • The unique access is through member The unique access is through member

functionsfunctions

Goal is to avoid uncontrolled modifications to data object.

Page 15: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1515

Member FunctionsMember Functions Each member function advertised (prototype is Each member function advertised (prototype is

given without implementation) in the class given without implementation) in the class interface must be implemented separately. interface must be implemented separately.

A A Class_nameClass_name:::: prefix makes it clear that we are prefix makes it clear that we are defining a member function for that class. defining a member function for that class.

The operator The operator :::: is is name resolution operator. name resolution operator.

Example: Example:

Product::Product() { Product::Product() { … … function body …function body …

}}void Product::read() { void Product::read() {

… … function body …function body …}}

Page 16: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1616

Member Functions (cont.)Member Functions (cont.) A member function is called A member function is called

objectobject.function_name(…).function_name(…)

The object to which is applied is the The object to which is applied is the implicit object.implicit object. Any data field used in a member function corresponds then Any data field used in a member function corresponds then

to the particular data field in the implicit object.to the particular data field in the implicit object. Example:Example:

Product next, other; Product next, other; // automatically applies default// automatically applies default// constructor to initialize // constructor to initialize // objects next and other// objects next and other…………..next.read();next.read(); // applies method read() to next// applies method read() to next

other.read()other.read()// applies method read() to other// applies method read() to other

Page 17: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1717

Const Member FunctionsConst Member Functions When the keyword const is used in the When the keyword const is used in the

declaration, it must also be placed in the declaration, it must also be placed in the member function definition. member function definition. Example:Example:

void Product::print() const { void Product::print() const { cout << name cout << name

<< " Price: " << price << " Price: " << price << " Score: " << score << "\n"; << " Score: " << score << "\n";

} } The keyword const indicates that The keyword const indicates that the the

member function will not modify the member function will not modify the object that called itobject that called it. .

Page 18: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1818

Example for Project 1Example for Project 1This example shows one possible way to specify the class to manage This example shows one possible way to specify the class to manage the rectangles that need to be drawn as part of Project 1. But be aware the rectangles that need to be drawn as part of Project 1. But be aware that there are better options…that there are better options…

//File: Rectangle.h//File: Rectangle.h#ifndef __RECTANGLE_H__#ifndef __RECTANGLE_H__#define __RECTANGLE_H__#define __RECTANGLE_H__#include “Point.h”#include “Point.h”using namespace std; using namespace std; class Rectangle { class Rectangle { public: public:

void setTo(const Point& ulc, const Point lrc); void setTo(const Point& ulc, const Point lrc); void setToFillBlack(); void setToFillBlack();

void draw() const; void draw() const; private: private:

Point ul, lr; // upper left & lower right cornersPoint ul, lr; // upper left & lower right cornersbool isDark; // true => fill black when drawingbool isDark; // true => fill black when drawing

void void fillBlackfillBlack(); (); //to fill when drawing, if needed//to fill when drawing, if needed

}; }; #endif#endif

Page 19: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

1919

Member Functions (Rectangle)Member Functions (Rectangle) Let’s implement some of the member Let’s implement some of the member

functions: (comments are missing)functions: (comments are missing)

// File: Rectangle.cpp// File: Rectangle.cpp

#include “Rectangle.h”#include “Rectangle.h”

… … other includes …other includes …

void Rectangle::setTo(const Point& ulc, const Point lrc) {void Rectangle::setTo(const Point& ulc, const Point lrc) {

ul = ulc; // upper left cornerul = ulc; // upper left corner

lr = lrc; // lower right cornerlr = lrc; // lower right corner

isDark = false; // default is DO NOT FILLisDark = false; // default is DO NOT FILL

}}

void Rectangle::setToFillBlack() { void Rectangle::setToFillBlack() {

fillBlack = true; fillBlack = true;

} }

… …. Other stuff ….. Other stuff ….

Page 20: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2020

Default ConstructorsDefault Constructors The purpose of a constructor is to initialize The purpose of a constructor is to initialize allall data fields of data fields of

an object. an object.

A constructor always has the same name as the class. A constructor always has the same name as the class. A default constructor has no parameters.A default constructor has no parameters.

ExampleExample: : Product::Product() { Product::Product() { price = 0; price = 0; score = 0; score = 0; }}

This example says that a variable declared of type Product,This example says that a variable declared of type Product,as in the declaration:as in the declaration: Product t, w; Product t, w; will automatically have its internal fields initialized to 0. will automatically have its internal fields initialized to 0.

Most default constructors initialize the data fields to some Most default constructors initialize the data fields to some standard value (e.g. 0 for numeric, NULL for pointer, etc)standard value (e.g. 0 for numeric, NULL for pointer, etc)

• The Time class initializes to current time. The Time class initializes to current time. • The string class initializes to empty string.The string class initializes to empty string.

Page 21: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2121

Default Constructors (cont.)Default Constructors (cont.)

If not explicitly includedIf not explicitly included compiles generates one default compiles generates one default

constructor.constructor. to reserve the minimum memory to reserve the minimum memory

space to be assigned to the object space to be assigned to the object being declared.being declared.

particular fields are not initialized particular fields are not initialized unless they are assigned default unless they are assigned default values because of their particular values because of their particular types.types.

For example, if a particular field is of type For example, if a particular field is of type TimeTime, then it will have default initial value., then it will have default initial value.

Page 22: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2222

Constructors with Parameters Constructors with Parameters

Constructors with ParametersConstructors with Parameters It's possible to create a class with It's possible to create a class with

more than one constructor. more than one constructor.

ExampleExample: : Employee Fred; // uses default constructor Employee Fred; // uses default constructor

Employee Harry("Harry Hacker", 40000); Employee Harry("Harry Hacker", 40000);

// uses alternate constructor// uses alternate constructor

All constructors have the same name All constructors have the same name as the class, but have different as the class, but have different parameter lists. parameter lists.

Page 23: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2323

Example with Several ConstructorsExample with Several Constructors

class Employee { class Employee { public:public: Employee() Employee() Employee(string employee_name,  Employee(string employee_name,

double initial_salary);double initial_salary);         void set_salary(double new_salary); void set_salary(double new_salary);     string get_name() const; string get_name() const; double get_salary() const; double get_salary() const;

private:private: string name; string name; double salary; double salary;

}; };

Page 24: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2424

Constructors with Parameters (cont.)Constructors with Parameters (cont.) Whenever two functions have the same name but Whenever two functions have the same name but

are distinguished by their parameter types, the are distinguished by their parameter types, the function name is function name is overloadedoverloaded..

The second constructor (in class Employee) sets The second constructor (in class Employee) sets the data fields of the new object based on the the data fields of the new object based on the parameters.parameters.

Employee::Employee(string employee_name, Employee::Employee(string employee_name, double initial_salary) { double initial_salary) {

name = employee_name; name = employee_name; salary = initial_salary; salary = initial_salary;

} }

Example of declaration: Example of declaration: Employee e1(“maria”, 45000);Employee e1(“maria”, 45000);

Page 25: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2525

Constructors with Parameters (cont.)Constructors with Parameters (cont.) Sometimes a constructor gets more complex because one Sometimes a constructor gets more complex because one

of the data fields is itself an object of another class with its of the data fields is itself an object of another class with its own constructor. own constructor.

ExampleExample: suppose we modify the Employee class so that : suppose we modify the Employee class so that each Employee has scheduled work hours.each Employee has scheduled work hours.

class Employee {class Employee { public:public:

 Employee(string employee_name,  Employee(string employee_name, double initial_salary,double initial_salary,int arrive_hour, int leave_hour);int arrive_hour, int leave_hour);

    . . .    . . . private:private:

 string name; string name; double salary; double salary; Time arrive; Time arrive; Time leave; Time leave;

}; };

Page 26: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2626

Constructors with Parameters (cont.)Constructors with Parameters (cont.)

The constructor must initialize the time The constructor must initialize the time fields using the Time() constructor. fields using the Time() constructor.

Employee::Employee(string employee_name, Employee::Employee(string employee_name,

double initial_salary,double initial_salary,       int arrive_hour, int leave_hour)int arrive_hour, int leave_hour)

{{

name = employee_name;name = employee_name;   salary = initial_salary; salary = initial_salary;    arrive = Time(arrive_hour, 0, 0);    arrive = Time(arrive_hour, 0, 0);    leave = Time(leave_hour, 0, 0);    leave = Time(leave_hour, 0, 0);} }

Page 27: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2727

Constructors with Field Initializer ListConstructors with Field Initializer List SyntaxSyntax: :

Class_nameClass_name::::Class_name(parameters):Class_name(parameters):fieldfield1(1(exprexpr),…, ),…, fieldfieldn(n(exprexpr)) {{ … … statements …statements …

}}

Example:Example: Point::Point(double xval, double yval): Point::Point(double xval, double yval):

x(xval), y(yval) { x(xval), y(yval) { … … body statements …body statements …} }

PurposePurpose: Supply the implementation of a constructor, initializing : Supply the implementation of a constructor, initializing data fields before the body of the constructor.data fields before the body of the constructor.

The syntax above is an alternate, and more efficient, way to The syntax above is an alternate, and more efficient, way to initialize data field, but many programmers find it confusing.initialize data field, but many programmers find it confusing.

This syntax is necessary to construct objects of classes that don't This syntax is necessary to construct objects of classes that don't have a default constructor. have a default constructor.

Page 28: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2828

Accessing Data FieldsAccessing Data Fields Only member functions of a class are Only member functions of a class are

allowed to access the private data fields of allowed to access the private data fields of objects of that class. objects of that class. void raise_salary(Employee& e, double percent) { void raise_salary(Employee& e, double percent) {

e.salary = e.salary * (1 + percent / 100 ); e.salary = e.salary * (1 + percent / 100 ); /* Error */ /* Error */

} }

Data fields must be accessed by accessor Data fields must be accessed by accessor and mutator functions. and mutator functions. void raise_salary(Emplyee & e, double percent) { void raise_salary(Emplyee & e, double percent) {

double new_salary = e.get_salary() * double new_salary = e.get_salary() * (1 + percent / 100); (1 + percent / 100);

e.set_salary(new_salary); e.set_salary(new_salary); } }

Page 29: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

2929

Accessing Data Fields (cont.)Accessing Data Fields (cont.) Not every data member needs accessor Not every data member needs accessor

functions (the functions (the ProductProduct class did not have class did not have a a get_score()get_score() function). function).

Not every Not every get_get_ function needs a matching function needs a matching set_set_ (the (the TimeTime class can class can get_minutes()get_minutes() but not but not set_minutes()set_minutes() ). ).

RememberRemember that implementation is that implementation is supposed to be supposed to be hiddenhidden - just because a - just because a class has member functions named class has member functions named get_get_ or or set_set_ does not necessarily explain how does not necessarily explain how the class is designed. the class is designed.

Page 30: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

3030

Member vs. Nonmember FunctionsMember vs. Nonmember Functions

Consider the nonmember function Consider the nonmember function void raise_salary(Employee& e, void raise_salary(Employee& e,

double percent) { double percent) {

double new_salary = e.get_salary() * double new_salary = e.get_salary() *

(1 + percent / 100); (1 + percent / 100); e.set_salary(new_salary); e.set_salary(new_salary);

}}

versus the member function versus the member function void Employee::raise_salary(double percent) { void Employee::raise_salary(double percent) {

salary = salary * (1 + percent / 100); salary = salary * (1 + percent / 100);

}}

Page 31: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

3131

Member vs. Nonmember FunctionsMember vs. Nonmember Functions The previous nonmember function is called with two explicit The previous nonmember function is called with two explicit

parameters. parameters.

ExampleExample: raise_salary(harry, 7);: raise_salary(harry, 7);

A member function is called using the dot notation, with A member function is called using the dot notation, with one explicit parameter and one implicit parameter. one explicit parameter and one implicit parameter.

ExampleExample: : harry.raise_salary(7); harry.raise_salary(7);

A member function can invoke another member function on A member function can invoke another member function on the implicit parameter without using the dot notation. the implicit parameter without using the dot notation.

ExampleExample: : void Employee::print() const { void Employee::print() const {

cout << "Name: " << get_name() cout << "Name: " << get_name() << "Salary: " << get_salary() << "Salary: " << get_salary() << "\n"; << "\n";

} }

Page 32: 1 Chapter 6: Classes  Chapter Goals To be able to implement your own classesTo be able to implement your own classes To master the separation of interface.

32

BronceBroncePlataPlataOroOro

El Departamento de Ingeniería Eléctrica y Computadoras

te invita a su

Amenizan:

Michael StuartMichael StuartGrupo Somos Seis

Sábado, 4 de octubre de 2003,6:30 pmColiseo Rafael A. Mangual

Recinto Universitario de Mayaguez

Donativo: $50 por persona $30 por estudiante

Para información llame:(787) 265-3821

http://alumni.ece.uprm.edu

INELINEL ICOMICOM

Michael Stuart

75 años de historia… diseñando el futuro.

AuspiciaN