BİL102 - Bilgisayar Yazılımı II Özet Ders Notları

Benzer belgeler
BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-8 Dosya İşlemleri-1. Yrd. Doç. Dr. Ümit ATİLA

Dizgiler. C dilinde karakter m şeklinde tek tırnak içerisinde yazılan ifadelerdir. Bu karakterlerin her biri aslında bir tamsayı ile ifade edilir.

Yrd. Doç. Dr. Caner ÖZCAN

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

Eln 1002 Bilgisayar Programlama II

işlemler bittikten sonra dosyaların kapatılması uygun olacaktır. Bunun için, fclose(fin);

1 PROGRAMLAMAYA GİRİŞ

Temel Dosya İşlemleri. Kütük Organizasyonu 1

ALGORİTMA VE PROGRAMLAMA II

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

DOSYA İŞLEMLERİ Programlama dilleri hafta -

Yrd. Doç. Dr. Caner ÖZCAN

Eln 1001 Bilgisayar Programlama I

BMT 101 Algoritma ve Programlama I 5. Hafta. Yük. Müh. Köksal Gündoğdu 1

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

PROGRAMLAMAYA GİRİŞ DERS 2

Temel Bilgisayar Programlama

Giriş. ENF102 Jeoloji

String ve Karakter Dizileri. Yrd. Doç. Dr. Fehim KÖYLÜ Erciyes Üniversitesi Bilgisayar Mühendisliği Bölümü

Metin Dosyaları. Metin Dosyaları Dosya Açma ve Kapama Dosya Okuma ve Yazma Rastgele Erişim Standart Girdi/Çıktı Hata Kontrolü

C Dosyalama. Öğr. Gör. M. Ozan AKI. Rev 1.0

BTEP243 Ders 3. class Yazım Kuralı:

10. DOSYA GİRİŞ ÇIKIŞ FONKSİYONLARI

Hafta 12 Karakter Tutan Diziler

C Programlama Dilininin Basit Yapıları

DİZİLER 5/4/2010. ENF-102 Jeoloji Giriş. Tek Boyutlu Diziler. Tek Boyutlu Diziler. Örnek. Örnek

PASCAL PROGRAMLAMA DİLİ YAPISI

C++ Dersi: Nesne Tabanlı Programlama

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

BMB1002 Bilgisayar Programlamaya Giriş. Dosyalar. Prof. Dr. Necmettin Kaya

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

BİL1001 Bilgisayar Bilimlerine Giriş 1

Bölüm 2 - C ile Programlamaya Giriş

Göstericiler (Pointers)

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

mod ile açılacak olan dosyanın ne amaçla açılacağı belirlenir. Bunlar:

şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2;

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

C++ Dersi: Nesne Tabanlı Programlama

Genel Programlama II

Fall Object-Oriented Programming Laboratory 02 - Structures

YZM 2105 Nesneye Yönelik Programlama

NESNEYE YÖNELİK PROGRAMLAMA

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

Temel Giriş/Çıkış Fonksiyonları

ALGORİTMA VE PROGRAMLAMA II

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Sınav tarihi : Süre : 60 dak.

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

ELN1001 BİLGİSAYAR PROGRAMLAMA I

C++ Dersi: Nesne Tabanlı Programlama

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

ALFASAYISAL BİLGİLER KARAKTER DİZİLERİ (STRING)

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

PROGRAMLAMA. Dosyalama İşlemleri. Yrd. Doç. Dr. Bülent Çobanoğlu. Sakarya Üniversitesi Mekatronik Mühendisliği. Yrd.Doç.Dr.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

BMT 106 Algoritma ve Programlama II Bahar Dönemi

C Konsol Giriş Çıkış Fonksiyonları

Fonksiyonlar (Altprogram)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Programlama Dillerinde Kullanılan Veri Tipleri

Yrd. Doç. Dr. Caner ÖZCAN

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

BİL-142 Bilgisayar Programlama II

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

ALGORİTMA VE PROGRAMLAMA I

HSancak Nesne Tabanlı Programlama I Ders Notları

Operator Aşırı Yükleme (Operator OverLoading)

EBG101 PROGRAMLAMA TEMELLERİ VE ALGORİTMA

BÖLÜM 11: YAPISAL VERİ TİPLERİ

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

C++ Dersi: Nesne Tabanlı Programlama

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

Pointers (İşaretçiler)

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

Java da İşleçler, Ders #3 (4 Kasım 2009)

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

10/17/2007 Nesneye Yonelik Programlama 3.1

C PROGRAMLAMA D İ L İ

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

HSancak Nesne Tabanlı Programlama I Ders Notları

C++ Operatörler (Operators)

Nesne Tabanlı Programlama

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

NESNE MODELLERİ : SINIFLAR

BMT 101 Algoritma ve Programlama I 6. Hafta. Yük. Müh. Köksal Gündoğdu 1

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

STRİNG DİZİLER(KATARLAR)

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

Algoritma ve Programlama: Karar Yapıları ve Döngüler

Transkript:

BİL102 - Bilgisayar Yazılımı II Özet Ders Notları Halil Özmen Bu notlar, Başkent Üniversitesindeki BİL102 Bilgisayar Yazılımı II dersini veren öğretmenlerin konuları eksiksiz anlatmaları için, bir kontrol listesi olması amacıyla hazırlanmıştır. Kapsamlı ders notları değildir, önerilen ders kitapları yerine geçmez. Özet bilgi içerir, detayları eğitimci ders sırasında anlatmalıdır. Öğrencinin, bu notların yanı sıra, mutlaka ders notu tutması ve önerilen ders kitabını kullanması gerekir. Kaynak: "C How To Program, 8th Ed.", Deitel & Deitel. İÇİNDEKİLER 1. Göstericiler (Pointers)... 1 2. Dizgiler (Strings)... 3 3. Yapılar (Structures)... 6 4. Dosyalar (Files)... 9 5. C++'a Giriş... 12 6. Nesne Yönelimli Programlama (Object Oriented Programming)... 15 7. Operatör Aşırı Yükleme (Operator Overloading)... 22 8. Kalıtım (Inheritance)... 25 1. Göstericiler (Pointers) Gösterici (pointer): Göstericiler başka verilerin adreslerini içeren nesnelerdir. Göstericiler, program çalışırken, başka nesnelerin bellekteki adreslerini içerirler. Gösterici bir veri yapısının (değişken, dizi, dizgi, yapı, vs) adresini içerebileceği gibi, bir fonksiyonun adresini de içerebilir. BİL102 kapsamında sadece veri adresi içeren göstericiler işlenecektir. Göstericiler bazen programlamayı kolaylaştırırlar. Bazı işlemler ise göstericiler olmaksızın yapılamazlar. Gösterici tanımlanması ve değer atanması: int sayac; // int değişken tanımlanması int *sayacptr = NULL; // int değişkene gösterici tanımlanması sayacptr = &sayac; // Gösterici sayac değişkeninin adresini içeriyor Göstericiler ile ilgili operatörler: & operatörü: Adres operatörüdür, sağındaki nesnenin adresini oluşturur. &a a değişkeninin adresi. &aptr aptr nesnesinin adresi. * operatörü: Bir adresteki verinin kendisini veren operatördür. *aptr aptr'ın gösterdiği adresteki veri. aptr = &a; printf("%d\n", *aptr); // a'nın adresi // a'nın değeri yazdırılıyor. NULL Gösterici: Bazen bir gösterici hiçbir veriyi göstermeyebilir. Bu durumda değeri NULL olur. Bunlara NULL gösterici denir. (Dizgilerde kullanımı gösterilecektir.)

int *xptr; xptr = NULL; Parametre Geçirme Türleri: C dilinde parametreler fonksiyonlara iki türlü geçirilirler: Değer-ile-geçirme (pass-by-value): Gönderilen parametrenin bir kopyası fonksiyonda oluşturulur, fonksiyon bu kopyayı kullanır. Fonksiyonun çağırıldığı yerdeki parametre etkilenmez. Adres-ile-geçirme (pass-by-reference): Fonksiyona nesnenin adresi veya referansı gönderilir. Fonksiyon bu adresi (referansı) kullanır. int a = 77, b = 12; int *aptr = &a; fonk1(a, b); fonk2(&a, b); fonk3(aptr, b); // Her 2 parametre değer-ile-geçiriliyor. // 1. parametre adres-ile-geçiriliyor. // 1. parametre gösterici, yani adres içeriyor. Göstericiler ve diziler arasındaki ilişkiler: int a = 77; int arr[100]; int j; int *aptr = &a; int *arrptr; arrptr = arr; Yukarıdaki program parçasındaki tanımlara göre, şu yazımlar eşdeğerdir ya da aynı sonucu verir. a *aptr *aptr a'nın değerini verir arr &arr[0] arr tek başına dizinin başlangıç adresini verir. arr[j] *(arr + j) Her iki yazım eşdeğerdir. Dizinin j'ninci elemanının değeri. *arrptr arrptr[0] *(arrptr+j) arrptr[j] arr[j] arrptr[j] Göstericiler üzerinde aritmetik işlemler: Eğer bir gösterici, dizinin bir elemanını gösteriyorsa, gösterici artırıldığında dizinin bir sonraki elemanını gösterir. int dizi[100] = 12, 4, 8, 41, 70, 3, 28, 32, 0, 16; int *dptr; dptr = dizi; // dptr dizinin başlangıç adresi. Veya: dptr = &dizi[0]; printf("%d, ", *dptr); // 12 dptr++; // dizinin sonraki elemanının adresi olur. Yani: &dizi[1] printf("%d, ", *dptr); // 4 const Kullanımı: Eğer bir parametre fonksiyonda değiştirilmeyecekse, const sözcüğü ile tanımlanmalıdır. void diziyaz(const char *baslik, int *diziptr, const int n) int j; printf("%s\n", baslik); for (j = 0; j < n-1; j++) // Sonuncu hariç diziyi dolas. printf ("%d, ", *diziptr); diziptr++; printf("%d\n", *diziptr); // Sonuncusunu yaz ve satir basi yap. // end diziyaz BİL102 - Özet Ders Notları 2 Halil Özmen

