Nesneye Yönelik Programlama

Slides:



Advertisements
Benzer bir sunumlar
Nesneye Yönelik Programlama
Advertisements

DİZİLER – I. Kısım YRD.DOÇ.DR. CİHAD DEMİRLİ
MIT503 Veri Yapıları ve algoritmalar Veri Yapılarına Giriş
STRİNG FONKSİYONLARI.
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Bilgisayar Programlama Güz 2011
EKRAN ÇIKTISI.
Bilgisayar Programlama Güz 2011
MIT503 Veri Yapıları ve algoritmalar Algoritma Oluşturma – Açgözlü algoritmalar ve buluşsallar Y. Doç. Yuriy Mishchenko.
Yığın ve Kuyruk.
Ders İçeriği Bağlantılı Liste İki Yönlü Bağlantılı Liste
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Nesneye Yönelik Programlama
Nesneye Yönelik Programlama
MapReduce Mustafa Agâh ÖZTÜRK
Diziler Dizi, bellekte aynı isim altında toplanmış değişkenler kümesidir. Eğer ki aynı türden veriler grubunu bellekte tutmak gerekirse diziler kullanılır.
Dizi (array) değişkenleri
C++ STACK SINIFI.
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
İkili Arama Ağaçları (Binary Search Trees) BST
Özyineli Sıralama Algoritmaları
Java Programlama Koleksiyon(Collection) Sınıfları
Nesneye Yönelik Programlama
Diziler.
MIT503 Veri Yapıları ve algoritmalar Veri Yapılarına Giriş
While Döngüsü Tekrarlama deyimidir. Bir küme ya da deyim while kullanılarak bir çok kez yinelenebilir. Yinelenmesi için koşul sınaması döngüye girilmeden.
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ DERLEYENLER: Ahmet Can ÇAKIL Ali Murat GARİPCAN Özgür AYDIN Şahin KARA KONTROL : Prof. Dr. Asaf VAROL KONU : LİSTELERE.
Veri Yapıları Veri, her türlü değer demektir. Veri yapılarının tasarlanma ve oluşturulma amacı; “verinin işlenmesini kolaylaştırmak ve bu işlemi daha verimli.
Nesneye Yönelik Programlama
Görsel C# Programlama Güz 2009 (6. Hafta).
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Diziler Dizi, bellekte aynı isim altında toplanmış değişkenler kümesidir. Eğer ki aynı türden veriler grubunu bellekte tutmak gerekirse diziler kullanılır.
Veri Yapıları Yrd. Doç. Dr. Altan MESUT.
BM-103 Programlamaya Giriş Güz 2014 (8. Sunu)
Bilgisayar Programlama
C PROGRAMLAMA DİZİLER (ARRAYS).
Nesneye Dayalı Programlama
Trees, Vectors, Iterators. ADT Abstract Data Type (ADT) vs implementation -Soyut Veri Türleri - Uygulamaları.
Ders İçeriği Liste Soyut veri yapısı (ADT)
BM-103 Programlamaya Giriş Güz 2014 (4. Sunu)
BAZI VERİ YAPILARI Yılmaz KILIÇASLAN.
BAZI VERİ YAPILARI Yılmaz KILIÇASLAN. Sunu Planı Bu derste, çizgeler gibi bazı teorik nesnelerin bellekte nasıl tutulduğunu ve algoritmalarca nasıl işlendiğini.
BM-103 Programlamaya Giriş Güz 2014 (9. Sunu)
DİZİLER Arrays.
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Veri Yapıları.
Matematiksel Veri Yapıları. İçerik Matematiksel Veri Yapıları – Kümeler – Diziler – Fonksiyonlar – İkili ilişkiler Sonsuz kümeler – Sonlu nicelik – Sonsuz.
BMS-301 Kabuk Programlama Güz 2015 (5. Sunu) (Yrd. Doç. Dr. Deniz Dal)
Veri yapıları Hafta3 Dizi Yapıları.
KUYRUK (QUEUE).
Yığıt Soyut Veri Tipi (Stack ADT) Yığıt Veri Yapısı
C Programlamada, benzer tipte tanımlaman değişkenleri kontrol etmede bize en çok yardım eden dostlarımız dizilerdir. Örneğin: 100 Öğrencinin bilgilerini.
BM-308 Paralel Programlamaya Giriş Bahar 2016 (1. Sunu) (Yrd. Doç. Dr. Deniz Dal)
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
BİLGİSAYAR PROGRAMLAMA Ders 11: İşaretçi (Pointer) Kullanımı Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
PHP ve HTML İnternet Programlama - 2. Koşullu İfadeler ve Döngüler Döngü ya da çevirim diyebileceğimiz, belli şart ve koşullarda istenilen değerleri yapabilmemizi.
Fonksiyonlar ve Diziler
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
Paralel Programlamaya Giriş
STRING FONKSİYONLARI Dim ders As String
8086 Programlama – Kısım IV Stack’ler, Makro’lar
BMS-301 Kabuk Programlama Güz 2017 (7. Sunu) (Yrd. Doç. Dr. Deniz Dal)
YZM 2116 Veri Yapıları Yrd. Doç. Dr. Deniz KILINÇ
Bölüm 6: Kullanıcı Tanımlı Fonksiyonlar I
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
Sunum transkripti:

