A B Answers:

Transcription

A B Answers:
Answers:
Question 1:
What is the output in each of the following code?
A
B
#include<iostream.h>
class item
{
int code;
public:
item() { }
item(int n) { code=n; }
item(item & a)
{
code=a.code+1;
}
void show(void)
{
cout<<code;
};
int main()
{
item obj1(12);
item obj2(obj1);
item obj3=obj1;
item obj4;
obj4=obj1;
cout<<"\n code of obj1 : ";
obj1.show();
cout<<"\n code of obj2 : ";
obj2.show();
cout<<"\n code of obj3 : ";
obj3.show();
cout<<"\n code of obj4 : ";
obj4.show();
return 0;
}
#include <iostream>
using namespace std;
class myClass{
public:
int val;
myClass ()
{
val = -1;
}
void f1 (myClass obj)
{
obj.val = 3;
}
void f2 (myClass& obj)
{
obj.val = 5;
}
};
Output
}
int main()
{
myClass obj1, obj2;
obj1.f1(obj2);
cout << "obj2.val is " << obj2.val << endl;
obj1.f2(obj2);
cout << "obj2.val is " << obj2.val << endl;
return 0;
}
Output
code of obj1 : 12
obj2.val is -1
code of obj2 : 13
obj2.val is 5
code of obj3 : 13
code of obj4 : 12
Page 1 of 23
Question 2:
Given the following code, indicate whether or not each of the following lines (a) through (h) is
legal or illegal. If it is illegal you have to give a reason.
#include <iostream>
using namespace std;
class myClass
{
private:
double x = 70.0;
//a
public:
int i;
int myClass()
//b
{
i = -1;
x = 80.0;
//c
return i;
//d
}
void f1 (int j) const
{
i = j;
//e
}
};
main()
{
myClass obj;
//f
obj.f1(4);
cout << "obj.i is " << obj.i << endl;
cout << "obj.x is " << obj.x << endl;
}
line
a
b
c
legal
illegal
X
X
//g
//h
reason
Cannot initialize at declaration
Constructor has no return type
X
d
X
Constructor cannot return a value
e
X
Constant function, cannot assign a value to i
X
Private member
f
X
g
X
h
Page 2 of 23
Question 3:
An electricity company charges the following rates for domestic users to discourage large
consumption of energy:
• For the first 100 units - 50 Fils per unit
• Beyond 100 units - 60 Fils per unit
If the total cost is more than 25 Dinar then an additional surcharge of 15% is added.
Define a class Electricity. The class has two data attributes: units and cost of type double.
The class should contain the following:
A.
B.
C.
D.
E.
A constructor to initialize units and cost by 0.
A function setUnits to assign the value for units data member.
A void function Bill to compute the cost based on above description.
A function details to display the details of a user bill: consumed units and cost.
A function addBills to add two Electricity objects. The parameter object is to be added to
the implicit object:
Electricity addBills(Electricty e1)
#include <iostream>
using namespace std;
class Electricity {
private:
double units;
double cost;
public:
Electricity();
void setUnits(double);
void Bill();
void details();
Electricity addBills(const Electricity&);
~Electricity();
};
Electricity::Electricity()
{
units = cost = 0.0;
}
void Electricity::setUnits(double u)
{
units = (u > 0.0) ? u : 0.0;
}
void Electricity::Bill()
{
if (units <= 100)
cost = units * 50;
else
cost = units * 60;
if (cost > 2500)
cost += cost*0.15;
}
void Electricity::details()
Page 3 of 23
{
cout << "units: " << units <<" cost: " << cost << endl;
}
Electricity Electricity::addBills(const Electricity& E)
{
Electricity Temp;
Temp.units = units + E.units;
Temp.Bill(); // calling function Bill to calculate the new cost
return Temp;
}
Electricity::~Electricity()
{
}
Page 4 of 23
Question 4
Write a program to test the class Electricity you have written in the previous question. Your
program will:
a) Declare an array of Electricity objects of size 12
b) Set the amount of units and compute the cost for each element of the array. Let user enter
the consumed units for each object.
c) Declare an Electricity object named TOTAL_BILL. Then, with a for loop, add the 12
objects to TOTAL_BILL
int main ()
{
Electricity data[12];
double u;
for (int i=0; i<12; i++)
{
cin >> u;
data[i].setUnits(u);
data[i].Bill();
}
Electricity TOTAL_BILL;
for (int i=0; i<12; i++)
TOTAL_BILL = TOTAL_BILL.addBills(data[i]);
return 0;
}
Page 5 of 23
Question 5
For each row in below table, specify how would you create the new class using existing class: inheritance
(is-A) or composition (has-A):
Existing
Class
Employee
President
Hand
Student
Manager
Shape
New Class
inheritance
Full time
Employee
Country
Body
Computer
Student
Business
Circle
X
composition
X
X
X
X
X
Page 6 of 23
Question 6:
1. When class B is inherited from class A, what is the order in which the constructors of those classes
are executed
A. Class A first Class B next
B. Class B first Class A next
C. Class B's only as it is the child class
D. Class A's only as it is the parent class
2. Which of the following operators below allow defining the member functions of a class outside the
class?
A. ::
B. :?
C. ?
D. %
3. Which of the following can be overloaded?
A. member functions
B. constructors
C. destructors
D. A and B
4. The default access level assigned to members of a class is ___________
A. Private
B. Public
C. Protected
D. Needs to be assigned
5. For which type of class private and protected members of the class can be accessed from outside
the same class in which they are declared
A. No such class exist
B. Friend
C. Static
D. Virtual
6. The return value of the following code is
Class1& test(Class1 obj)
{
Class1 *ptr = new Class1();
.........
return *ptr;
}
A. object of Class1
B. reference to ptr
C. reference of Class1
D. object pointed by ptr
7.
class Example{
public: int a,b,c;
Example(){a=b=c=1;} //Constructor 1
Example(int a){a = a; b = c = 1;} //Constructor 2
Example(int a,int b){a = a; b = b; c = 1;} //Constructor 3
Example(int a,int b,int c){ a = a; b = b; c = c;} //Constructor 4
}
In the above example of constructor overloading, the following statement will call which
constructor
Page 7 of 23
Example obj = new Example (1,2,3.3);
A. Constructor 2
B. Constructor 4
C. Constructor 1
D. Type mismatch error
8. Which of the following is not a type of constructor?
A. Copy constructor
B. Friend constructor
C. Default constructor
D. Parameterized constructor
9. Which of the following keyword is used to overload an operator?
A. overload
B. operator
C. friend
D. override
10. Inside a function definition for a member function of an object with data element x, which of the
following is equivalent to this->x:
A. *this.x
B. *this->x
C. x
D. Both A and C are correct
Page 8 of 23
Question 7:
What is the output of the following:
(a)
class test {
public:
static int n;
test () { n++; };
~test () { n--; };
};
int test::n=0;
int main () {
test a;
test b[5];
cout << b[3].n << endl;
test * c = new test;
cout << a.n << endl;
delete c;
cout << test::n << endl;
return 0;
}
6
7
6
(b)
class A {
public:
A() {x=10;}
A(int a):x(a){}
void SetX(int a) { x=a;}
int GetX() { return x;}
virtual void print()
{ cout << x<<endl;}
private:
int x;};
class B : public A {
public:
B(int h):y(h) {A::SetX(3); }
B() { y=5;}
void print() { cout << (*this).y + this->GetX()<<endl; }
private:
int y;
};
int main()
{
B b1, b2(2),* b3;
A *a1 =new B(7);
A *a2 =new A(7);
b1.print();
b2.print();
b3 = new B(6);
b3->print();
a1->print();
a2->print();
return 0;}
15
5
9
10
7
Page 9 of 23
Question 8:
A Course class is used to represent course information which contains a set of grades for certain course.
Given the following Course class:
class Course {
public:
Course(int count);
~Course();
Course( const Course &);
private:
int grades_count;
int * grades;
};
Write the implementation of the following functions:
A. Course(int count): A constructor that creates an array of grades based on count and initlializes the
grades count member variable.
Course::Course(int count)
{
grades_count=count;
grades= new int[grades_count];
}
B. ~Course(): A destrcutor that clears the course object.
Course::~Course()
{
delete [] grades;
}
C.
Course( const Course &):
A copy construcor.
Course::Course(const Course & c)
{
grades_count=c.grades_count;
grades= new int[grades_count];
for (int i=0;i <grades_count;i++)
grades[i]=c.grades[i];
}
Page 10 of 23
Question 10
Trace the following program and write the generated output in the box below only?
#include<iostream.h>
class Product {
protected:
int price;
public:
void set_price (int a){ price = a; }
Polygon: 10 Total= 0
Car: 40 Total= 400
Computer: 30 Total= 150
Computer: 0 Total= 0
virtual int Selling_Price(){return 0;}
virtual void print()
{
cout <<"Polygon: "<< price;
}
};
class Computer: public Product {
public:
int Selling_Price () {
return price * 5 ; }
void print() { cout<< "Computer: "<< price; }
};
class Car: public Product {
public:
int Selling_Price () { return price * 10;}
void print() { cout<< "Car:
"<< price;
}
};
void main()
{
int i;
int x[10] = {10,20,30,40,50,10,30,50,70,0};
Product *ptr[10];
ptr[0] = new Product;
for(i=1; i<5 ;i++)
ptr[i]= new Car;
for(i=5; i<10 ;i++)
ptr[i]= new Computer;
for(i=0; i<10 ;i++)
ptr[i]-> set_price( x[i] );
i=0;
while( i < 10 )
{
ptr[i]->print();
cout << " Total= "<< ptr[i]->Selling_Price();
cout << endl;
i += 3;
}
}
Page 11 of 23
Question 13
1.
What does the following declaration declare?
int *countPtr, count;
a.
b.
c.
d.
2.
Two integer variables.
One pointer to an integer and one integer variable.
Two pointers to integers.
The declaration is invalid.
Inside a function definition for a member function of an object with data element x, which of the
following is equivalent to this->x:
a. *this.x
b. *this->x
c. x
d. Both A and C are correct
e. None of the above
3.
4.
One of the following is not correct when talking about static member functions:
a. static member functions can only access other static member functions and static data members.
b.
static member functions can be called even if no object of their class is created.
c.
d.
static member functions cannot be called from an object of their class.
None of the above.
The correct function name for overloading the multiplication operator is:
a.
b.
c.
d.
5.
operator*
operator(*)
operator:*
operator_*
A friend function defined in a class is considered a member function of that class:
a. True
b. False
6.
With Inheritance, the order of execution for the constructors when creating an object of
a derived class is as follows:
a.
b.
c.
d.
Parent class constructor and then derived class constructor
Derived class constructor and then parent class constructor
There is no order of execution, parent class constructors are never called
None of the above
Page 12 of 23
Question 15
class MyData
{
private:
int x;
int y;
static int z;
public:
MyData (int m =4, int n=5)
{
x=m;
y = n;
z+=2;
cout<< x+y <<endl;
return temp;
}
};
int MyData::z = 6;
void main ()
{
MyData var1(1,4), var2(4);
MyData MyDataArray [3];
cout<< MyData::getZ() <<endl;
MyDataArray[1].setXY(var1+var2,3);
MyDataArray[0] = var1 * var2 * MyDataArray[1];
cout <<MyDataArray[1].getX()+MyDataArray[0].getX()
<<endl;
}
int getX () { return x; }
int getY () {return y;}
static int getZ () {return z;}
MyData& setXY (int a, int b)
{
x=a;
y=b;
return *this;
}
int operator+ (MyData t)
{
return x+y+t.x+t.y;
}
var1.setXY( MyDataArray[0].getX(),3 ).setXY(12,2);
MyDataArray[2] = var2 * MyDataArray[0] ;
cout << var1.getX() << endl;
if ( MyDataArray[1].getY() )
cout << "Demo ends\n";
else
cout << "Demo stops\n";
MyData operator* (MyData t)
{ MyData temp;
temp.x = x * t.x ;
temp.y= ++temp.x*3 ;
}
16
5
20
85
9
12
Demo ends
Page 13 of 23
Question 16:
Given the following two classes GasTank and Engine:
class GasTank
{ public:
GasTank():level(0),capacity(40) {};
bool IsEmpty() { return level==0;};
void AddGas(float val)
{
if (level+val<=capacity)
level+=val;}
void ConsumeGas()
{level--;}
private:
float level;
float capacity;
};
class Engine
{public:
void Start() {… };
// will start the engine
void Stop() {… };
// will stop the engine
void MoveForward() {… }
// moves car forward
void MoveBackward() {…}
// moves car backward
void StopMoving() {…}
// stops car moving
private:
……
};
A car has engine and gas tank, build a new class called Car class with two main components engine and
gas tank. In addition, class should have gear_level member variable. Write the complete definition of
class Car. The class should also include the following functions:
1. void StartEngine() that starts the car engine. The function should check gas
level and if empty shows message “can’t start car, no Gas”,
2. void StopEngine() that stops the car engine.
3. void SetGear(int Level) that sets the car gear level (1 means drive forward,
2 drive reverse and 3 Park (stop moving))
4. void StepOnGas() will do one of three things based on gear level,if drive
forward it will ask engine to moveforward, if reverse it will ask engine to move
backward, else it will display message “Vrooom Vrooom Vroooooooooooom” and it
will not move.
5. void FillGas(float value) Will fill the car gas tank with given value.
Page 14 of 23
class Car {
public:
void StartEngine()
{
if (tank.IsEmpty())
{
cout <<" can't start car, no Gas"<<endl;
return;
}
else
engine.Start();
}
void StopEngine() {engine.Stop();
}
void SetGear(int level) {
gear_level=level; }
void StepOnGas()
{
switch(gear_level)
{
case 1: engine.MoveForward();
break;
case 2: engine.MoveBackward();
break;
case 3: cout <<" Vrooom Vrooom Vroooooooooooom";
break;
}
}
void FillGas(float value){
tank.AddGas(value);
private:
Engine engine;
GasTank tank;
int gear_level;
}
};
Page 15 of 23
Question 17:
Write a class named Cabinet. The class should have private data members named ArabicBooks,
EnglishBooks and ComputerBooks all of type integer. The class should have the following:
1. A member function named GetTotalBooks to retrieve the number of all books in the cabinet.
int GetTotalBooks()
{
return EnglishBooks+ArabicBooks+ComputerBooks;
}
2. Overload the + operator to allow adding two objects of type Cabinet and return an object of same
type
(note, add the ArabicBooks to ArabicBooks, EnglishBooks to EnglishBooks, and so on).
Cabinet operator+ (Cabinet b)
{ Cabinet temp;
temp.EnglishBooks= EnglishBooks+b.EnglishBooks;
temp.ArabicBooks= ArabicBooks+b.ArabicBooks;
temp.ComputerBooks= ComputerBooks+b.ComputerBooks;
return temp;
}
3. Overload the – operator to allow subtracting books from the cabinet. For Example, Cabinet – 2 will
return a new cabinet object with 2 books less from each type of books. If one of the categories does
not have 2 books or more, it should not subtract from that category.
Cabinet operator- (int value)
{ Cabinet temp;
temp=(*this);
if (EnglishBooks>=value)
temp.EnglishBooks= EnglishBooks-value;
if (ArabicBooks>=value)
temp.ArabicBooks= ArabicBooks-value;
if (ComputerBooks>=value)
temp.ComputerBooks= ComputerBooks-value;
return temp;
}
4. Overload the > operator to compare between two cabinet objects based on their total number of
books.
bool operator> (Cabinet b)
{return GetTotalBooks()>b.GetTotalBooks();
}
Page 16 of 23
5. Overload the << operator to allow printing cabinet objects using cout.
ostream & operator
{
output
output
output
return
}
<< ( ostream & output , const Cabinet c)
<< "Arabic " <<c.ArabicBooks<<endl;
<< "Computer "<< c.ComputerBooks<<endl;
<< "English " << c.EnglishBooks<<endl;
output;
In case you need to combine all:
class Cabinet {
public:
Cabinet(int e,int a,int c)
{ EnglishBooks=e;
ArabicBooks=a;
ComputerBooks=c; }
Cabinet()
{ EnglishBooks=0;
ArabicBooks=0;
ComputerBooks=0; }
int GetTotalBooks()
{
return EnglishBooks+ArabicBooks+ComputerBooks;
}
Cabinet operator+ (Cabinet b)
{ Cabinet temp;
temp.EnglishBooks= EnglishBooks+b.EnglishBooks;
temp.ArabicBooks= ArabicBooks+b.ArabicBooks;
temp.ComputerBooks= ComputerBooks+b.ComputerBooks;
return temp;
}
Cabinet operator- (int value)
{ Cabinet temp;
temp=(*this);
if (EnglishBooks>=value)
temp.EnglishBooks= EnglishBooks-value;
if (ArabicBooks>=value)
temp.ArabicBooks= ArabicBooks-value;
if (ComputerBooks>=value)
temp.ComputerBooks= ComputerBooks-value;
return temp;
}
Page 17 of 23
bool operator> (Cabinet b)
{return GetTotalBooks()>b.GetTotalBooks();
}
friend ostream & operator << ( ostream & , const Cabinet );
private:
int EnglishBooks,ArabicBooks,ComputerBooks;
};
ostream & operator
{
output
output
output
return
}
<< ( ostream & output , const Cabinet c)
<< "Arabic " <<c.ArabicBooks<<endl;
<< "Computer "<< c.ComputerBooks<<endl;
<< "English " << c.EnglishBooks<<endl;
output;
Page 18 of 23
Question 18
Trace the following program and write the generated output in the box below only?
#include <iostream>
using namespace std;
class Demo
{
private:
int x;
bool y;
static int z;
public:
Demo (int m =5, bool n=true)
{ x=m; y = n; z+=5; }
int getX () { return x; }
bool getY () {return y;}
static int getZ () {return z;}
Demo& setX (int a)
{
x=a;
return *this;
}
Demo operator* (Demo d)
{
x = d.x * 2 ;
cout<< x <<endl;
return *this;
}
~Demo ()
{ x= 0; y = 0;
z+=5; }
};
int Demo::z = 20;
void main ()
{
Demo Demo1(1,false), Demo2(4,false);
Demo DemoArray [3];
Demo *ptr;
ptr = new Demo[10];
cout<< Demo::getZ() <<endl;
DemoArray[0] = Demo1 * Demo2;
delete [] ptr;
cout << Demo2.getZ() << endl;
Demo1.setX( Demo1.getZ() );
DemoArray[2] = Demo1 * DemoArray[1] ;
cout << Demo2.getX() << endl;
DemoArray[0] = Demo(10,true) * DemoArray[0];
cout<< Demo::getZ() <<endl;
}
95
8
155
10
4
16
185
Page 19 of 23
Question 27:
Trace the following programs and write the generated output in the boxes below only?
A (3 points)
B (4 points)
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
class myMessage{
class myClass
{
int code;
int count;
public:
myClass(int m=3)
{
count=m*2;
code=m;
}
int f2( int v)
{
return v+count;
}
void f1(int&x,int y){
x=count;
y=f2(code);
}
};
int main()
{
public:
myMessage(int b=7);
void print();
void f2( int);
private:
int c;
};
myMessage::myMessage(int b)
{
c=b;
}
void myMessage::f2(int c2)
{
c=c2;
}
void myMessage::print()
{
cout<<c<<endl;
}
int main()
{
myMessage P,Q(5);
myMessage R[5];
myClass obj1,obj2(7);
int val1=3,val2=5;
obj2.f1(val1,obj1.f2(val2));
cout<<"\nval1 :"<<val1;
cout<<"\nval2 :"<<val2;
for (int i=0; i<3;i++)
R[i].f2(i);
}
for (int i=0; i<4;i++)
R[i].print(); }
val1 :14
val2 :5
P.print();
Q.print();
7
5
0
1
2
7
Page 20 of 23
Question 28:
a)
Write a C++ class to define a Circle, the class should have:
•
Three private member variables: x, y and r where (x,y) represents the center of
the circle and r represents the radius of the circle.
•
Two constructors ( one default no arguments and one with three integer values
x_val, y_val, and r_val)
•
SetXY( int v1,int v2) to set the values for the center.
•
SetRadius(int v) to set the value of the radius
•
Move(int dx, int dy) member function that moves the circle center by dx value
for the x-axis of the center and dy for the y-axis. For example, if we have circle
with center (30,32) and we apply Move(3,-8), the new center will be (33,24).
•
float GetArea() function that computes the area of the circle. Area is computed
using the following formula: Area= π .R2 where π = 22/7 and R is the radius.
•
Bool IsSmaller( Circle c) to compare area of an object with object c and return
true if area of object c is bigger.
#include <iostream>
using namespace std;
class Circle
{
public:
Circle()
{ x=y=r=0;}
Circle(int x_val,int y_val, int r_val)
{
x=x_val;
y=y_val;
r=r_val;
}
void SetXY(int v1, int v2) {x=v1; y=v2; }
void SetRadius(int v) {r=v; }
void Move(int dx, int dy) { x+=dx; y+=dy;}
float GetArea() { return (r*r*(22.0/7) );}
bool IsSmaller(Circle c) { return GetArea()<c.GetArea(); }
private:
int x,y,r;
};
Page 21 of 23
Question 29:
Based on Circle class you defined in previous question,
a) Write a function named ReadCircles that receives an array of objects of type circle and
the size of the array, read values for the different member variables, and set them using
their corresponding setters.
b) Write a main function that declares an array named data of type Circle and size 10. Use
ReadCircles functions to read values inside array data.
c) Inside main function, move all circle objects inside the array data by move values
(dx=24,dy=13) and print their area sizes.
void ReadCircles( Circle a[], int size)
{
int x,y,r;
for (int i=0;i<size;i++)
{
cout << " please enter values for x y and radius of a circle"<<endl;
cin >> x >> y >> r;
a[i].SetXY(x,y);
a[i].SetRadius(r);
}
}
int main()
{
Circle data[10];
ReadCircles(data,10);
for (int i=0; i<10;i++)
{
data[i].Move(24,13);
cout <<"circle number "<<i+1<<" has area "<<data[i].GetArea() <<endl;
}
return 0;
}
Page 22 of 23
Question 30:
#include <iostream>
using namespace std;
class Base{
public:
Base(int v1, int v2)
{
x=v1; y=v2;
cout << " BC "<<x <<" "<<y<<endl;
}
~Base()
{
cout << " BD "<<x <<" "<<y<<endl;
}
void SetValues(int v1, int v2)
{x=v1; y=v2; }
int GetX() { return x;};
int GetY() { return y;};
private:
int x;
int y;
};
class Derived: public Base
{
public:
Derived( int v1, int v2, int v3, int v4 ):Base(v1,v2),k(v3),m(v4)
{
cout << " DC "<<GetX() <<" "<<GetY()<<" "<<k<<" "<<m<<endl;
}
~Derived()
{
cout << " DD "<<GetX() <<" "<<GetY()<<" "<<k<<" "<<m<<endl;
}
int SetValues(int v1, int v2, int v3, int v4 )
{
Base::SetValues(v1,v2);
BC 10 20
k=v3;
BC 100 200
m=v4;
DC 100 200 300 400
}
BC 1 2
DC 1 2 3 4
private:
DD 1 2 3 4
int k,m;
BD 1 2
DD 100 200 300 400
};
BD 100 200
BD 10 20
int main()
{
Base o1(10,20);
Derived *p,o2(100,200,300,400);
p= new Derived(1,2,3,4);
delete p;
return 0;
}
Page 23 of 23