2. Dizgiler (Strings) Dizgiler içinde karakterler barındıran veri yapılarıdır. Karakterler ASCII tablosundaki kodlarla tutulurlar. Dizgiler C dilinde, char dizisi olarak tanımlanır. Dizgideki son karakterden sonra mutlaka '\0' (NULL karakter) gelir. NULL karakter sadece 1 byte uzunluğundadır ve göstericilerdeki NULL değerinden (4 veya 8 byte) farklıdır. Programın daha okunaklı olması için NULLCHAR deyiminin tanımlanması ve kullanılması yararlıdır. #define NULLCHAR '\0' Dizgi tanımlanması: char ad[40]; // NULL karakter olacağı için en çok 39 karakter alır. Sabit dizgiler: Sabit dizgiler çift-tırnak " ile başlar ve biter. "Bizim galaksimizin adı Samanyolu Galaksisi'dir." "Bu çift tirnak \" içeren bir dizgi!" "Burada \"iki çift tirnak\" var." Dizgi değişkene sabit dizgi atamak: bir dizgi değişkene tanımlama sırasında atanabilir, veya daha sonra strcpy komutu kullanarak sabit dizgi atanabilir. char sehir[20] = "Antalya"; // Tanımlama sırasında dizgi atama. char sehir[] = "Antalya"; // Sadece 8 byte yer tutar. char sehir[20]; // NULL karakter olacağı için en çok 19 karakter alır. strcpy (sehir, "Antalya"); İndeks 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 İçerik A n t a l y a \0 Belirsiz. char sehir[20]; // NULL karakter olacağı için en çok 19 karakter alır. strcpy (sehir, "Buenos Aires"); strcpy (sehir, "Antalya"); İndeks 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 İlk hali B u e n o s A i r e s \0 Sonraki A n t a l y a \0 i r e s \0 Dizgi sonu. Belirsiz. Karakter Fonksiyonları <ctype.h> ın programa dahil edilmesi gereklidir (#include <ctype.h>). int isblank(int c) int isspace(int c) int isdigit(int c) int isalpha(int c) int isalnum(int c) int islower(int c) int isupper(int c) Parametre olarak verilen karakter boşluk karakteri (' ') ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. Parametre olarak verilen karakter beyaz boşluk karakterlerinden biri (' ', '\t', veya '\n', vs.) ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. Parametre olarak verilen karakter rakam karakteri ('0' '1' '2'... '9') ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. Parametre olarak verilen karakter harf ('A' - 'Z', 'a' - 'z') ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. Parametre olarak verilen karakter, alfa-nümerik (rakam veya harf) ('0' - '9', 'A' - 'Z', 'a' - 'z') ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. Parametre olarak verilen karakter, küçük harf ('a' - 'z') ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. Parametre olarak verilen karakter, büyük harf ('A' - 'Z') ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. BİL102 - Özet Ders Notları 3 Halil Özmen