Nesneye Yönelik Programlama BM-104 Nesneye Yönelik Programlama Bahar 2013 (9. Sunu) (Yrd. Doç. Dr. Deniz Dal)

Bir Yazılımın Bileşenleri Algoritma Veri Algoritmanın veya yazılımın işleyeceği bilgi Veri Yapısı (Data Structure) Algoritmanın kullanacağı verilerin bilgisayarda etkin olarak saklanmasına ve gerektiğinde kolaylıkla işlenmesine/erişilmesine imkan tanıyan özel yapı Yaygın Kullanılan Veri Yapılarına Örnekler: Dizi (array), ağaç (tree), kuyruk (queue), stack (yığın) …

Standart Şablon Kütüphanesi (Standard Template Library – STL) STL, programlamada sıklıkla kullanılan, her biri şablon C++ sınıfı formunda tanımlanmış bir grup veri yapısını ve bu yapılar üzerinde çalışabilen algoritmaları içeren çok etkin bir kütüphanedir. STL 3 temel bileşenden oluşur: Veri türünden bağımsız, dinamik olarak büyüyebilen veya küçülebilen şablon kaplar (jenerik depolayıcılar) (generic containers) Kaplara uygulanabilen algoritmalar (sıralama, arama) İteratörler (iterators) (özel pointerlar)

Veri Türünden Bağımsız Şablon Kaplar (Generic Containers) Sıralı Şablon Kaplar (Sequence Containers) Vector List Deque (Double Ended Queue) İlişkili Şablon Kaplar (Associative Containers) Set Multiset Map Multimap Kap Adaptörleri (Sıralı Şablon Kapların Özel Halleri) Stack, Queue, Priority Queue

vector #include <vector> sonrası kullanılabilirler. Vektörler gelişmiş C++ dizileri gibi düşünülebilirler. C++ dizileri ile yapılan bütün işlemler şablon vector sınıfı ile de gerçekleştirilebilir. (Dinamik oluşları ise avantajlarıdır.) Vektörler [ ] sayesinde indisli kullanıma izin verirler. Yeni öğelerin yapının sonuna eklendikleri (veya öğelerin yapının sonundan çıkarıldıkları) ve herhangi bir anda herhangi bir öğeye indis vasıtasıyla rastgele hızlıca erişimin gerektiği durumlara uygundurlar. Yapıdaki öğeler girildikleri sırayı koruyacak şekilde sıralı (ard arda) saklanırlar. Vektörlerde araya öğe eklemek sona öğe eklemekten çok daha pahalı bir işlemdir ve dolayısıyla bu türden işlemler vektörler kullanılarak gerçekleştirilmemelidir. http://acehreli.org/turkcecpp/topluluk_ozet.html

back() fonksiyonunun işlevi başka nasıl elde edilebilir? //http://www.cprogramming.com/tutorial/stl/vector.html #include <iostream> #include <string> #include <vector> using namespace std; int main() { int toplam=0; vector<string> names(2);//2 String Saklayabilen Vektör vector<double> grades(3,1.0);//Vektör Elemanlarının İlk Değeri 1.0 vector<int> example;//Tamsayılar Saklayabilen Vektör example.push_back(3);//3 Sayısını Vektörün Sonuna Ekle example.push_back(10);//10 Sayısını Vektörün Sonuna Ekle example.push_back(33);//33 Sayısını Vektörün Sonuna Ekle for(int i=0;i<(int)example.size();i++)//Vektörün Kapasitesini Aşmadan cout<<example[i]<<" "; while(!example.empty())//Vektör Boş Değilse toplam+=example.back();//Vektörün Son Elemanı example.pop_back();//Vektörün Son Elemanını Sil } cout<<"\nVektor Elemanlarinin Toplami: "<<toplam<<endl; example.push_back(25); example.clear();//Vektörü Boşalt return 0; back, push_back , pop_back, [ ]

