Yazan : Şadi Evren ŞEKER
Okan Üniversitesi, bilgisayar mühendisliği bölümü, nesneye yönelik programlama dersinin vizesinde sorduğum soru aşağıdadır.
-
Aşağıda verilen tanımlara uygun olarak, nesne yönelimli bir tasarım yapınız. Tasarımınızın sınıf diyagramını (sınıflar arası ilişkileri) bir şekilde çizerek gösteriniz (çizim sırasında ilişkileri belirten semboller kullanıyorsanız bu sembolleri açıklayınız). Tasarımınıza uygun C++ dilinde kodunuzu yazınız.
- Bir havayolu firması, görüşmeleriniz sonucunda, aşağıdaki açıklanan bilgileri içeren tasarım yapmanızı ve kodunu yazmanızı istiyor.
- Hava yolu firmasında idari ve uçuş ekibi olmak üzere iki ekip bulunuyor. (2 puan)
- İdari ekipte, müdür, sekreter, satış sorumlusu ve muhasebe çalışanları bulunuyor. (2 puan)
- Uçuş ekibinde ise pilot, hostes ve hareket plan ekibi bulunuyor. (2 puan)
- Çalışanların hepsinin TC kimlik numarası, maaşı, doğum tarihi ve isminin sistemde tutulması gerekiyor. (2 puan)
- İdari ekibin ayrıca ofis bilgilerinin tutulması da gerekiyor, ama uçuş ekibinden sadece hareket amirinin ofisi bulunuyor. (2 puan)
- Ofislerde birden fazla kişi çalışabiliyor ve her ofis sahibi çalışanın ofisinin oda numarası bulunuyor. (2 puan)
- Ayrıca her ofis sahibi çalışanın (müşterek veya müstakil ofiste çalışıyor olsa da) bir adet dahili telefonu bulunuyor. (5 puan)
- Uçuşların birer uçuş numarası, pilot, hostes bilgisi ve uçuşun nereden nereye olduğunun tutulması gerekiyor. (6 puan)
- Hareket amiri tek kişidir ve birden fazla uçuşu kontrol edebilmektedir. Ayrıca pilot ve hostesler de birden fazla uçuşta uçabilmektedir. (7 puan)
- Uçuş personelinin hangi uçuşlarda görev aldığı bilgisi sorgulanmaktadır. Bunu içeren bir adet metot kodlayınız. (puan değeri 2. Sorunun g şıkkı ile paylaşılmıştır)
-
İlk sorudaki kodunuza ilave olarak, bir adet main fonksiyonu içerisinde, aşağıdaki özellikleri kodlayınız.
- Ali Demir isimli pilotun TC Kimlik numarası 123’tür ve 01/01/1970 tarihinde doğmuştur. 100 lira maaş almaktadır.(1 puan)
- Veli Yıldız isimli pilotun TC Kimlik numarası 321’dir ve 01/01/1971 tarihinde doğmuştur. 120 lira maaş almaktadır. (1 puan)
- Ayşe Yaşar isimli hostesin TC Kimlik numarası 111’dir ve 01/01/1980 tarihinde doğmuştur. 50 lira maaş almaktadır. (1 puan)
- Fatma Yüksel isimli hostesin TC Kimlik numarası 323’dür ve 01/01/1981 tarihinde doğmuştur. 40 lira maaş almaktadır. (1 puan)
- Uçuş numarası 222, İstanbul’dan Ankara’yadır ve pilotu Ali Demir, hostesi ise Ayşe Yaşar’dır. (3 puan)
- Uçuş numarası 333, Ankara’dan İstanbul’adır ve pilotun ismi Veli Yıldız, hostesleri ise Fatma Yüksel ve Ayşe Yaşar’dır. (3 puan)
- Ayşe Yaşar’ın uçtuğu uçuşların hangi şehirler arasında olduğunu yazdırınız. (30 puan)
- Aynı ofiste çalışan idari personellerin TC Kimlik numaralarını yazdıran bir metodu, doğru sınıfa ekleyiniz. (30 puan)
Çözüm:
Sorunun ilk kısmında bir tasarım yapmamız isteniyor. Tasarım şeması aşağıdaki şekilde çizilebilir.
Yukarıdaki şekilde, düz çizgiler ISA ilişkisini, kesikli çizgiler ise HASA ilişkisini göstermektedir. İlişkilerden HASA ilişkilerinin tamamı münasebet tipindedir (Aggregation).
Kodlama çözümü aşağıda verilmiştir.
#include
<iostream>
#include
<conio.h>
#include
<stdlib.h>
#include
<string.h>
using
namespace std;
class Calisan{
private:
int tckimlik;
int maas;
char *dt;
char *isim;
public:
Calisan(){
}
Calisan(int tc,int m,char *i,char *dota){
tckimlik = tc;
maas = m;
isim = (char *)malloc(sizeof(char)*strlen(i));
dt = (char *)malloc(sizeof(char)*strlen(dota));
strcpy(isim,i);
strcpy(dt,dota);
}
int getTckimlik(){
return tckimlik;
}
void setTckimlik(int a){
tckimlik = a;
}
int getMaas(){
return maas;
}
void setMaas(int a){
maas = a;
}
char * getDT(){
return dt;
}
void setDT(char *a){
dt = (char*)malloc(sizeof(char)*strlen(a));
strcpy(dt,a);
}
char * getIsim(){
return isim;
}
void setIsim(char *a){
isim = (char*)malloc(sizeof(char)*strlen(a));
strcpy(isim,a);
}
};
class ofis{
int ofisno;
int dahili;
};
class idari:public Calisan{
};
class ucus{
private:
int no;
char *nereden;
char *nereye;
public:
void setno (int n){
no = n;
}
int getno(){
return no;
}
void setNereden(char *n){
nereden = (char*)malloc(sizeof(char)*strlen(n));
strcpy(nereden,n);
}
void setNereye(char *n){
nereye = (char*)malloc(sizeof(char)*strlen(n));
strcpy(nereye,n);
}
char *getNereden(){
return nereden;
}
char *getNereye(){
return nereye;
}
};
class ucusp:public Calisan{
private:
int ucusSayisi;
ucus *u;
public:
ucusp(){
ucusSayisi= 0;
u = (ucus *)malloc(sizeof(int)*100);
}
void ucusEkle(ucus x){
u[ucusSayisi++] =x;
}
ucus * ucuslar(){
return u;
}
int getUcusSayisi(){
return ucusSayisi;
}
char *ucusNereden(int ucusno){
for(int i = 0;i<ucusSayisi;i++){
if(u[i].getno()==ucusno){
return u[i].getNereden();
}
}
}
void ucuslariGoster(){
cout << getIsim() << “Ucuslari”<<endl;
cout << “UcusNotNeredentNereye”<<endl;
for(int i = 0;i<ucusSayisi;i++){
cout << u[i].getno()<< “t” << u[i].getNereden();
cout << “t” << u[i].getNereye()<<endl;
}
}
};
class satis:public idari{
ofis o;
};
class sekreter:public idari{
};
class mudur:public idari{
};
class pilot:public ucusp{
public:
pilot(){
ucusp();
}
};
class hostes:public ucusp{
};
class ha:public ucusp{
ofis o;
};
int main(){
pilot ali;
ali.setTckimlik(123);
ali.setDT(“01/01/1970”);
ali.setIsim(“Ali Demir”);
ali.setMaas(100);
cout << ali.getIsim() << ” “ << ali.getDT() << ” “ << ali.getMaas() << endl;
pilot veli;
veli.setTckimlik(321);
veli.setDT(“01/01/1971”);
veli.setIsim(“Veli Yildiz”);
veli.setMaas(120);
hostes fatma;
fatma.setTckimlik(323);
fatma.setDT(“01/01/1981”);
fatma.setMaas(40);
fatma.setIsim(“Fatma Yuksel”);
hostes ayse;
ayse.setTckimlik(111);
ayse.setDT(“01/01/1980”);
ayse.setMaas(50);
ayse.setIsim(“Ayse Yasar”);
ucus u;
u.setno(222);
u.setNereden(“Istanbul”);
u.setNereye(“Ankara”);
cout << “alinin ucus sayisi” << ali.getUcusSayisi() << endl;
ali.ucusEkle(u);
ayse.ucusEkle(u);
cout << “alinin ucus sayisi” << ali.getUcusSayisi() << endl;
cout << “alinin 222 numarali kalkis yeri “ << ali.ucusNereden(222) <<endl;
ucus x;
x.setno(454);
x.setNereden(“Ankara”);
x.setNereye(“Istanbul”);
ali.ucusEkle(x);
ayse.ucusEkle(x);
fatma.ucusEkle(u);
ali.ucuslariGoster();
fatma.ucuslariGoster();
getch();
}
Yukarıdaki örneklerde memory leak mevcut dynamic memory space (heap) ten aldıgınız bellek alanlarını iade etmemişsiniz. Üstelik ctor memory allocation (bellek tahsisi) pek güvenli bir yöntem değil string sınıflarını kullanmak daha iyi olur diye düşünüyorum. Bir de char * gibi pointerlar yerine memory yönetimini derleyiciye bırakmak için samrt pointer sınıflarını kullanmak daha iyi olur.
Eleştirilerimi mazur görün, yardımcı olmak istedim sadece. Siteniz aracılığıyla türk IT dünyasına yaptığınız katkı takdire şayan
Selamlar
İslam Bey, yorumunuz ve katkılarınız için çok teşekkür ederim. Malum vize sınavı ve ders kapsamında, henüz programlaramaya yeni giren öğrencilere çözüm veriyoruz yani hafıza yönetimi ile ilgili henüz ciddi bir ders almamış öğrencilerin 1-2 aylık programlama bilgisiyle verdikleri sınav 🙂 Ama webte yayınlanan bir çözüm ve başkalarının işine yarayabileceği de bir hakikat bu anlamda yorumunuz için çok teşekkür ediyorum.