int ispunct(int c) Parametre olarak verilen karakter, rakam, harf veya boşluk dışındaki basılabilen karakterlerden biri ('.' ',' '!', '(' ')' '&' vs...) ise, 1 yani doğru döndürür, değilse 0 yani yanlış döndürür. int tolower(int c) Parametre olarak verilen karakter, eğer büyük harf ('A' - 'Z') ise onun küçük harfini döndürür, değilse karakterin kendisini değiştirmeden döndürür. int toupper(int c) Parametre olarak verilen karakter, eğer küçük harf ('a' - 'z') ise onun büyük harfini döndürür, değilse karakterin kendisini değiştirmeden döndürür. Dizgi Düzenleme Fonksiyonları <string.h> ın programa dahil edilmesi gereklidir (#include <string.h>). char *strcpy(char *s1, const char *s2) char *strncpy(char *s1, const char *s2, size_t n) char *strcat(char *s1, const char *s2) char *strncat(char *s1, const char *s2, size_t n) Örnekler: s2 dizgisini s1'e kopyalar. s1'i döndürür. s2 dizgisinin en çok ilk n karakterini s1'e kopyalar. Eğer s2 de n'den daha az karakter varsa NULL karakteri kopyaladıktan sonra durur. s1'i döndürür. s2 dizgisini s1'in sonuna ekler. s2'nin ilk karakteri s1'in sonundaki NULL karakterin üzerine kopyalanır. s1'i döndürür. s2 dizgisinin en çok ilk n karakterini s1'in sonuna ekler. s2'nin ilk karakteri s1'in sonundaki NULL karakterin üzerine kopyalanır. s1'i döndürür. char d1[40] = "Akdeniz"; char d2[40], d3[40]; strcpy(d2, d1); // d1'i d2'ye kopyalar. d2 <= "Akdeniz" strcpy(d3, d1+2); // d1+2 adresinden sonrasini d3'ye kopyalar: "deniz" strcat(d2, d3); // d2 <= "Akdenizdeniz" u1 = strlen(d1); // u1 = 7 strncat(d1, d3, 3); // d1 <= "Akdenizden" d1[u1+3] = '\0'; // strncat NULL character koymadığı için bu gerekli. Dizgi giriş ve çıkış işlemleri ve fonksiyonları int getchar(void) Standart girdiden bir sonraki c = getchar(); karakteri okur ve döndürür. char *gets(char *s) Standart girdiden satır okur. gets(str); int scanf("%s", dizgi); Boşluğa kadarki girdiyi okur. scanf("%s", ad); Birden çok kelime okunacaksa, gets() kullanmak gerekir. int printf("%s",dizgi); Verilen dizgiyi yazar. sprintf("ad: %s\n", ad); int putchar(int c) Verilen karakteri yazar. putchar(c); int puts(const char *s) Verilen dizgiyi yazar ve satırbaşı puts(str); yapar. int sprintf(char *s,const char *format,...) Verilen dizginin içine yazar. sprintf(str, "%d %.2lf", k, x); int sscanf(char *s,const char *format,...) Verilen dizginin içinden okur. sscanf(str, "%d %d", m, n); Örnekler: char d1[40], d2[40]; scanf("%s", d1); // girdideki boşluğa kadarki kısmı d1'e koyar. gets(d2); // Girdideki tüm satırı okur ve d2'ye koyar. printf("%s", d2); // d2 dizgisini yazar. puts(d2); // d2 dizgisini yazar ve satır-başı yapar. Dizgi Karşılaştırma Fonksiyonları int strcmp(const char *s1, const char *s2); s1 ve s2'yi ASCII kod olarak karşılaştırır. s1 s2'ye eşitse 0, büyükse pozitif sayı, küçükse negatif sayı döndürür. BİL102 - Özet Ders Notları 4 Halil Özmen

int strncmp(const char *s1, const char *s2, size_t n); Örnekler: s1 ve s2'nin en çok ilk n karakterini ASCII kod olarak karşılaştırır, birinin uzunluğu n'den azsa onun uzunluğu kadar karşılaştırır. Eşitse 0, ilkindeki büyükse pozitif sayı, küçükse negatif sayı döndürür. char d1[] = "Ankara"; char d2[] = "Antalya"; char d3[] = "Ankara"; if (strcmp(d1, d2) > 0) // d1 d2'den küçük (önce) olduğu için negatif sayı döndürür ==> Yanlış.... if (strcmp(d1, d3) == 0) // d1 ve d3 aynı oldukları için 0 döndürür ==> Doğru.... if (strncmp(d1, d2, 2) == 0) // d1 ve d2'nin ilk 2 karakteri eşit için 0 döndürür ==> Doğru.... char a1[] = "Ali"; char a2[] = "Aliye"; if (strcmp(a1, a2) < 0) // a2 de ekstra karakterler olduğu için a2 daha büyük, negatif sayı. ==> Doğru... Dizgi Dizileri (String Array), Tanımlarken ilk boyut dizgi adedini, ikinci boyut her bir dizgi elemanının uzunluğunu (bellekte kapsadığı yeri) içerir. Hem tanımlarken, hem de fonksiyon parametresi olarak kullanılırken, dizgi uzunluğunun (2. boyut) belirtilmesi zorunludur. char sehirler[81][21]; // 81 adet 20 uzunlukta dizgi strcpy (sehirler[0], "Antalya"); strcpy (sehirler[1], "Izmir"); strcpy (sehirler[2], "Edirne"); char adlar[][25] = "Mustafa Kemal", "Albert Einstein", "Descartes"; void dizgidiziyaz (char dizgiler[][uzunluk], int n) int j; for (j = 0; j < n; j++) printf("%s\n", dizgiler[j]); Dizgi Arama Fonksiyonları char *strchr (char *string, int c) string içinde c karakterinin ilk olduğu yerin adresini döndürür. Bulamazsa NULL döndürür. char *strrchr (char *string, int c) string içinde c karakterinin son olduğu yerin adresini döndürür. Bulamazsa NULL döndürür. char *strstr (char *str1, char *str2) str1 içinde str2 dizgisinin ilk geçtiği yerin adresini döndürür. Bulamazsa NULL döndürür. Dizgi Dönüştürme Fonksiyonları int atoi(const char *str) Dizgi içindeki long sayıyı döndürür. "408" 408 double atof(const char *str) Dizgi içindeki double sayıyı döndürür. "3.14" 3.14 Örnekler: char d1[] = "1729 ve Ramanujan"; char d2[] = "3.141592 pi, 2.71828 e sayisidir."; int a; double x; a = atoi(d1); // fonksiyon 1729 sayısını döndürür. x = atof(d2); // fonksiyon 3.141592 sayısını döndürür. BİL102 - Özet Ders Notları 5 Halil Özmen

3. Yapılar (Structures) Yapılar, içinde birden çok veri bulunduran nesnelerdir. Bir yapı içinde farklı türde veriler barındırabilir. Yapı tanımlama struct sözcüğü kullanılarak genellikle program başında (fonksiyon prototiplerinden ve main()'den önce) tanımlanır. struct tarih int yil; int ay; int gun; ; struct kisi char ad[21]; char soyad[21]; char cinsiyet; int dogumyili; double kilo; ; Yapı değişkenleri (yapı nesneleri) tanımlama struct kisi struct tarih typedef deyimi k1, kisiler[20], *kptr; t1, tarr[10], *tptr; typedef anahtar sözcüğü veri tiplerini daha kolay adlandırmak için kullanılır. Programın okunurluğunu artırır. struct kisi char ad[21]; char soyad[21]; char cinsiyet; int dogumyili; double kilo; ; typedef struct kisi Kisi; // (veya) typedef struct kisi kisi_t; Kisi k1, kisiler[20]; // program içinde yapı nesnesi tanımlanması. // kisi_t k1, kisiler[20]; // typedef struct kisi kisi_t; diye tanımlandıysa // veya: typedef struct // typedef varsa "tag" ismine gerek yok! char ad[21]; char soyad[21]; char cinsiyet; int dogumyili; double kilo; Kisi; Kisi k1, kisiler[20]; // program içinde yapı nesnesi tanımlanması. BİL102 - Özet Ders Notları 6 Halil Özmen

Yapı değişkenlerine ilk değer atanması (Initializing structure) typedef struct int saat; int dak; int san; Zaman; typedef struct char ad[21]; char soyad[21]; char cinsiyet; int dogumyili; double kilo; Kisi; // 'E' veya 'K' int main() Zaman z = 11, 59, 58; Kisi k1 = "Elif", "Huzurlu", 'K', 2000, 52.4;.... Yapı elemanlarına erişim (Accessing Members of Structures) Yapı elemanlarına erişim nokta (dot) ve ok (arrow) operatörleri ile gerçekleştirilir. Kisi k1, kisiler[20], *kptr; Nokta (dot) (. ) operatörü Bir yapının elemanlarına erişmek için, nokta (.) operatörü kullanılır. strcpy (k1.ad, "Burcu"); strcpy (k1.soyad, "Ekermen"); k1.cinsiyet = 'K'; k1.dogumyili = 1994; k1.kilo = 60.1; Ok (arrow) ( -> ) operatörü Bir yapı göstericisinin gösterdiği yapının elemanlarına erişmek için, ok (->) operatörü kullanılır. kptr = &k1; printf("ad Soyad: %s %s\n", kptr->ad, kptr->soyad); kptr->kilo = 57.8; Yapılara atama Yapılara doğrudan atama yapılabilir. Kisi k1, k2;... // k1 yapısı oluşturuldu. k2 = k1; // k1 yapısı komple k2'ye kopyalanıyor. Kisi kisiler[10], kyedek;... // kisiler[j] ile kisiler[j+1] arasında yer değiştirmek: kyedek = kisiler[j]; kisiler[j] = kisiler[j+1]; kisiler[j+1] = kyedek; BİL102 - Özet Ders Notları 7 Halil Özmen

Yapıların fonksiyonlara gönderilmesi Yapılar fonksiyonlara şu yollarla geçirilirler: Yapının bir elemanını geçirmek, Bir yapının tamamını geçirmek (değer-ile geçirilir), Yapının adresini veya yapı-göstericisini geçirmek. kisiyaz (k1); // Değer ile yapı geçirmek. void kisiyaz (Kisi kisi) // Yapının bir kopyası fonksiyonda oluşuyor. printf("ad Soyad: %s %s (%c), Dogum yili: %d, Agirlik: %.2lf kg\n", kisi.ad, kisi.soyad, kisi.cinsiyet, kisi.dogumyili, kisi.kilo); kisioku (&k1); // Adres ile yapı geçirmek. kisiyaz2 (&k1); // Adres ile yapı geçirmek. void kisioku (Kisi *kptr) // çağrıldığı yerdeki yapıya gösterici. printf("ad: "); gets(kptr->ad); // çağrıldığı yerdeki yapıya konuyor. printf("soyad: "); gets(kptr->soyad); // çağrıldığı yerdeki yapıya konuyor. printf("cinsiyet, Dogum Yili ve Agirlik giriniz: "); scanf("%c %d %lf", &(kptr->cinsiyet), &(kptr->dogumyili), &(kptr->kilo)); void kisiyaz2 (Kisi *kptr) // çağrıldığı yerdeki yapıya gösterici. printf("ad Soyad: %s %s (%c), Dogum yili: %d, Agirlik: %.2lf kg\n", kptr->ad, kptr->soyad, kptr->cinsiyet, kptr->dogumyili, kptr->kilo); BİL102 - Özet Ders Notları 8 Halil Özmen

4. Dosyalar (Files) Bir program çalışırken oluşturulan bilgiler, program durduğunda yok olur. Bilgisayarlar bilgileri dosyalarda tutarlar. Bir programda oluşturulan veya işlenen verinin kaybolmamasını istiyorsak, bilgileri dosyaya (dosyalara) yazarız. Veri Hiyerarşisi Bit: Byte: 0 veya 1 değeri alabilen, bilgisayardaki en küçük veri nesnesidir. İkili sayı sistemindeki tek bir rakama (0 veya 1) karşılık gelir. 8 adet bitten oluşmuş olan veri parçasıdır. Bilgisayar bellek ve disk boyutları "byte" cinsinden belirtilir: KB, MB, GB, TB, vs. Karakter: Karakterler, rakamlar, harfler, noktalama işaretleri, bazı matematiksel işaretler (+, -, /, =), parantezler ve diğer özel sembollerdir. Bilgisayarlarda ASCII kodlarla tutulurlar. ASCII karakterler 8 bitte, yani bir byte'ta tutulurlar. Alan: Kayıt: Dosyalar: Veri-tabanı (database): Karakterlerin bitlerden oluşması gibi, alanlar da karakterlerden veya byte'lardan oluşurlar. Örneğin bazı bilgisayarlarda (işletim sistemlerinde), tam sayılar 4 byte, noktalı sayılar 4 (float) veya 8 byte (double) yer tutarlar. Birbirleriyle ilişkili birkaç alan bir kaydı oluştururlar. Dosyalar, birbirleriyle ilişkili bir grup kaydın bulunduğu nesnelerdir. Veri tabanları verilerin kolay erişim için bir arada tutulduğu ortamlardır. Dosyalar ve Akışlar (Files and Streams) C programları, dosyaları sıralı byte dizisi (akış) olarak görür. Bir C programı çalışmaya başladığında, üç akış (stream) otomatik olarak açılır: stdin, stdout, stderr. Standart girdi (standard input = stdin) akışı klavyeden okumayı sağlar. Standart çıktı (standard output = stdout) akışı ekrana yazmayı sağlayan akıştır. Standart hata (standard error = stderr) akışı, hata mesajlarının ekrana yazılmasını sağlar. stdin, stdout ve stderr <stdio.h> içinde tanımlanmışlardır. Dosyalar: Ya sonunda dosya-sonu (end-of-file) karakteri ile biter, Ya da belli bir yerinde dosyanın kaç byte'tan oluştuğu bilgisi kayıtlıdır. Dosya Türleri Düz metin dosyaları (plain text files): Notepad veya benzeri bir programla açılabilen, içeriğin insanlar tarafından doğrudan okunabildiği dizgilerden oluşan dosyalardır..txt,.inf,.c,.h,.cpp,.html, vb. dosyalar bu tür dosyalardır. Kodlanmış dosyalar: Kaydedilebilmesi ve açılabilmesi için özel program gerektiren veya içindeki bilgilerin bilgisayar içinde tutulduğu ikili kod sistemi ile aynı şekilde kaydedilmiş olan dosyalardır..exe,.jpg,.avi,.mp3,.pdf,.docx,.xlsx,.zip, vb. dosyalar bu tür dosyalardır. Ses, resim, video, çalıştırılabilir program, veri dosyaları, sıkıştırılmış dosyalar gibi pek çok türleri vardır. Dosya Erişim Türleri Sıralı Erişim (Sequential Access): Dosyanın başından başlayıp, bilgilerin sıralı okunmasına ya da yazılmasına sıralı erişim denir. Rasgele (doğrudan) Erişim (Random Access): doğrudan dosya içindeki herhangi bir yerdeki bilgiye erişilmesi mekanizmasına rasgele erişim denir. Erişilen noktadan itibaren, okuma veya yazma yapılabilir. BİL102 - Özet Ders Notları 9 Halil Özmen

Dosya Açma ve Kapama Dosyaları açmak ve kullanmak için bir dosya göstericisi (FILE *) tanımlamak gerekir. FILE *dptr; // Dosya göstericisi tanımlama. Dosya açma işlemi fopen() fonksiyonu ile yapılır. Açma işlemi başarısız olursa, NULL döndürür. Dosya kapama işlemi fclose() fonksiyonu ile yapılır. Bir dosya ile ilgili başka işlem yapılmayacaksa, dosya kapatılmalıdır. Dosya Açma Modları Aşağıdaki tablo bazı dosya açma modlarını içermektedir. Başka dosya açma modları da vardır. r Var olan dosyayı okuma modunda açmak için. w Yazma amaçlı dosya yaratmak için. Dosya zaten varsa, içeriği yok edilip yeniden yaratılır. a Dosya sonuna eklemek için. Dosya varsa sonuna eklenir, yoksa yaratılır ve yazılır. r+ Var olan dosyayı güncellemek için kullanılır, hem okuma hem yazma işlemleri yapılabilir. w+ Okumak ve yazmak için dosya yaratılır. Dosya zaten varsa, içeriği silinip baştan yaratılır. a+ Okumak ve güncellemek için dosya açılır veya yaratılır. Tüm yazmalar dosya sonuna yapılır. rb Var olan dosyayı ikili (binary) modda açmak içindir. FILE *dptr; dptr = fopen(<dosya adı dizgisi>, <mod>); if (dptr == NULL) // dosya açılamadığında fopen NULL döndürür. return(1);... fclose(dptr); // Dosyayı kapat. Örnekler: FILE *dptr; dptr = fopen("dosya1.txt", "r"); // "r" okumak için if (dptr == NULL) printf ("dosya1.txt açilamadi.\n"; return (1); // Programı hata ile sonlandır....... // Dosya ile ilgili işlemler. fclose(dptr); // Dosyayı kapat. FILE *d1ptr, *d2ptr, *d3ptr; // Birden çok dosya açmak gerekebilir. if ((d1ptr = fopen("dosya1.txt", "r")) == NULL) printf ("dosya1.txt açilamadi.\n"; else // açıldı....... if ((d2ptr = fopen("dosya2.txt", "w")) == NULL) printf ("dosya2.txt açilamadi.\n"; else // açıldı....... if ((d3ptr = fopen("dosya3.txt", "a")) == NULL) printf ("dosya3.txt açilamadi.\n"; else // açıldı....... // "r" okumak için // "w" yazmak için // "a" eklemek için fclose(d1ptr); fclose(d2ptr); fclose(d3ptr); BİL102 - Özet Ders Notları 10 Halil Özmen

Dosya giriş, çıkış ve konumlandırma fonksiyonları int fgetc (FILE *stream) Dosyadan bir karakter okuyup döndürür. int fputc (int character, FILE *stream ) 1. parametredeki karakteri dosyaya yazar. char * fgets (char * str, int num, FILE *stream ) Dosyadan bir satır okur ve 1. parametredeki dizgiye koyar. Dosyadaki satırın uzunluğu "num"dan fazlaysa sadece "num" kadar karakter okur. int fputs (const char *str, FILE *stream) Dizgiyi (olduğu gibi) dosyaya yazar. Dizgi sonunda satır-başı karakteri yoksa, dosyada da satır-başı olmaz. fprintf (FILE *stream,......) printf'in stdout'a (ekrana) yazdığı gibi, aynı şekilde dosyaya yazmakta kullanılır. fscanf (FILE *stream,......) scanf'in stdin'den (klavyeden) okuduğu gibi, aynı şekilde dosyadan okumakta kullanılır. int feof (FILE *stream) Dosyanın sonuna gelindiyse (veya son okuma işlemi başarısız olduysa), feof fonksiyonu doğru döndürür, aksi halde 0 (yanlış) döndürür. void rewind (FILE * stream) Dosya konum göstergecini dosyanın başına getirir. int fseek (FILE *stream, long int offset, int origin) Dosya konum göstergecini (file position pointer) dosyanın "origin" den "offset" kadar byte ilerisine getirir. "origin" SEEK_SET, SEEK_CUR veya SEEK_END seçeneklerinden birisidir. Dosya başlangıcı için SEEK_SET, mevcut konum için SEEK_CUR, dosya sonu için SEEK_END kullanılır. "offset" negatif ise, o kadar byte geriye götürür. Başarılı olursa fonksiyon 0 (sıfır) döndürür. Örnekler: FILE *dptr; char c, str[200], ad[40]; int boy; dptr = fopen(dosyaadi,...); c = fgetc (dptr); fputc (c, dptr); fgets (str, 200, dptr); fputs (str, dptr); rewind (dptr); // Dosyadan 1 karakter oku. // Dosyaya 1 karakter yaz. // Satır sonuna kadar ama en çok 200 karakter oku. // Dizgiyi dosyaya yaz. Satır-başı eklemez. // Dosyanın başına dön. fprintf (dptr, "Ad: %-20s Boy: %d\n", ad, boy); fscanf (dptr, "%d", &boy); // Formatlı oku. // Formatlı yaz. while (!feof(dptr) )...... // Dosya sonu değilse devam et. fseek (dptr, 10, SEEK_SET); c = fgetc (dptr); // Dosyanın başındaki 10. karaktere git. // Dosyadan 10. karakteri oku. BİL102 - Özet Ders Notları 11 Halil Özmen

5. C++'a Giriş C++ Tarihçesi Danimarkalı bilgisayar bilimcisi Bjarne Stroustrup doktora çalışmaları sırasında 1979 yılında "Nesne Yönelimli Programlama" (object oriented programming) üzerinde çalışmaya başlar. Kullandığı Simula- 67 çok yavaş olduğu için, "C" diline sınıfların (classes) eklenmiş şekli olan "C with Classes" dilini yaratır ve kullanmaya başlar. 1983 yılında dilin adını "C with Classes" adından "C++" a çevirir. 1985 yılında Bjarne Stroustrup "The C++ Programming Language" kitabını yayınlar ve C++ ticari olarak kullanılmaya başlanır. 1990'da "The Annotated C++ Reference Manual" yayınlanır ve aynı yıl Borland "Turbo C++" piyasaya sürülür. C++'ın yaygınlaşmasında "Turbo C++"ın çok büyük etkisi vardır. C ve C++ Arasındaki Başlıca Farklar C ile C++ arasındaki başlıca farklar şöyle özetlenebilir: Sınıflar (classes). C prosedürel bir programlama dili iken ve sınıfları ve nesneleri desteklemez iken, C++ "nesne yönelimli" (object oriented) bir programlama dilidir ve sınıfları ve nesneleri destekler. Girdi ve çıktı farkları: std::cin, std::cout... Açıklamaların /*... */ şeklinde yazılması yerine, satırın gerisi açıklama ise //... şeklinde yazılması. C++'ta main() sonunda "return(0);" yazmaya gerek yoktur. C fonksiyon aşırı yüklemeyi (function overloading) desteklemezken, C++ destekler. C++'ta String ve Boolean veri tipleri vardır. C++'ta referans parametrelerinin kullanımı daha basit ve kolaydır. C++'ta varsayılan değerli fonksiyon parametreleri vardır. Başka birçok fark vardır. Yukarıdaki farklar ve bazı diğer farklar ileride açıklanacaktır. İlk C++ Programları #include <iostream> // Programın girdi çıktı yapmasını sağlar. int main() std::cout << "Merhaba Galaksi!\n"; std::cout << "2 kere 2 = " << 2 * 2 << std::endl; // end main // Ekrana yaz. // Ekrana yaz. #include <iostream> using namespace std; // Programın girdi çıktı yapmasını sağlar. // std::cout, std::cin, vs. yerine dogrudan cout, cin int main() cout << "Ilk tamsayiyi giriniz: "; int sayi1; cin >> sayi1; // Ilk sayiyi oku ve sayi1 degiskenine koy. cout << "Ikinci tamsayiyi giriniz: "; int sayi2; cin >> sayi2; // 2. sayiyi oku ve sayi2 degiskenine koy. int toplam = sayi1 + sayi2; // Sayilari topla ve toplam'a koy. cout << "Toplam = " << toplam << endl; // toplamı göster. cout << "Toplam = " << sayi1 + sayi2 << endl; // toplamı göster. // end main BİL102 - Özet Ders Notları 12 Halil Özmen

Referanslar ve Referans Parametreler İki türlü parametre geçirme yöntemi vardır: Değer-ile-geçirme (pass-by-value): Gönderilen parametrenin bir kopyası fonksiyonda oluşturulur, fonksiyon bu kopyayı kullanır. Fonksiyonun çağırıldığı yerdeki parametre etkilenmez. Referans-ile-geçirme (pass-by-reference): Fonksiyona nesnenin referansı (adresi) gönderilir. Fonksiyon bu referansı kullanır. C++'ta referans parametre yazımında ve fonksiyon içindeki kullanımında kolaylıklar getirilmiştir. 1. Sadece fonksiyon başlık satırında ve prototipinde & operatörü kullanılır. 2. Fonksiyon çağırılırken parametrede veya fonksiyon içinde hiçbir operatör kullanılmaz! Fonksiyondaki parametre, fonksiyonun çağırıldığı yerdeki parametre olmuş olur. #include <iostream> // Programin girdi çikti yapmasini saglar. using namespace std; // std::cout, std::cin, vs. yerine dogrudan cout, cin int degerilekare (int n); void referansilekare (int &nref); int main() int x = 2; cout << "Baslangictaki x = " << x << endl; cout << "degerilekare'nin sonucu = " << degerilekare(x) << endl; cout << "degerilekare'den sonra x = " << x << endl << endl; int y = 4; cout << "referansilekare'den once y = " << y << endl; referansilekare(y); cout << "referansilekare'den sonra y = " << y << endl; // end main int degerilekare (int n) n = n * n; // veya: n *= n; return (n); void referansilekare (int &nref) nref *= nref; Varsayılan (Default) Parametre Değerleri Fonksiyon prototipinde parametrelere varsayılan değer atanabilir. Bu durumda, fonksiyon çağırılırken o parametreler verilmeyebilir. Varsayılan değerli parametreler en son parametreler olmak zorundadır. // Fonksiyon Prototipi double hacim(double uzunluk = 1, double genislik = 1, double yukseklik = 1); int main() cout << "Varsayilan kutu hacmi (1 x 1 x 1) = " << hacim() << endl; cout << "Uzunlugu 2 olan kutu hacmi (2 x 1 x 1) = " << hacim(2) << endl; cout << "Boyutlari 4, 2.5 ve 1 olan kutu hacmi = " << hacim(4, 2.5) << endl; cout << "Boyutlari 4, 2.5 ve 3 olan kutu hacmi = " << hacim(4, 2.5, 3) << endl; // end main // Hacim hesaplar ve döndürür. double hacim (double uzunluk, double genislik, double yukseklik) return (uzunluk * genislik * yukseklik); BİL102 - Özet Ders Notları 13 Halil Özmen

C++ Standart Kütüphane Başlık Dosyaları <iostream> <iomanip> <cmath> <cstdlib> <ctime> <cctype> <cstring> <string> <array>, <vector>, <list>, <queue>,......... C++ standart girdi ve çıktı akış tanımları. Veri akışlarının formatlanmasına ilişkin tanımlar. Matematik fonksiyonlarının prototipleri. Metinden sayıya, sayıdan metine dönüştürme fonksiyonları, rasgele sayı fonksiyonları, vs. Tarih ve zaman fonksiyonları. Karakter fonksiyonları. C tipi dizgi (string) fonksiyonları C++ String sınıfının tanımı. Dizi ve diğer konteyner öğeler ile ilgili tanımlar ve fonksiyonlar. Fonksiyonların Aşırı Yüklenmesi (Adaş Yordam) (Function Overloading) C++ aynı isimde birden çok fonksiyon tanımlanmasına ve kullanılmasına izin verir. Ancak bu fonksiyonların tüm parametreleri tamamen aynı türde olamazlar. Ya farklı parametre sayısı olmalıdır, ya farklı türde parametreler olmak zorundadır, veya parametre türleri frklı dizilişte olmak zorundadır. Bu özelliğe fonksiyon aşırı yüklenmesi (adaş yordam) (function overloading) denir. Aynı isimde bir fonksiyon çağırıldığında, C++ derleyicisi parametrelerin cinsine, sayısına ve dizilişine bakarak adaş yordamlardan hangisinin kasdedildiğini anlar. Adaş yordamlar, benzer işlem yapan ama farklı veri türleri üzerinde işlem yapan fonksiyonlarda kullanılır. // Fonksiyon Prototipleri: int kare (int x); double kare (double x); int main() cout << "7 nin karesi = " << kare(7) << endl; cout << "7.5 nin karesi = " << kare(7.5) << endl; // Hacim hesaplar ve döndürür. int kare (int x) return (x * x); double kare (double x) return (x * x); C++ Anahtar Sözcükleri: C ve C++ Ortak Sözcükler: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Sadece C++ Anahtar Sözcükleri: and and_eq asm bitand bitor bool catch class compl const_cast delete dynamic_cast explicit export false friend inline mutable namespace new not not_eq operator or or_eq private protected public reinterpret_cast static_cast template this throw true try typeid typename using virtual wchar_t xor xor_eq C++11 Anahtar Sözcükleri: alignas alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local BİL102 - Özet Ders Notları 14 Halil Özmen

6. Nesne Yönelimli Programlama (Object Oriented Programming) Nesne Yönelimli Programlamaya Giriş Gerçek dünyada, hemen herşey nesnelerden oluşur. Çevremizde nesneler görürüz, algılarız: eşyalar, bitkiler, kuşlar, hayvanlar, yiyecekler, binalar, odalar, bilgisayarlar, telefonlar, uçaklar, vs. İnsanlar nesne temelli algılarlar ve düşünürler. Aynı türden nesnelerin ortak yönleri vardır: hepsinin "özellik"leri (verileri / data) vardır, ve hepsi bazı "davranış"lar gösterirler (işlem veya eylem yaparlar). Özellikler için boyut, biçim, renk, ağırlık, kapasite, ad, boy, doğum tarihi, vs. türü şeyler sayabiliriz. Davranış (işlem/eylem) nesne türlerine göre çok farklı olabilir. Otobüs nesneleri için: "durmak", "bir yere gitmek", "yolcu almak", "yolcu indirmek", "benzin almak" gibi işlemleri örnek gösterebiliriz. C++ ve Java nesne yönelimli programlama dilleridirler. Bu gibi dillerle nesneler kullanarak programlamaya NYP - Nesne Yönelimli Programlama (OOP: Object Oriented Programming) denir. Nesne yönelimli tasarlanmış sistemler (object oriented designed systems), en kolay C++, Java gibi NYP'yi yani sınıfları destekleyen dillerle gerçekleştirilebilirler. C gibi diller yordamsal (procedural) dillerdir. Yordamsal dillerde sınıflar ve nesneler yoktur, yordam/işlem temellidirler. Sınıflar (Classes) Her nesne bir sınıfa aittir. "Eda Bal isimli 12345678 numaralı öğrenci" nesnesi "öğrenci" sınıfının bir nesnesidir, "A304 sınıfındaki projektör" nesnesi "projektör" sınıfındandır, "06NYP88 plakalı otomobil" nesnesi "otomobil" sınıfındandır. Her sınıf bir dizi veri (data) ve bir dizi fonksiyon (işlem) içerir. Fonksiyonlar bu sınıftan nesnelerin verilerini işleyen (atamak, güncellemek, sunmak) ve bu sınıftan nesneleri kullananlara çeşitli hizmetler sunan yordamlardır. Sınıflardaki fonksiyonlara üye fonksiyon (member function) da denir. Sınıfların veri tanımlama kısmı, yapılardaki (struct) öğelere benzer. Ancak verilerin kullanımı (atanması ve alınması) çok farklıdır. Sınıfların çeşitli fonksiyonları vardır: Yapıcı fonksiyonlar (constructor): nesne oluşturulurken çalışan fonksiyonlardır. Nesneyi yaratır. Yıkıcı fonksiyonlar (destructor): nesne yok edilirken çalışan fonksiyonlardır. Verilere atama yapan fonksiyonlar ("set" fonksiyonları): nesnelerin (paketlenmiş) verilerine atama yapmak veya değiştirmek için kullanılırlar. Verileri alan fonksiyonlar ("get" fonksiyonları): nesnelerin (paketlenmiş) verilerini alıp kullanabilmek için kullanılırlar. Yardımcı fonksiyonlar: verilerle ilgili alma ve atama işlemleri dışında kalan, nesnelerle ilgili diğer işlemlerin yapıldığı fonksiyonlardır. DİKKAT: Sınıfların verisi (data) bellekte yer işgal etmez, sadece tanımdır! Sınıflardan yaratılan nesnelerin verisi (data) vardır ve bellekte yer alırlar! (C'deki yapı/struct öğeleri gibi.) Sınıflarda veri (data) tanımları vardır, ancak bunlar tanım olmaktan öteye geçmez. Ancak sadece o sınıftan bir nesne yaratıldığında, tanımlanmış olan veriler o nesneye ait olmak üzere yaratılmış olur. Özetle, sınıfların verisi yoktur (sınıfların veri tanımları vardır), nesnelerin gerçek verisi vardır. Paketleme (encapsulation) NYP'de genel yöntem nesnelerin verilerini ve fonksiyonlarının içeriğini (kodlarını) kullanıcıdan saklamaktır. Yani, sınıflardan nesneler oluşturan programcılar, doğrudan nesnelerin verilerine ulaşamazlar, bu işlem sınıflarda tanımlanmış olan verileri alma (get) ve verileri değiştirme (set) fonksiyonları ile yapılır. Sınıflardaki fonksiyonların nasıl kodlanmış olduğunu, o sınıflardan nesneler yaratan programcının bilmesine gerek yoktur. Programcının sadece fonksiyonların neler olduğunu (hangi işe yaradığını) ve parametrelerinin neler olduğunu bilmesi yeterlidir. Bu kavrama "paketleme" (encapsulation) denir. BİL102 - Özet Ders Notları 15 Halil Özmen

Sınıf kullanan örnek bir C++ programı: #include <iostream> using namespace std; class Dikdortgen private: int uzunluk; int genislik; public: // Yapici (Constructor) Fonksiyon Dikdortgen (int u = 1, int g = 1) uzunluk = u; genislik = g; double alan () return (uzunluk * genislik); ; int main() Dikdortgen dd1 (4, 7); Dikdortgen dd2; // Uzunlugu 4 genisligi 7 olan dikdörtgeni yarat // Uzunlugu genisligi varsayılan olan dikdörtgen cout << "1. Dikdortgenin alani = " << dd1.alan() << endl; cout << "2. Dikdortgenin alani = " << dd2.alan() << endl; system("pause"); Kapsamlı örnek sınıf: class Dikdortgen private: // Veriler double uzunluk; double genislik; public: // Fonksiyonlar // Yapici (Constructor) Fonksiyon Dikdortgen (double u = 1, double g = 1) uzunluk = u; genislik = g; void setuzunluk (double u) uzunluk = u; void setgenislik (double g) genislik = g; double getuzunluk () return (uzunluk); DİKKAT: Verilerin hepsi private olmayabilir, bazı özel durumlarda public veri olabilir. Fonksiyonlar her zaman public olmayabilir, private fonksiyonlar da olabilir. BİL102 - Özet Ders Notları 16 Halil Özmen

double getgenislik () return (genislik); double alan () // Dikdörtgenin alanını döndürür. return (uzunluk * genislik); double cevre () // Dikdörtgenin çevresini döndürür. return ( (uzunluk + genislik) * 2 ); void yaz() // Dikdörtgenin verilerini yazar. cout << "Dikdortgen: " << uzunluk << " " << genislik << endl; void yaz2() // Dikdörtgenin verilerini, alanını ve çevresini yazar. cout << "Dikdortgen: " << uzunluk << " " << genislik << " Alan = " << alan() << " Cevre = " << cevre() << endl; ; // end class Dikdortgen // class'lar ; ile biter!! Yapıcı (Constructor) Fonksiyonlar Yapıcı fonksiyonlar nesne tanımlanırken devreye girer ve nesnelerin yaratılmalarını sağlar. Yapıcı fonksiyonlar sınıf adı ile aynı adda yazılmak zorundadırlar. Tipleri yoktur (void bile değildir). Bir sınıfta birden çok yapıcı fonksiyon olabilir, bu durumda yapıcı fonksiyonların parametrelerinde farklılık olması zorunludur. Fonksiyon aşırı yüklemedeki (function overloading) prensipler geçerlidir. Dikdortgen dd1 (7, 4); // dd1 nesnesi yapıcı fonksiyonla yaratılıyor. // Yapici (Constructor) Fonksiyon: Dikdortgen (double u = 1, double g = 1) uzunluk = u; genislik = g; Ogrenci ogr2 ("Kaan Caliskan"); // ogr2 yapıcı fonk.la yaratılıyor // Yapici (Constructor) Fonksiyon: Ogrenci (string as, int vize = 0, int final = 0) adsoyad = as; vizenotu = vize; finalnotu = final; Yıkıcı (Destructor) Fonksiyonlar Bir nesne artık kullanılmayacağında, yıkıcı (destructor) fonksiyon çağırılarak yok edilmeden önce yapılması gereken işlemler varsa yapılır ve o nesne yok edilir, nesnenin bellekte kapsadığı alan serbest kalır. C++ programları, ömrü biten nesneler için, o nesnelerin yıkıcı fonksiyonunu otomatik çağırırlar. Örneğin bir fonksiyonda bir nesne yaratılmışsa, o fonksiyon bitince, çağırıldığı yere dönmeden önce, yaratılan o nesne yıkıcı fonksiyonu çağırılarak yok edilir. Eğer nesnenin sınıfı içinde yıkıcı fonksiyon yazılmamışsa, sistemin kendi varsayılan yıkıcı fonksiyonu devreye girer ve nesnenin verileri yok edilir. Yıkıcı fonksiyonlar tilde işaretinden (~) sonra sınıf adı yazılarak isimlendirilirler. // Yikici (Destructor) Fonksiyon: ~Dikdortgen ()... BİL102 - Özet Ders Notları 17 Halil Özmen

Erişim Fonksiyonları: Atama (Set) ve Alma (erişim) (Get) Fonksiyonları Nesnelerin verilerine doğrudan erişilmez. Nesnenin verisi atanacaksa veya değiştirilecekse atama (set) fonksiyonu ile yapılır. Veri kullanılacaksa, alma / erişim (get) fonksiyonu ile alınıp kullanılır. Atama (set) fonksiyonlarına parametre olarak atanacak değer verilir, fonksiyon tipi void 'dir. Tek parametre alır ve bu parametreyi ilgili nesne verisine atar. Alma / erişim (get) fonksiyonlarının parametresi yoktur, istenen veri tipindedir ve o nesne verisini döndürür. Alma (get) fonksiyonu, döndürdüğü veri ile aynı tiptedir. Nesnenin tüm verileri için atama ve alma fonksiyonları yazmak gerekmeyebilir. Bazı bilgiler yapıcı (constructor) fonksiyon tarafından atandıktan sonra değiştirilmeyeceklerse, o bilgiler için atama (set) fonksiyonları yazılmaz. Bazı durumlarda da bazı nesne verileri nesne kullanıcılarına açık değildir (nesnenin iç işlerinde kullanılırlar), bu tür veriler için atama ve alma fonksiyonları yazılmaz. void setuzunluk (double u) // fonksiyon adi atauzunluk olabilirdi. uzunluk = u; void setgenislik (double g) // fonksiyon adi atagenislik olabilirdi. genislik = g; double getuzunluk () // fonksiyon adi aluzunluk olabilirdi. return (uzunluk); double getgenislik () // fonksiyon adi algenislik olabilirdi. return (genislik); string getadsoyad () return (adsoyad); Yardımcı Fonksiyonlar Nesnenin verilerini atama ve alma işlemleri dışındaki nesne işlemleri yardımcı fonksiyonlar kullanılarak yapılır. Örneğin "Dikdortgen" sınıfından yaratılan bir dikdörtgen nesnesinin alanını ve çevresini, "Dikdortgen" sınıfının ilgili yardımcı fonksiyonları kullanılarak hesaplatıp almak gerekir. Yardımcı fonksiyonların parametresi olabilir. Tipi void veya başka tipte olabilir. double alan () return (uzunluk * genislik); double cevre () return ( (uzunluk + genislik) * 2 ); void yaz() cout << "Dikdortgen: " << uzunluk << " * " << genislik << endl; // Ogrenci nesnesinin, vizenotu ve finalnotu'na göre genelnot'u döndürür. double genelnot (int vizeyuzde, int finalyuzde) return ( (vizenotu * vizeyuzde + finalnotu * finalyuzde) / 100.0 ); BİL102 - Özet Ders Notları 18 Halil Özmen

Nesne Yönelimli Analiz ve Tasarım, UML (Unified Modeling Language) Nesne yönelimli analiz ve tasarım yapılırken, yapısal programlamadaki analiz ve tasarımdan farklı olarak, geliştirilecek yazılımda kullanılacak sınıflar, sınıfların veri tanımları ve fonksiyonları saptanır. Sınıfların tanımlanmasında UML kullanılır. Dikdortgen - uzunluk: double - genislik: double <constructor> + Dikdortgen (u: double, g: double) + setuzunluk (u: double) : void + setgenislik (g: double) : void + getuzunluk () : double + getgenislik () : double + alan () : double + cevre () : double + yaz () : void Sınıf Adı Veriler Fonksiyonlar + : public olduğunu, - : private olduğunu gösterir. Object Oriented Analysis and Design (OOAD) Ogrenci - ogrnum: int - ad: string - soyad: string - bolum: string - vizenotu: int - finalnotu: int - toplamnot: double <constructor> + Ogrenci (ogrnum: int, ad: string, soyad: string, bolum: string) + setvizenotu (v: int) : void + setfinalnotu (f: int) : void + getogrnum () : string + get...... [diğer get fonksiyonları] + toplamnothesapla (vyuzde: int, fyuzde: int) : double + yaz () : void Nesnelerin tüm bilgileri için atama (set) fonksiyonu yazılması zorunlu değildir. Bazı bilgiler nesne yaratılırken yapıcı (constructor) fonksiyon ile atanır. Bazı bilgiler sonradan atama (set) fonksiyonları ile atanabilir veya değiştirilebilir. Nesnelerin değişmeyen bilgileri yapıcı fonksiyon ile atandıktan sonra, değişmeyecekleri için, bu bilgiler için atama (set) fonksiyonu yazılmaz. Normal koşullarda öğrencinin numarası, adı, soyadı ve bölümü değişmeyeceği için, bu sınıfta bu alanlar için atama (set) fonksiyonuna gerek görülmemiştir. Kaynak Kodu Parçalara Ayırma Sınıfların olduğu C++ programları yazarken bir yöntem, herşeyin tek bir.cpp kaynak dosyasında yer almasıdır. Ancak bu yöntem sadece çok basit sınıflar ve çok basit ana programlar söz konusu ise yapılabilinir. Bu yöntem tavsiye edilmez, doğru programlama yöntemi değildir. İkinci yöntem, sınıf için bir.h kaynak dosyası yaratıp, tüm sınıf tanımlarını ve fonksiyonların kodlarını.h dosyasındaki sınıfın (class) içinde oluşturmaktır. Bu durumda uygulama programı (yani main() fonksiyonu ve diğer fonksiyonlar) ayrı bir.cpp program kaynak dosyasında yer alır ve bu dosyada #include "sinif.h" satırı yer alır. Üçüncü yöntem, sınıfın verileri ve fonksiyonlarının prototipleri için bir.h kaynak dosyası yaratmak, sınıfın fonksiyonlarının kodlarını ayrı bir.cpp kaynak dosyasına koymak, uygulama programını (main() ve diğer fonksiyonlar) ayrı bir.cpp program kaynak dosyası oluşturmaktır. Bu yöntemle sınıf için "arayüz ile uygulamanın ayrılması" (separating interface from implementation) gerçekleştirilmiş olur. DevC++ yazılımı kullanılıyorsa, 3. yöntemde "proje" yaratılması zorunludur, ikinci yöntemde projeye gerek yoktur. Büyük projelerde 3. yöntem uygulanır. 1 kaynak dosyası 2 kaynak dosyası 3 kaynak dosyası uygulama.cpp: Sınıf, main ve tüm fonksiyonlar tek bir sinif.h: Sınıfın herşeyi (veriler ve fonksiyonlar) bir dosyada; sinif.h: Sınıfın veri tanımları ve fonksiyon prototipleri; dosyada. (Tavsiye edilmez!) uygulama.cpp: main() ve diğer program fonksiyonları. sinif.cpp: sınıfın fonksiyonlarının kodları; uygulama.cpp: main() ve diğer program fonksiyonları. BİL102 - Özet Ders Notları 19 Halil Özmen

Bir program birden çok sınıf kullanıyorsa, 2. yöntemde her sınıf için bir kaynak dosyası, bir de uygulama programı olmak üzere, toplam dosya adedi = sınıf adedi + 1 olur. Üçüncü yöntemde ise toplam dosya adedi = (2 * sınıf adedi) + 1 olur. Nesnelerin Birbirine Aktarılması (Atanması) Bir nesneye ancak aynı sınıftan bir nesne aktarılabilir (atanabilir). Atama yapılan nesneye diğer nesnenin tüm verileri kopyalanır. Dikdortgen dd1 (8, 12); // Nesnenin yaratilmasi. Dikdortgen dd2; // Nesnenin yaratilmasi. cout << "1. Dikdortgen:" << endl; dd1.yaz(); cout << endl << "2. Dikdortgen:" << endl; dd2.yaz(); // 2. dikdörtgene 1.yi ata (1. dikdörtgen bilgilerini 2.ye kopyala) dd2 = dd1; cout << endl << "Atamadan sonra 2. Dikdortgen:" << endl; dd2.yaz(); Arkadaş Fonksiyonlar (Friend Functions) ve Arkadaş Sınıflar (Friend Classes) Arkadaş fonksiyon, arkadaşı olduğu sınıfın fonksiyonu olmayıp, sınıftaki bütün açık (public) ve özel (private) üyelere (veri veya fonksiyon) erişim hakkı olan fonksiyondur. Bağımsız fonksiyonlar bir sınıfın arkadaş fonksiyonu olarak tanımlanabilirler. Arkadaş fonksiyonlar, sınıf tanımı içinde en başta belirtilirler. class Dikdortgen friend void setu (Dikdortgen &, double); // Arkadaş fonksiyon tanımı.......... // diğer sınıf tanımları. ; Örnekteki setu() bağımsız fonksiyon olduğu için, nesne.setu() şeklinde kullanılamaz. Ancak bir nesne ile ilgili işlem yapacağı için, nesneyi kullanır. (Nesnenin adı adresidir.) Dikdortgen dd1(4, 3); setu (dd1, 7); Eğer bir sınıfın (Sinif2) bütün fonksiyonları, başka bir sınıfın (Sinif1) arkadaş fonksiyonları olacak ise, "Sinif1" içinde "Sinif2"nin arkadaş sınıf olarak tanımlanması gerekir. class Sinif1 friend class Sinif2; // Sinif2 fonksiyonları Sinif1'in herseyine ulaşır......... // diğer sınıf tanımları. ; BİL102 - Özet Ders Notları 20 Halil Özmen

this Göstericisi Eğer sınıf kodu içinde, sınıf verisi ile aynı isimde başka değişken (veri) varsa, nesnenin kendi verisini belirtmek için "this" deyimi kullanılır. this nesnenin göstericisidir, üye verilere ok "->" operatörü ile erişilir. private: double uzunluk; double genislik; public:...... void setuzunluk (double uzunluk) this -> uzunluk = uzunluk; void setgenislik (double genislik) this -> genislik = genislik; // uzunluk verisine atama yapmak. // Nesnenin kendi verisine parametreyi ata // genislik verisine atama yapmak. // Nesnenin kendi verisine parametreyi ata Devingen Bellek Yönetimi (Dynamic Memory Management) Normalde, bir program çalıştırıldığı anda, programdaki veriler ve diziler için bellek yerleri ayrılmış olur. Program çalışırken, nesneler ve diziler (veriler) için bellekten yer alınması ve işi biten yerlerin tekrar geri verilmesi program ile kontrol edilebilir. Bu kavrama "Devingen Bellek Yönetimi" (Dynamic Memory Management) denir. Program çalışırken bellekten yer alınmasına "devingen bellek yerleşimi" (dynamic memory allocation) denir. C++ dilinde bellekten yer alma ve iade etme işlemleri new ve delete operatörleri ile yapılır. double *ptr = new double(); // 1 double'lık yer ayır. double *piptr = new double(3.14159); // 1 double'lık yer ayır, 3.14159 ata int *notdizisi = new int[10](); // 10 int'lik yer ayır. Kisi *kisiler = new Kisi[20](); // 20 Kisi'lik yer ayır. Dikdortgen *ddptr = new Dikdortgen(); // 1 nesnelik yer ayır, nesneyi yarat Dikdortgen *dd2ptr = new Dikdortgen(16, 12); // yer ayır, nesne yarat (*ddptr).setuzunluk(20); (*ddptr).setgenislik(10); (*ddptr).yaz(); cout << "Alan = " << (*dd2ptr).alan() << endl; delete ptr; delete notdizisi; delete kisiler; delete ddptr; delete dd2ptr; BİL102 - Özet Ders Notları 21 Halil Özmen

7. Operatör Aşırı Yükleme (Operator Overloading) Operatörlerin aşırı yüklenmesine giriş: C++ operatörlerinin sınıf nesneleri üzerinde işlem yapmasını sağlamaya "operatör aşırı yükleme" (operator overloading) denir. C++ standart fonksiyon kütüphanelerinde birçok operatör aşırı yükleme örneği bulunmaktadır. Örneğin << operatörü hem dizgiye dönüştürme operatörü, hem de bit-temelli sola-kaydırma operatörü olarak tanımlanmıştır. Benzer şekilde >> operatörü de aşırı yüklenmiş ve hem dizgiden çıkarma operatörü hem de bit-temelli sağa-kaydırma operatörü olarak tanımlanmıştır. C++ programcısı operatörlerden bir çoğunu aşırı yükleyebilir. Örneğin "Tarih" sınıfı oluşturan bir programcı, ++ operatörünü tarihi 1 gün artırmak için aşırı yükleyebilir, ve += operatörünü, tarihi, verilen bir gün sayısı kadar ilerletmek (artırmak) için aşırı yükleyebilir. Operatörlerin aşırı yüklenme temelleri: C++ dilin yapısında olmayan yeni operatörler tanımlanmasına izin vermez. Ancak mevcut C++ operatörlerinin çoğunun aşırı yüklenmesine (sınıflar için yeniden tanımlanmasına) izin verir. C++ dilindeki string sınıfında birçok operatör aşırı yüklenmiştir: + += ==!= > >= < <= operatörleri bunlardan bazılarıdır. Operatör aşırı yükleme otomatik değildir, programcının bunun için sınıf içinde gerekli operatör aşırı yükleme fonksiyonlarını yazması gerekir. Bu fonksiyonların adı herzaman "operator" sözcüğü ile başlar ve operatörün kendisi ile devam eder. İstenirse arada boşluk bırakılabilir. Operatörlerin aşırı yüklenme kuralları ve kısıtları: Bazı operatörler aşırı yüklenemez. Aşırı yüklenemeyen operatörler şunlardır:..* (üyeye gösterici) ::? : Operatör aşırı yükleme kuralları ve kısıtları şunlardır: Operatörlerin önceliği aşırı yükleme ile değişmez. Örneğin * her zaman + ya göre önceliğe sahiptir. Operatörlerin işlem sırası aşırı yükleme ile değişmez. Örneğin soldan sağa işlem yapan bir operatörün bu özelliği değiştirilemez. Operatörün kullandığı nesne sayısı değiştirilemez. Örneğin + gibi iki nesne arasında işlem yapan bir operatör ++ gibi tek nesne üzerinde işlem yapar hale dönüştürülemez. Yeni operatör yaratılamaz. C++ dilindeki operatörlerden başkası aşırı yüklenemez. Operatörlerin temel veri tipleri üzerindeki işlem prensibi değiştirilemez. Örneğin + operatörü iki sayı arasında çıkarma yapacak şekilde aşırı yüklenemez. + ve += gibi birbirleriyle ilişkili operatörlerin ayrı ayrı aşırı yüklenmesi gerekir. Biri öbürünün işlemini etkilemez. İkili operatörlerin (+, -, *, >, <, ==,!= gibi) aşırı yüklenmesi: İkili operatörlerde, yani iki tarafındaki aynı tipte nesneler arasında işlem yapan operatörlerde (+, -, *, /, %, ==,!=, >, >=, <, <=, vb.), operatör yükleme fonksiyonunda sağdaki nesne parametrede yer alır, soldaki nesne fonksiyon içinde this göstericisi ile gösterilir. nesne1 operatör nesne2 ifadesi için, operatör yükleme fonksiyonunda nesne1 için nesnenin kendi verileri kullanılırken, nesne2 fonksiyonun parametresi olarak kullanılır. nesne2 nesne1 ile aynı veri tipinde olmayabilir. Operatör Aşırı Yükleme Fonksiyon Tipi: Operatör Türü Operatörler Operatör Aşırı Yükleme Fonksiyon Tipi İşlem Operatörleri + - * / % vb... genellikle soldaki nesnenin sınıfı Atama Operatörleri = += -= *= /= %= void Karşılaştırma Operatörleri ==!= > >= < <= bool BİL102 - Özet Ders Notları 22 Halil Özmen

// + (arti) operatörünü Zaman nesneleri için tanimla. // Iki zamani topla: zaman1 + zaman2; Zaman Zaman::operator + (const Zaman z) Zaman sonuc (saat + z.saat, dak + z.dak, san + z.san); if (sonuc.san > 59) sonuc.san %= 60; sonuc.dak++; if (sonuc.dak > 59) sonuc.dak %= 60; sonuc.saat++; sonuc.saat %= 24; return (sonuc); bool Zaman::operator == (const Zaman z) return (saat == z.saat && dak == z.dak && san == z.san); bool Zaman::operator!= (const Zaman z) return!(saat == z.saat && dak == z.dak && san == z.san); bool Zaman::operator > (const Zaman z) int san1 = saat * 3600 + dak * 60 + san; int san2 = z.saat * 3600 + z.dak * 60 + z.san; return (san1 > san2); bool Zaman::operator < (const Zaman z) int san1 = saat * 3600 + dak * 60 + san; int san2 = z.saat * 3600 + z.dak * 60 + z.san; return (san1 < san2); +=, -= gibi atama operatörlerinin aşırı yüklenmesi: Operatör aşırı yükleme fonksiyonunun tipi void 'dır ve solundaki nesnenin verilerine atamalar yapılır. // Zaman nesnesini += in sagindaki saniye kadar artir: zaman1 += saniye; // Burada operatörün saginda yalnizca int tipi deger olabilir. void Zaman::operator += (int saniye) san += saniye; if (san > 59) dak += san / 60; san = san % 60; if (dak > 59) saat += dak / 60; dak = dak % 60; if (saat > 23) saat = saat % 24; BİL102 - Özet Ders Notları 23 Halil Özmen

// zaman1 += zaman2; için bu fonksiyon kullanilir. void Zaman::operator += (const Zaman z) saat += z.saat; dak += z.dak; san += z.san; if (san > 59) san %= 60; dak++; if (dak > 59) dak %= 60; saat++; saat %= 24; ++, -- gibi tekil operatörlerin aşırı yüklenmesi: Tekil operatörler nesne üzerinde değişiklik yaptıkları için, bu tip operatörlerin aşırı yükleme fonksiyonlarının tipi nesnenin sınıfı olur. // 1 saniye artir: ++ operatoru. [PREFIX ++] ++zaman1; Zaman& Zaman::operator ++ () (*this)++; // Artirma isini postfix ++'ya yaptir. return (*this); // 1 saniye artir: ++ operatoru. [POSTFIX ++] zaman1++; Zaman Zaman::operator ++ (int) san++; if (san > 59) san = 0; dak++; if (dak > 59) dak = 0; saat = (saat + 1) % 24; return (*this); BİL102 - Özet Ders Notları 24 Halil Özmen

8. Kalıtım (Inheritance) Kalıtıma giriş Nesne Yönelimli Programlamanın (object oriented programming) önemli özelliklerinden birisi de kalıtım (inheritence) özelliğidir. Bir sınıf oluştururken, sıfırdan sınıfı oluşturmak yerine, var olan bir sınıfın özelliklerini ve fonksiyonlarını miras alıp, yeni özellikler ve fonksiyonlar ekleyerek oluşturmak daha verimli olabilir. Örneğin otomobil, otobüs, kamyon ve gemi sınıflarının olduğunu düşünelim. Bu dört sınıfın ortak özelliklerini ve ortak fonksiyonlarını "taşıt" sınıfında toplayabilir, ve otomobil, otobüs, kamyon, gemi sınıflarının "taşıt" sınıfından kalıtımla bu ortak özellik ve fonksiyonları alması sağlanabilir. Bir başka örnek: öğrenci, öğretmen ve çalışan sınıfları "kişi" sınıfından kalıtım ile bazı özellik ve fonksiyonları alabilir. Farklı özellikler için gereken kodlama yapılarak, üretilmiş sınıf oluşturulur. Avantajları: (a) Temel sınıfın denenmiş ve kanıtlanmış yapısını kullanmanın getirdiği sağlam tasarım avantajı. (b) üretilmiş sınıflarda, ortak özelliklerin (bilgilerin) ve ortak fonksiyonların tekrarlanmasının engelleyerek yazılım geliştirme zamanını azaltmak, (c) ortak öğelerde değişiklik yapılması gerektiğinde, tek bir yerde değişiklik yaparak hepsine yansımasını sağlamak, ve bu yolla zamandan kazanmak ve hata (unutma) riskini azaltmak. is-a ve has-a ilişkileri: is-a ilişkisi kalıtım ilişkisidir. has-a ilişkisi bir sınıftan nesnenin, başka bir sınıftan nesneyi içermesi ilişkisidir. Örnek: Öğrenci, Kişi ve Tarih sınıfları olduğunu varsayalım. Öğrenci is-a Kişi. (Öğrenci bir Kişi'dir. Öğrenci Kişi sınıfından ortak öğeleri miras alır.) Kişi has-a Tarih. (Kişi sınıfı Tarih [doğum tarihi] içerir.) Temel sınıf (base class) ve Türetilmiş sınıf (derived class) arasındaki ilişki Temel Sınıf Öğrenci Şekil Çalışan Taşıt Türetilmiş Sınıflar LisansÖğrencisi, YüksekLisansÖğrencisi Daire, Üçgen, Dörtgen Müdür, Programcı, İdariÇalışan, Sekreter Otomobil, Otobüs, Kamyon, Gemi, Uçak Temel Sınıf Türetilmiş Sınıf (1) Türetilmiş Sınıf (2) Özellik 1 Özellik 1 Özellik 1 Özellik 2 Özellik 2 Özellik 2 Özellik 3 ---- Özellik 4 BİL102 - Özet Ders Notları 25 Halil Özmen