Vektörler Saklayan Vektör (İki Boyutlu Dinamik Dizi) #include <iostream> #include <iomanip> #include <vector> using namespace std; int main() { int satir,sutun; vector<vector<int>> vektor; vector<int> sutunVektoru; cout<<"Lutfen Satir Ve Sutunu Giriniz: "; cin>>satir>>sutun; for(int i=0;i<satir;i++) sutunVektoru.clear(); for(int j=0;j<sutun;j++) sutunVektoru.push_back((i+1)*j); vektor.push_back(sutunVektoru); } for(int i=0;i<(int)vektor.size();i++) for(int j=0;j<(int)vektor[i].size();j++) cout<<setw(3)<<vektor[i][j]; cout<<endl; return 0;

list Vektörlerin öğeleri sona hızlıca eklediklerini (veya öğeleri sondan hızlıca sildiklerini) ve indis vasıtasıyla rastgele erişime izin verdiklerini söylemiştik. Ayrıca, vektörlerde araya öğe eklemenin (veya aradan öğe silmenin) pahalı ve genellikle tercih edilmeyen bir işlem olduğunu hatırlatmıştık. Listeler ise #include <list> sonrası kullanılabilirler, araya öğe ekleme (veya aradan öğe silme) işini hızlıca gerçekleştirirler ama rastgele erişime izin vermezler. Yani liste elemanlarına indis kullanılarak ulaşılamaz. Herhangi bir öğeye ulaşmak için o öğeden önceki öğeleri de bir iteratör yardımıyla ziyaret etmek gerekir. STL listesi çift bağlı bir listedir. (doubly linked list) Yani listenin herhangi bir öğesi kendisinden önceki ve kendisinden sonraki liste öğesine bağlıdır. (Dolayısıyla bir STL listesi baştan sona doğru ve sondan başa doğru gezintiye imkan tanır.)

back, push_back , pop_back, front, push_front, pop_front, insert, erase insert öncesi ve sonrası it aynı öğeyi işaret eder. (Yani it öncesine ekleme yapılır.) #include <iostream> #include <string> #include <list> using namespace std; int main() { list<string> lst; lst.push_back("Dal");//Listenin Sonuna Ekle lst.push_front("Deniz");//Listenin Başına Ekle lst.insert(++lst.begin(),"Erzurum");//Başın Sağına Ekle list<string>::iterator it=lst.begin(); it++; lst.insert(it,3,"Artvin");//3 Adet Artvin Ekle Araya it--; lst.erase(it);//Son Artvini Sil for(it=lst.begin();it!=lst.end();it++) cout<<*it<<endl; lst.sort();//Küçükten Büyüğe Sırala while(!lst.empty()) cout<<lst.front()<<endl; lst.pop_front(); } return 0;

begin, end, rbegin, rend Fonksiyonları STL listesinin begin fonksiyonu listenin ilk öğesini işaret eden özel bir pointer (iteratör) geriye döndürür. STL listesinin end fonksiyonu listenin son öğesinden bir sonraki pozisyonu işaret eden özel bir pointer (iteratör) geriye döndürür. STL listesinin rbegin fonksiyonu listenin son öğesini işaret eden özel bir pointer (iteratör) geriye döndürür. (reverse) STL listesinin rend fonksiyonu listenin ilk öğesinden bir önceki pozisyonu işaret eden özel bir pointer (iteratör) geriye döndürür.

push_front, push_back, front, back, ve insert STL listesinin push_front, push_back, front ve back fonksiyonları aslında insert, begin, end, rbegin ve rend fonksiyonları kullanılarak elde edilebilirler. lst.push_front(25) = insert(lst.begin(),25) lst.push_back(25) = insert(lst.end(),25) (lst.front()=25) = (*lst.begin()=25) (lst.front()=25) = (*--lst.rend()=25) (lst.back()=25) = (*--lst.end()=25) (lst.back()=25) = (*lst.rbegin()=25)

k Bir vector Veya list İken k.end()-k.begin() deyimi acaba k.size() ile aynı sonucu üretir mi?

deque STL kütüphanesinin deque (double ended queue) (çift uçlu kuyruk) adlı veri yapısı iki uçlu bir vektör gibi düşünülebilir. Dolayısıyla yeni öğeler yapının hem sonuna ve hem de başına hızlıca eklenebilirler. (Benzer şekilde yapının hem başından ve hem de sonundan hızlıca silinebilirler.) (vector adlı STL yapısının sadece sona hızlıca ekleme yapabildiğini hatırlayınız.) deque da vector gibi, [ ] sayesinde indisli kullanıma izin verir, yani rastgele erişim mümkündür. deque yapısı #include <deque> sonrası kullanılabilir. dek şeklinde okunur, kuyruk (queue) ve yığın (stack) yapılarının bir birleşimi gibi düşünülebilir.

