İ.T.Ü. Bilişim Enstitüsü |
2. Vize |
10.04.2002 |
Tezsiz Yüksek Lisans Programı |
Nesneye Dayalı Programlama |
|
||||
|
||||
S.1) a) (25) Yukarıda verilen sınıf tanımlamaları için main() fonksiyonu içindeki numaralı satırlarda üretilen çıktıyı nedenleri ile birlikte açıklayınız.
Satır No |
Ekran Çıktısı |
Açıklama |
1 |
|
Herhangi bir nesne yaratılmıyor |
2 |
|
Herhangi bir nesne yaratılmıyor |
3 |
As constructor Bs constructor Cs constructor |
C sınıfından bir nesne yaratılıyor |
4 |
As constructor Bs constructor Cs constructor |
C sınıfından bir nesne yaratılıyor |
5 |
Cs destructor Bs destructor As destructor |
C sınıfından bir nesne yok ediliyor Temel sınıfın yokedicisi virtual tanımlı. |
6 |
Bs destructor |
C sınıfından bir nesne yok ediliyor Temel sınıfın yokedicisi virtual tanımlı değil. |
S.1) b) (5) Sınıf tasarımında herhangi bir hata var mı? Var ise düzeltiniz.
B sınıfının yokedicisi virtual tanımlanmalı.
class B
{
public:
B() { cout << "B's constructor\n" ; }
virtual ~B() { cout << "B's destructor\n" ; }
} ;
S.2) Herhangi bir tipten diziyi modellemek üzere bir sınıf tasarlanılması istenmektedir.
A) (5) Böyle bir sınıfın öznitelikleri neler olabilir?
Dizinin elemanlarının saklanacagi bir kap
Kaptaki eleman sayısı
B) (15) A şıkkında verdiğiniz özniteliklere ek olarak sınıfta Sort() adlı bir metod yer almaktadır. Sınıfın sadece prototipini yazınız.
template <class T>
class Array {
protected:
T* data ;
int numberOfElements ;
public:
Array() ;
Array(T*,int) ;
~Array();
void Sort() ;
Array& operator=(Array&) ;
T operator[](int) ;
};
C) (25) Sort metodunu gerçekleyiniz.
template <class T>
void Array<T>::Sort(){
if (numberOfElements>0){
int s ;
for (int i=0;i<numberOfElements-1;i++)
for (int j=i+1;i<numberOfElements;j++)
if (data[i]>data[j]){
s = data[i] ;
data[i] = data[j] ;
data[j] = s ;
}
}
}
class Square
{
double edge ;
public:
Square(double e):edge(e){}
virtual double getArea(){ return edge*edge;}
} ;
class Cube : private Square
{
public:
Cube(double e):Square(e){}
double getArea(){ return (6.0*Square::getArea()) ;}
} ;
Aşağıdaki soruları yukarıdaki sınıf tanımlamalarını gözönüne alarak cevaplayınız.
S.3) (10) Aşağıdaki şıklardan hangisinde bir late-binding uygulaması sözkonusudur.
S.4) (10) Cube sınıfındaki getArea() metodunun aşağıdaki şekilde tanımlanması durumunda
double getArea(){ return (6.0*area*area);}
kodun mantıksal olarak çalışabilmesi için Cube yada Square sınıfında yapılması gereken değişiklik aşağıdaki şıklardan hangisinde verilmiştir?
(a) class Cube: public Square
(b) Cube sınıfında edge adında public bir üye tanıtılır.
(c) Square sınıfındaki edge üyesi protected olarak tanımlanır.
(d) Cube sınıfında edge adında protected bir üye tanıtılır.
S.5) (25) Square sınıfında aşağıdaki değişiklik yapılsın.
class Square
{
double edge ;
public:
Square(double e)
{
if (e<0.0)
throw ENegativeEdge(Edge cannot be negative,e) ;
edge = e ;
}
virtual double getArea(){ return edge*edge;}
} ;
ENegativeEdge sınıfını tasarlayınız. try-catch yapısının kullanımına bir örnek veriniz.
class ENegativeEdge
{
protected:
char* msg ;
double edge ;
public:
ENegativeEdge() ;
ENegativeEdge(char *,double) ;
~ENegativeEdge() ;
char* getReason() ;
double getEdge() ;
} ;
ENegativeEdge::ENegativeEdge()
{
msg = 0L ;
edge=0.0;
}
ENegativeEdge::~ENegativeEdge()
{
if (!msg) delete[] msg ;
}
ENegativeEdge::ENegativeEdge(char *s,double e):edge(e)
{
msg = new char[strlen(s)+1] ;
strcpy(msg,s) ;
}
char* ENegativeEdge::getReason()
{
return msg ;
}
double ENegativeEdge::getEdge()
{
return edge ;
}
main()
{
try
{
Square s(-1) ;
}
catch(ENegativeEdge& e)
{
cout << e.getReason() << \n ;
cout << e.getEdge() << \n ;
}
}