2017-2018 Fall Object-Oriented Programming Laboratory 03 17.10.2017 1. Çok Dosyalı Proje. Aşağıda, katilimci structure ı için oluşturulmuş bir programın kaynak kodu verilmiştir. Kaynak kodu okuyun ve programın yaptığı işi tahmin edin. Programı çalıştırın ve tahmininizi kontrol edin. Tek bir dosyada olan bu kodu, birden fazla dosyaya bölün; gerekli düzenlemeleri yapın: - katilimci structure ının, tipinin, ve ilgili fonksiyonların ilanlarının/declaration larının bulunduğu bir katilimci header dosyası. - katilimci tipine ait fonksiyonların tanımlamalarının/definition larının bulunduğu bir katilimci cpp dosyası. - katilimci tipini kullanarak belirli bir işi yapan main fonksiyonunun bulunduğu bir cpp dosyası. #ifndef KATILIMCI_H #define KATILIMCI_H #define NAMELEN 32 #define NAMESIZE (NAMELEN + 1) typedef struct katilimci_s char ad[namesize]; char soyad[namesize]; int yas; katilimci_t; void print_katilimci(katilimci_t * p); void scan_katilimci(katilimci_t * s); void sirala_ad (katilimci_t kdz[], int e_sayisi); void sirala_soyad(katilimci_t kdz[], int e_sayisi); void sirala_yas (katilimci_t kdz[], int e_sayisi); #endif // KATILIMCI_H #include "katilimci.h" #include <cstring> void print_katilimci(katilimci_t * p) cout << p->ad << ' ' << p->soyad << " (yas:" << p->yas << ")" << endl; void scan_katilimci(katilimci_t * s) char buffer[256]; int input_length;
cout << "ad: "; cin >> buffer; input_length = strlen(buffer); if(input_length > NAMELEN) input_length = NAMELEN; strncpy(s->ad, buffer, input_length); (s->ad)[input_length] = '\0'; cout << "soyad: "; cin >> buffer; input_length = strlen(buffer); if(input_length > NAMELEN) input_length = NAMELEN; strncpy(s->soyad, buffer, input_length); (s->soyad)[input_length] = '\0'; cout << "yas: "; cin >> s->yas; void sirala_ad(katilimci_t kdz[], int e_sayisi) char buffer[namesize]; int i, j, temp; for(i=0; i<e_sayisi; i++) for(j=i+1; j<e_sayisi; j++) if(strcmp(kdz[i].ad, kdz[j].ad)>0) strcpy(buffer, kdz[i].ad); strcpy(kdz[i].ad, kdz[j].ad); strcpy(kdz[j].ad, buffer); strcpy(buffer, kdz[i].soyad); strcpy(kdz[i].soyad, kdz[j].soyad); strcpy(kdz[j].soyad, buffer); temp = kdz[i].yas; kdz[i].yas = kdz[j].yas; kdz[j].yas = temp; void sirala_soyad(katilimci_t kdz[], int e_sayisi) char buffer[namesize]; int i, j, temp; for(i=0; i<e_sayisi; i++)
for(j=i+1; j<e_sayisi; j++) if(strcmp(kdz[i].soyad, kdz[j].soyad)>0) strcpy(buffer, kdz[i].ad); strcpy(kdz[i].ad, kdz[j].ad); strcpy(kdz[j].ad, buffer); strcpy(buffer, kdz[i].soyad); strcpy(kdz[i].soyad, kdz[j].soyad); strcpy(kdz[j].soyad, buffer); temp = kdz[i].yas; kdz[i].yas = kdz[j].yas; kdz[j].yas = temp; void sirala_yas(katilimci_t kdz[], int e_sayisi) char buffer[namesize]; int i, j, temp; for(i=0; i<e_sayisi; i++) for(j=i+1; j<e_sayisi; j++) if(kdz[i].yas > kdz[j].yas) strcpy(buffer, kdz[i].ad); strcpy(kdz[i].ad, kdz[j].ad); strcpy(kdz[j].ad, buffer); strcpy(buffer, kdz[i].soyad); strcpy(kdz[i].soyad, kdz[j].soyad); strcpy(kdz[j].soyad, buffer); temp = kdz[i].yas; kdz[i].yas = kdz[j].yas; kdz[j].yas = temp; #include "katilimci.h" #define KSAYISI 4
int main(void) katilimci_t k[ksayisi]; int looper; scan_katilimci(&k[looper]); cout << "katilimcilar:" << endl; print_katilimci(&k[looper]); sirala_ad(k, KSAYISI); cout << "katilimcilar (ada gore):" << endl; print_katilimci(&k[looper]); sirala_soyad(k, KSAYISI); cout << "katilimcilar (soyada gore):" << endl; print_katilimci(&k[looper]); sirala_yas(k, KSAYISI); cout << "katilimcilar (yasa gore):" << endl; print_katilimci(&k[looper]); 2. Açı birim dönüşümü Derece biriminden radyan birimine açı dönüşümü yapan drc2rad(), radyan biriminden derece birimine açı dönüşümü yapan rad2drc() fonksiyonlarını inline olarak tanımlayın, argümanlara, argüman tiplerine ve return tipine karar verin. Tanımladığınız fonksiyonları bir programda test edin: - Kullanıcı d veya D girerse, derece girişi alınsın, radyana çevrilsin, ekrana yazılsın. - Kullanıcı r veya R girerse, radyan girişi alınsın, dereceye çevrilsin, ekrana yazılsın. - Kullanıcı e veya E girerse, program kapansın. (Program sonsuz döngüde çalışsın.) - Kullanıcı farklı bir karakter girerse, ekrana yanlış giriş yazılsın. Çok dosyalı çalışın. PI = 3.14159 RAD = DRC RAD PI DRC = 180 180 PI #ifndef ACI_H #define ACI_H #define PI 3.14159 inline double drc2rad(double drc) return drc / 180 * PI;
inline double rad2drc(double rad) return rad / PI * 180; #endif // ACI_H #include "aci.h" int main(void) char islem; double aci; while(1) cout << "derece => radyan icin: d" << endl << "radyan => derece icin: r" << endl << "cikmak icin: e" << endl; cin >> islem; if(islem == 'd' islem == 'D') cout << " aci (derece) girin: "; cin >> aci; cout << aci << " derece = " << drc2rad(aci) << " radyan." << endl; else if(islem == 'r' islem == 'R') cout << " aci (radyan) girin: "; cin >> aci; cout << aci << " radyan = " << rad2drc(aci) << " derece." << endl; else if(islem == 'e' islem == 'E') cout << endl << "program kapaniyor." << endl; break; else cout << endl << "gecersiz islem sectiniz." << endl; 3. vektor Yapısı 3 boyutlu kartezyen uzayda vektör işlemleri için vektor_s yapısı ve vektor_t tipi tanımlayın. vektor_t tipinde değişkenlerle çalışmak için aşağıdaki fonksiyonları tanımlayın. - void vektor_gir(vektor_t &v) : kullanıcıdan vektör girişi al. - void vektor_yaz(const vektor_t &v) : vektörü ekrana yaz. Tanımladığınız tipi ve fonksiyonları bir programda kullanın: kullanıcıdan vektör girişi alın, girilen vektörü ekrana yazdırın.
#ifndef VEKTOR_H #define VEKTOR_H typedef struct vektor_s double x, y, z; vektor_t; void vektor_gir(vektor_t &v); void vektor_yaz(const vektor_t &v); #endif // VEKTOR_H void vektor_gir(vektor_t &v) cout << "x girin: "; cin >> v.x; cout << "y girin: "; cin >> v.y; cout << "z girin: "; cin >> v.z; void vektor_yaz(const vektor_t &v) cout << '(' << v.x << ',' << v.y << ',' << v.z << ')'; int main(void) vektor_t v1; cout << "vektor girin:" << endl; vektor_gir(v1); cout << "girilen vektor: "; vektor_yaz(v1);
4. vektor Fonksiyonları Daha önce oluşturduğunuz vektor_t tipini kullanan aşağıdaki fonksiyonları tanımlayın. Argümanlara, argüman tiplerine ve return tipine karar verin. - Bir vektörün genliğini bulmak için genlik() fonksiyonu. genlik((a x, a y, a z )) = a x 2 + a y 2 + a z 2 Gereken fonksiyonlar ve kütüphaneleri: <cmath> double sqrt(double) - İki vektörün nokta çarpımını bulmak için ncarpim() fonksiyonu. (a x, a y, a z ) (b x, b y, b z ) = a x b x + a y b y + a z b z Tanımladığınız fonksiyonları bir programda kullanın: kullanıcıdan iki vektör girişi alın, girilen vektörleri ekrana yazdırın, vektörlerin genliklerini ekrana yazdırın, vektörlerin nokta çarpımını ekrana yazdırın. Çok dosyalı çalışın. #ifndef VEKTOR_H #define VEKTOR_H typedef struct vektor_s double x, y, z; vektor_t; void vektor_gir(vektor_t &v); void vektor_yaz(const vektor_t &v); double genlik(const vektor_t &v); double ncarpim(const vektor_t &v1, const vektor_t &v2); #endif // VEKTOR_H #include <cmath> void vektor_gir(vektor_t &v) cout << "x girin: "; cin >> v.x; cout << "y girin: "; cin >> v.y; cout << "z girin: "; cin >> v.z; void vektor_yaz(const vektor_t &v) cout << '(' << v.x << ',' << v.y << ',' << v.z << ')'; double genlik(const vektor_t &v) return sqrt(v.x*v.x + v.y*v.y + v.z*v.z); double ncarpim(const vektor_t &v1, const vektor_t &v2) return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
int main(void) vektor_t v1, v2; cout << "v1 vektorunu girin:" << endl; vektor_gir(v1); cout << "v2 vektorunu girin:" << endl; vektor_gir(v2); cout << "v1:"; vektor_yaz(v1); cout << " genlik(v1)=" << genlik(v1) << endl; cout << "v2:"; vektor_yaz(v2); cout << " genlik(v2)=" << genlik(v2) << endl; cout << "v1.*v2=" << ncarpim(v1, v2) << endl; 5. vektor Fonksiyonları Daha önce oluşturduğunuz vektor_t tipini kullanan aşağıdaki fonksiyonları tanımlayın. Argümanlara, argüman tiplerine ve return tipine karar verin. - Bir vektörün bir skalar ile çarpımı için scarpim() fonksiyonu. - İki vektörün çapraz çarpımını bulmak için xcarpim() fonksiyonu. (a x, a y, a z ) (b x, b y, b z ) = (a y b z a z b y, a z b x a x b z, a x b y a y b x ) Tanımladığınız fonksiyonları bir programda test edin: kullanıcıdan iki vektör girişi alın, girilen vektörleri ekrana yazdırın, vektörlerin çapraz çarpımını hesaplayın ve ekrana yazdırın, bir skalar girişi alın ve çapraz çarpım sonucu olan vektör ile skaların çarpımını ekrana yazıdırn. Çok dosyalı çalışın. #ifndef VEKTOR_H #define VEKTOR_H typedef struct vektor_s double x, y, z; vektor_t; void vektor_gir(vektor_t &v); void vektor_yaz(const vektor_t &v); vektor_t scarpim(double skalar, const vektor_t &v); vektor_t xcarpim(const vektor_t &v1, const vektor_t &v2); #endif // VEKTOR_H void vektor_gir(vektor_t &v)
cout << "x girin: "; cin >> v.x; cout << "y girin: "; cin >> v.y; cout << "z girin: "; cin >> v.z; void vektor_yaz(const vektor_t &v) cout << '(' << v.x << ',' << v.y << ',' << v.z << ')'; vektor_t scarpim(double skalar, const vektor_t &v) vektor_t s; s.x = v.x * skalar; s.y = v.y * skalar; s.z = v.z * skalar; return s; vektor_t xcarpim(const vektor_t &v1, const vektor_t &v2) vektor_t v; v.x = v1.y*v2.z - v1.z*v2.y; v.y = v1.z*v2.x - v1.x*v2.z; v.z = v1.x*v2.y - v1.y*v2.x; return v; int main(void) vektor_t v1, v2, v3; double a; cout << "v1 vektorunu girin:" << endl; vektor_gir(v1); cout << "v2 vektorunu girin:" << endl; vektor_gir(v2); cout << "v1:"; vektor_yaz(v1); cout << "v2:"; vektor_yaz(v2); v3 = xcarpim(v1, v2); cout << "v3=v1*v2="; vektor_yaz(v3); cout << "skalar girin:"; cin >> a; cout << "a*v3="; vektor_yaz(scarpim(a, v3));