back, push_back , pop_back, front, push_front, pop_front, [ ] #include <iostream> #include <iomanip> #include <deque> using namespace std; int main() { deque<int> dq; dq.push_back(25);//Sona Ekle dq.push_front(34);//Başa Ekle dq.push_back(8);//Sona Ekle dq.push_front(41);//Başa Ekle for(int i=0;i<(int)dq.size();i++) cout<<setw(3)<<dq[i];//İndisli Erişim cout<<endl; while(!dq.empty()) cout<<setw(3)<<dq.back();//Son Elemanın Değeri dq.pop_back();//Son Elemanını Sil } dq.push_back(46); cout<<dq.front()<<endl;//İlk Elemanın Değeri dq.pop_front();//İlk Elemanı Sil return 0;

queue Kuyruk (Banka kuyruğundaki müşterilerin işlem görme şekli) First in First Out (FIFO) Stratejisi (İlk Gelen İlk Gider) Kuyruk yapısı, bir deque yapısının sadece sona ekleme (push_back) ve baştan silme (pop_front) fonksiyonları kullanılarak elde edilebilir. Kuyruk yapısının push adlı fonksiyonu deque yapısının push_back fonksiyonunun kendisidir. Kuyruk yapısının pop adlı fonksiyonu deque yapısının pop_front fonksiyonunun kendisidir.

front, back, push, pop queue içerisinde gezinebilmeye izin yoktur. Böyle bir durum için deque kullanılmalıdır. //http://www.csci.csusb.edu/dick/samples/stl.html #include <iostream> #include <queue> using namespace std; int main() { queue<char> q; q.push('a');//Kuyruğun Sonuna Ekle q.push('b');//Kuyruğun Sonuna Ekle q.push('c');//Kuyruğun Sonuna Ekle cout<<q.front()<<endl;//Kuyruğun Başını Oku q.pop();//Kuyruğun Başını Sil cout<<q.front()<<endl; q.pop(); q.push('d'); q.push('e'); q.front()='f';//Kuyruğun Başını Modifiye Et q.back()='g';//Kuyruğun Sonunu Modifiye Et return 0; }

stack Yığın (Mutfak dolabındaki tabakların diziliş ve kullanılış şekli) Last in First Out Stratejisi (LIFO) (Son Gelen İlk Gider) Yığın yapısı, bir deque yapısının sadece sona ekleme (push_back) ve sondan silme (pop_back) fonksiyonları kullanılarak elde edilebilir. Yığın yapısının push adlı fonksiyonu deque yapısının push_back fonksiyonunun kendisidir. Yığın yapısının pop adlı fonksiyonu deque yapısının pop_back fonksiyonunun kendisidir. Yığın yapısının top adlı fonksiyonu deque yapısının back fonksiyonunun kendisidir.

top, push, pop //http://www.csci.csusb.edu/dick/samples/stl.html #include <iostream> #include <string> #include <stack> using namespace std; void ReverseTheString(string &);//Stringi Tersine Çevir int main() { string s; cout<<"Lutfen Bir String Giriniz: "; getline(cin,s); cout<<"Girdiginiz Stringin Tersine Cevrilmis Hali:\n"; ReverseTheString(s); cout<<s<<endl; return 0; } void ReverseTheString(string &x) stack<char> s; for(int i=0;i<(int)x.length();i++) s.push(x[i]); for(int i=0;!s.empty();i++,s.pop()) x[i]=s.top(); top, push, pop

Stack Kullanım Alanları Fonksiyon Çağrılarını İşleme Dizileri Tersine Çevirme Sembolleri Dengeleme (Örneğin parantezlerin eşlenmesi) RPN (Reverse Polish Notation) (Postfix Notation) İşleme (RPN notasyonu paranteze ihtiyaç duymaz.) +34 (Prefix Notation – Polish Notation) 3+4 (Infix Notation) 34+ (Postfix Notation – RPN Notation) Bir zamanlar HP hesap makineleri bu mantıkla çalışıyordu.

Soru STL’de tanımlı vector yapısını kullanarak yine STL’de tanımlı stack yapısının işlevini gerçekleştirebilir misiniz?

set Sıralı kaplar barındırdıkları öğelere göreceli veya mutlak tamsayı pozisyon numaraları ile ulaşım imkanı tanırlar. Ayrıca, yapıdaki öğeler girildikleri sırayı koruyacak şekilde sıralı (ard arda) saklanırlar. İlişkili kaplar ise, sıralı kapların aksine, öğelerine ulaşımı herhangi bir tipte indis anahtar (key) ile sağlarlar. Ama yapıdaki öğeler girildikleri sırayı koruyacak şekilde sıralı (ard arda) saklanmazlar. STL kütüphanesinin set adlı bileşeni ilişkili bir kaptır ve bünyesinde benzersiz (eşsiz) (unique) ve sıralanmış (küçüklük veya büyüklük ilişkili sıralanmış) öğeler barındırır. Yani yapının içerisinde her öğeden sadece bir adet mevcuttur. set veri yapısı ikili arama ağacı (binary search tree) şeklinde oluşturulmuştur. Kap öğelerine sıralama amacıyla kullanılan anahtarlarla ulaşılır ve bu anahtarlar aynı zamanda öğelerin kendileridir. (Anahtarların tipi kapta saklanan öğelerin tipi ile aynıdır.) set kullanımına en uygun olan uygulamalar, veri yapısı öğelerinin her zaman için sıralı olması beklenen türden uygulamalardır.

//http://www.codeproject.com/Articles/6513/Practical-Guide-to-STL #include <string> #include <set> #include <iostream> using namespace std; int main() { set<string> strset;//Artan Sıralı (Ascending) String Set set<string>::iterator si; strset.insert("kavun"); strset.insert("portakal"); strset.insert("uzum"); strset.insert("elma"); strset.insert("muz"); strset.insert("uzum");//İki Üzümden Birisi Dikkate Alınmaz //Çıktının Artan Sıralı Olacağına Dikkat Ediniz for(si=strset.begin();si!=strset.end();si++) cout<<*si<<" "; cout << endl; if(strset.find("erik")!=strset.end()) cout<<"set Icerisinde Erik Mevcuttur.\n"; else cout<<"set Icerisinde Erik Mevcut Degildir.\n"; return 0; }

set<string> strset; //Artan Sıralı (Ascending) String Set set<string,less<string>> strset; //Artan Sıralı String Set set<string>::iterator si; //Artan Sıralı String Set İteratör set<string,less<string>>::iterator si; set<string,greater<string>> strset; //Azalan Sıralı (Descending) String Set set<string,greater<string>>::iterator si; //Azalan Sıralı String Set İteratör

map STL’nin map veri yapısında her bir öğe iki parçadan oluşur: Öğenin adı veya öğeye erişim anahtarı (indis olarak kullanılır) Öğenin değeri map veri yapısında set ten farklı olarak öğelerin ikinci bir bileşeni daha vardır. map de set gibi her öğeden sadece bir adet barındırır ve öğeler yapı içerisinde anahtar bazlı sıralıdırlar. Bir telefon fihristi uygulaması üzerinden map veri yapısının çalışma prensibi anlaşılabilir. Bir telefon fihristinde isimler (öğelerin adları) ve isimlere karşılık gelen numaralar (öğelerin değerleri) vardır.

Ekran çıktısının anahtar bazlı artan sıralı olduğuna dikkat ediniz. Bir yılın aylarını ve her ayın kaç günden oluştuğunu bir map içerisinde nasıl saklarsınız? //http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html #include <iostream> #include <string> #include <map> using namespace std; int main() { int sicilNo; map<int,string> personel; map<int,string>::iterator mit; personel[5234]="Mike C."; personel[3374]="Charlie M."; personel[1923]="David D."; personel[7582]="John A."; personel[5328]="Peter Q."; cout<<"Personelin Sicil Numarasini Giriniz: "; cin>>sicilNo; mit=personel.find(sicilNo); if(mit!=personel.end()) cout<<"Sicil Nosu "<<sicilNo<<" olan "<<personel[sicilNo]<<" in Kaydi Siliniyor.\n"; personel.erase(mit); } else cout<<"Sicil Nosu "<<sicilNo<<" olan Personel Bulunamadi.\n"; cout<<"Sirketteki Personel Sayisi: "<<personel.size()<<endl; for(mit=personel.begin();mit!=personel.end();mit++) cout<<(*mit).first<<":"<<mit->second<<endl; return 0;

İşe Uygun Aleti Kullanmalıyız (Use the Right Tool for the Job) Bir tamirata (problem) başlamadan önce alet çantamızın (STL Kütüphanesi) içerisindeki elimizdeki işe (algoritma) en uygun aleti (STL içerisindeki en uygun veri yapısını) belirlemeliyiz.