C++ Programlama Dili Ders Notları (Mart 2015) PDF
Document Details
Zonguldak Bülent Ecevit Üniversitesi
2015
Alaaddin ÇAKIR
Tags
Summary
Bu belge, BÜLENT ECEVİT ÜNİVERSİTESİ'nde C++ programlama dili dersi için hazırlanan ayrıntılı ders notlarını kapsamaktadır. Ders notları, C++ programlama dilinin temellerini, veri türlerini, işleçleri, döngüleri ve fonksiyonları kapsamaktadır.
Full Transcript
BÜLENT ECEVİT ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ MADEN MÜHENDİSLİĞİ BÖLÜMÜ C++ PROGRAMLAMA DİLİ DERS NOTLARI Yrd. Doç. Dr. Alaaddin ÇAKIR Mart 2015 1 İÇİNDEKİLER 1. C ve C++....
BÜLENT ECEVİT ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ MADEN MÜHENDİSLİĞİ BÖLÜMÜ C++ PROGRAMLAMA DİLİ DERS NOTLARI Yrd. Doç. Dr. Alaaddin ÇAKIR Mart 2015 1 İÇİNDEKİLER 1. C ve C++............................................................................................................................................. 4 1.1 C++'daki Yenilikler..................................................................................................................... 5 1.2 Dev-C++......................................................................................................................................... 6 2.1 Algoritma..................................................................................................................................... 7 3. C++ DİLİNİN TEMELLERİ................................................................................................................. 12 3.1 C++ Karakter Seti..................................................................................................................... 12 3.1 C++ Programlarının Yapısı...................................................................................................... 13 3.2 Fonksiyonlar.............................................................................................................................. 15 3.2.1 main() Fonksiyonu............................................................................................................ 16 3.3 C++ Önişlemcisi........................................................................................................................ 16 3.3.1 #include Emri.................................................................................................................... 16 3.3.2 #define Emri...................................................................................................................... 17 3.4 Açıklama Satırları.................................................................................................................... 17 3.5 Temel Veri Türleri ve Değişkenler........................................................................................ 17 3.5.1 Değişken Veri Türünün Bildirimi.................................................................................... 18 3.5.2 Değişken Adlandırma Kuralları....................................................................................... 19 3.5.3 Değişkenler........................................................................................................................ 20 3.6 Sabitler...................................................................................................................................... 21 3.6.1 Tamsayı Sabitler............................................................................................................... 21 3.6.2 Ondalıklı Sabitler.............................................................................................................. 21 3.6.3 Karakter Sabitler.............................................................................................................. 21 3.6.4 Katar Sabitler.................................................................................................................... 22 3.6.5 Tür Dönüşümü................................................................................................................... 23 3.7 Basit Veri Giriş Çıkışları.......................................................................................................... 23 3.8 İşleçler (Operatörler).............................................................................................................. 24 3.8.1 Atama İşleci (=)................................................................................................................ 24 3.8.2 Aritmetik İşleçler.............................................................................................................. 24 3.8.3 MOD Alma İşleci (%)............................................................................................................. 25 3.8.5 Aritmetik Atama İşleçleri................................................................................................ 27 3.8.6 Karşılaştırma İşleçleri...................................................................................................... 28 3.8.7 Mantıksal İşleçler.............................................................................................................. 29 3.8.8 Özel Amaçlı Ternary İşleci ( ? : )................................................................................... 29 3.8.9 İşlemlerin Öncelik Sırası.................................................................................................. 30 4. PROGRAM DENETİMİ....................................................................................................................... 31 4.1. KARŞILAŞTIRMA İŞLEMLERİ..................................................................................................... 31 2 4.1.1. YAPISI (Eğer...)........................................................................................................ 31 4.1.2. YAPISI (Eğer... - Değilse...)........................................................................ 33 4.2 switch Deyimi.............................................................................................................................. 39 4.3. DÖNGÜLER................................................................................................................................. 42 4.3.1. Belirli Sayıda Tekrar Döngüsü (for Döngüsü).............................................................. 42 4.3.2. Koşullu Döngüler (while Döngüsü ve do...while Döngüsü)....................................... 45 4.3.3. Döngülerden Çıkış (break) ve Devam (continue)................................................................. 49 4.3.4. İç İçe Döngüler..................................................................................................................... 52 5. DİZİLER............................................................................................................................................. 54 5.1 Dizilere Başlangıç Değeri Atama........................................................................................... 55 5.2 İki Boyutlu Diziler......................................................................................................................... 64 HAZIR FONKSİYONLAR........................................................................................................................... 71 Karakter İşleme Fonksiyonları....................................................................................................... 71 Dizgi İşleme Fonksiyonları............................................................................................................. 71 Zaman ve Tarih Fonksiyonları........................................................................................................ 71 Genel Amaçlı Fonksiyonlar............................................................................................................ 71 MATEMATİK FONKSİYONLARI............................................................................................................... 71 3 1. C ve C++ C programlama dili, Bell Laboratuvarları'nda çalışmakta olan Dennis Ritchie ve Ken Thompson tarafından, Unix sistemlerine programlama yapmak amacıyla 1969-1973 yılları arasında geliştirilir. C'nin bu derece ilgi görmesinde, dil hakkında Dennis Ritchie ve Brian Kernighan'ın 1978 yılında yazdığı "C Programlama Dili" isimli kitabın etkisi büyüktür. Bu kitap; C dili, ANSI (Amerikan Ulusal Standartlar Enstitüsü) tarafından standartlaştırılana dek tek referans kaynağı olarak kullanılır. Ken Thompson (solda) ile Dennis Ritchie (sağda) C++, ilk olarak 1979 yılında Bell Laboratuvarları'nda araştırmacı olarak görev yapan Bjarne Stroustrup tarafından oluşturulmuştur. Stroustrup, doktora çalışmasında; ele aldığı bazı "nesne tabanlı" araçların özelliklerini, özellikle de sınıfları (class) destekleyen bir C sürümü geliştirmeye çalışmaktadır. Bu çalışma, C programlama dilinin yaratıcıları olan Dennis Ritchie ve ekibinin de içinde bulunduğu bir grup tarafından da desteklenmektedir. Geliştirilen bu sürümüne ilkin "Sınıflı C (cfront)" adı verilir. Ortaya çıkan ürünün potansiyeli kısa sürede keşfedilir ve 1983 yılında artırma operatörü (++) eklenerek ismi C++'a (C Plus Plus) çevrilir. O günden bu güne C++ üç önemli evrim geçirir. Bunlardan ilki 1985, ikincisi 1990 yılındadır. Üçüncüsü ise, C++'ın standartlaştırılması sırasında meydana gelir. 1990 yılındaki evrimini takiben, C++'ı standartlaştırmak için bir çalışma başlatılır. ANSI ile ISO ( Uluslararası Standartlar Örgütü) birleşerek bir standartlaştırma komitesi oluşturur. Teklif edilen standardın ilk tasarısı 25 Ocak 1994'de yapılır. Bu tasarıda ANSI/ISO C++ Komitesi, Stroustrup tarafından tanımlanan özellikleri korur ve bunlara bazı yeni özellikler ekler. İlk tasarının hemen ardından standardın çok geniş bir şekilde yayılmasına neden olan bir olay meydana gelir. Alexander Stepanov tarafından Standart Şablon Kütüphanesi (Standart Template Library: STL) oluşturulur. STL, verileri işlemek için kullanılabilecek genel bir rutinler kümesidir; güçlü ve seçkindir. İlk tasarıdan sonra komite, C++'ın STL'yi de içermesine karar verir. Sonuç olarak, C++'ın iki sürümü vardır. Bunlardan ilki, Stroustrup'un orijinal tasarımına dayanan geleneksel C++ sürümüdür. İkincisi ise, Stroustrup ve ANSI/ISO Standartlar Komitesi tarafından oluşturulmuş olan Standart C++'dır. C++'ın bu iki sürümü temelde birbirlerine çok benzemektedir; fakat Standart C++, geleneksel C++'da bulunmayan çeşitli ek özelliklere sahiptir ve onun geliştirilmiş şeklidir. 4 Genel bir anlatımla; C++, C'yi temel alarak genişletilmiş olup, C'nin kapsamına ek olarak, günümüzde yaygın olarak kullanılan Nesneye Dayalı Programlama yapısını da desteklemektedir. C++'ın kendine ait nesneye dayalı bir kütüphanesi vardır; fakat yine de C'nin standart kütüphanesindeki tüm fonksiyonları destekler; onunla aynı kontrol yapılarını kullanır; C tarafından tanımlanmış tüm veri tiplerini de içerir. 1.1 C++'daki Yenilikler C++'daki önemli yeni özellikleri daha iyi açıklayabilmek amacıyla, önce geleneksel C++ yapısında, ardından Standart C++'a uygun olarak yazılmış iki program iskeleti örneği vereceğiz. #include int main() { return 0; } Yukarıdaki programda #include deyimine özellikle dikkat edelim. Bu deyimle, C++'ın I/O (input/output) sistemini desteklemesini sağlayan iostream.h dosyasını dahil ediyoruz; ki, klasik C için stdio.h neyse, C++ için de bu dosya odur. #include using namespace std; int main() { return 0; } Bir kütüphane fonksiyonunu kullanabilmemiz için onun başlık dosyasını programımıza dahil etmemiz gerekir. Bu da #include deyimiyle yapılır. Örneğin, C'de I/O fonksiyonları için gerekli olan stdio.h başlık dosyasını şu şekilde programa dahil etmemiz gerekir: #include C++, ilk oluşturulduğu bir iki yıl içerisinde C ile aynı başlık stilini kullanmıştır. C++, sizin oluşturacağınız başlık dosyaları için ve eski sürümlere uyum sağlaması açısından hâlâ C stili başlıkları desteklemekle birlikte, kendi kütüphanesi tarafından kullanılan yeni bir başlık stili getirmiştir. Bu yeni tarz başlıklar, dosya adlarını değil, dosyalara derleyici tarafından bağlanabilmesi mümkün standart tanımlayıcıları belirler. Bu nedenle, bu stillerde.h uzantısı yoktur. C++, C'nin fonksiyon kütüphanesinin tamamını kapsamaktadır ve C kütüphanesinin başlık dosyalarını da desteklemektedir. Örneğin, stdio.h ve ctype.h gibi başlık dosyaları hâlâ geçerlidir. Ancak C++'da, C'nin standart başlıklarındaki dosya adlarına bir "c" öneki eklenmiştir ve ".h" düşmüştür. Örneğin, math.h için C++'ın yeni tarz başlığı şeklindedir. string.h ise şeklini almıştır. Bir diğer yeni özellik ise, namespace'lerdir. Namespace'ler, kütüphane fonksiyonları ve diğer elemanların tanımlanması için ayrılmış alanlardır. Namespace kullanmamızın amacı 5 ad çakışmalarını engellemek için tanımlayıcı adlarını uygun şekilde yerleştirmektir. Programımıza yeni bir başlık eklediğimizde, bu başlığın içeriği std namespace'in içine yerleştirilir ve burada saklanır. Bu iş için; #using namespace std; deyimini kullanabiliriz. Bu deyim derlendikten sonra eski veya yeni başlıklarla çalışıyor olmamızın bir önemi kalmaz. Önemli yeni özelliklerden biri de C++'ın I/O konsolunda karşımıza çıkmaktadır. C++; printf() ve scanf() gibi I/O fonksiyonları yerine, "" gibi I/O operatörleri kullanarak daha yeni bir yol önermektedir. printf() fonksiyonu yerine giriş operatörünü kullanarak klavyeden giriş yapabilir; örneğin aşağıdaki deyimlerle, klavyeden giriş yapılarak num değişkenine bir tamsayı değer atayabiliriz. int num; cin >> num; C++'ın > gibi I/O operatörlerini kullanabilmek için başlığını eklememiz gerektiğini bir kez daha belirtmek isteriz. 1.2 Dev-C++ Bu ders notları, Bloodshed Software (bloodshed.net) tarafından geliştirilen Dev-C++ Version 5.10 (Portable) sürümüne yönelik olarak hazırlanmıştır. Söz konusu sürümün, şu ana dek hazırlanmış en güncel C++ sürümü olmasının yanı sıra; ücretsiz olması, Türkçe menülere sahip bulunması, kurulum gerektirmediği için USB flash belleklerden dahi kolayca çalıştırılabilme- si, hem 32 bit hem de 64 bit işletim sistemleri üzerinde sorunsuz olarak görev yapan dahili derleyicisiyle birlikte kullanılabilmesi ve ileri programlama tekniklerinin programa dahil edilebilmesi için devpaks.org sitesinden ücretsiz WebUpdate hizmeti alabilmesi gibi önemli avantajları vardır. 6 2. PROGRAMLAMAYA GİRİŞ Bilgisayar yazılımları doğal olarak bir sorunu yani bir problemi çözmek üzere hazırlanır. Aslında problem çözümü sadece bilgisayar bilimleri alanında değil, diğer tüm bilim alanlarında ve hatta günlük yaşantımızda karşımıza çıkan bir olgudur. Problemin özelliğine bağlı olarak, her bir alanda kendi özel çözüm yöntemleri ve problemi anlama ve çözümleme yöntemleri bulunmaktadır. Bir fizikçinin probleme yaklaşım biçimi ile bir bilgisayar yazılımcısının yaklaşım biçimi farklılıklar gösterebilir. Biz konuya program geliştirme açısından bakarak, problemin nasıl çözümleneceği konusuna eğileceğiz. Bu açıdan bakıldığında, problemin ortaya çıkışından, çözümünü gerçekleştirinceye dek olan sürecin iki temel aşamadan oluştuğunu söyleyebiliriz: Problem çözme aşaması Gerçekleştirim aşaması Problemin çözüm aşaması da kendi içinde alt süreçlere ayrılmaktadır. Problem çözme aşamasında aşağıdaki adımlar yerine getirilir: Problemin tanımlanması Çözümün ana hatlarının ortaya konulması Ana hatlara bağlı olarak bir algoritmanın geliştirilmesi Algoritmanın doğruluğunun sınanması Problemle ilgili algoritma ortaya konulduktan sonra, bu algoritmaya uygun olarak bilgisayar programlarının hazırlanması ve çalıştırılması gerekecektir. Gerçekleştirim adı verilen bu aşamada aşağıdaki adımlar yerine getirilir: Algoritma kodlan belirli bir programlama diline dönüştürülür. Program bilgisayarda çalıştırılır. Programın belgelemesi ve bakımı yapılır. Bu iki süreç birleştirilerek, problemi bilgisayar aracılığıyla çözmek için, algoritma bulma ve programlama süreci şu şekilde ortaya konulabilir: Problemi belirleme ve anlama Algoritma hazırlama Program geliştirme Programı yürütme ve doğruluğunu değerlendirme. Programlama süreci ardı ardına işlemlerden oluşmasına rağmen, bu sürecin herhangi bir adımından geriye dönerek işlemleri tekrarlamak mümkündür. 2.1 Algoritma Algoritma, bir problemin çözülebilmesi için adım adım uygulanan kurallar dizisidir ve bir problemi çözmek için gerekli yöntemi tanımlar. Algoritma, doğru olarak icra edildiği zaman, verilen problemi çözecek adımlar dizisinden oluşur. Bir algoritma için basitlik ve adım sayısı üzerinde önemle durulan iki konudur. Algoritmanın basitliği, kolay anlaşılır olması ile ilişkilidir. Adım sayısının ise az olması istenir. Aynı işi gören iki algoritma arasında, bilgisayarda daha az zaman gerektireceği için, adım sayısı az 7 olan algoritma tercih edilir. Algoritmalar, her türlü alternatif gidiş yolu düşünülerek sonuca ulaşıldığının garanti edilmesini hedef alır. Buna ek olarak bir algoritmada, girilen verilerin değerlendirilmesi ve buna karşılık olarak sonuçların elde edilmesi gereklidir. Algoritmada olması gereken özellikler aşağıda açıklanmaktadır. Girdi/Çıktı: Her algoritmanın bir giriş ve bir çıkış değeri olmalıdır. Girdi; algoritmanın üzerinde işlem yapması için aldığı veridir; çıktı ise algoritmanın girdiye karşı elde ettiği sonuçtur. Açıklık: Birden fazla anlama gelebilecek yani ikilemde kalınabilecek ifadelere sahip adımlar oluşturulmamalıdır. Bu nedenle her adım açık ve anlaşılır bir biçimde ifade edilmelidir. Sonluluk: Bir algoritma her ne koşulda olursa olsun sonlu sayıda işlem içermeli ve bu işlemlerin de süresi sonlu olmalıdır. Etkinlik: Bir algoritma aynı zamanda gereksiz tekrarlardan kaçınmalıdır ve gerektiği zaman başka bir algoritma içinde de kullanılabilmelidir. Algoritmalar oluşturulurken sıklıkla ya doğal dilden ya da akış diyagramlarından yararlanılır. Eğer algoritma oluşturulurken bir dil kullanılmışsa bu dil, matematiksel ifadelerin de bulunduğu ve konuşurken kullandığımız bir dil olduğu gibi, özel olarak algoritma tasarımı için hazırlanmış bir dil de olabilir. Öncelikle, algoritmaların konuşma dili yardımıyla oluşturulmasına yönelik birkaç örneği inceleyelim. ÖRNEK-1: 30 adet öğrencinin Matematik sınavında aldığı notları bilgisayara giriniz. Notların toplamını hesapladıktan sonra toplam değerini 30'a bölerek sınıf başarı ortalamasını bulunuz. Ortalama 70’in üstünde ise ekrana “başarılı sınıf’ aksi takdirde ise “vasat sınıf’ mesajını yazdırınız. ÖRNEK-2: Girilen İki Sayıyı Toplayan Programın Algoritması Girdi: Birinci sayı (x), İkinci sayı (y) Çıktı: İki sayının toplamı (toplam) 1. Başla 2. x değerini gir. 3. y değerini gir. 4. toplam=x+y 5. toplam değerini ekrana yaz. 6. Bitir ÖRNEK-3: Girilen İki Sayıyı Karşılaştırıp Büyük Olan Sayıyı Bulan Algoritma Girdi: Birinci sayı (x), İkinci sayı (y) Çıktı: Büyük sayı 1. Başla 2. x değerini gir. 3. y değerini gir. 4. Eğer x,y'den büyük ise adım 6'ya git. 5. Eğer y,x'den büyük ise adım 7'ye git. 6. X değerini ekrana yaz ve adım 8' e git. 7. Y değerini ekrana yaz ve adım 8' e git. 8. Bitir. 8 ÖRNEK-4: O’dan 100’e Kadar Olan Sayıların Karesini Alıp Ekrana Yazdıran Algoritma Girdi: Sayılar (s) Çıktı: Sayının karesi (k) 1. Başla 2. s değerine ilk değer olarak 1 değerini ver. 3. k=s*s yap. 4. k değerini ekrana yaz. 5. s değerini 1 arttır. 6. s>100 ise adım 8'e git. 7. Adım 3'e git. 8. Bitir. ÖRNEK-5: Bir Sınıftaki Öğrencilerin Bir Dersten Aldıkları Notların Ortalamasını Ekrana Yazan Algoritma Girdi: Öğrencilerin notları (nl, n2, n3... nSon), öğrenci sayısı (x), indis (i), Notların toplamı (toplam). Çıktı: Ortalama (ort) 1. Başla 2. x değerini gir. 3. i değerine ilk değer olarak 1 değerini ver 4. Öğrencinin notunu (n) gir. 5. toplam=toplam+n yap. 6. i'yi 1 arttır. 7. Eğer i>x ise Adım 9'a git. 8. Adım 4'e git. 9. ort=toplam/x 10. ort değerini ekrana yaz 11. Bitir. Akış diyagramı, bir algoritmanın adımlarının mantıksal sırasını, adımların birbiri ile bağlantısını, bir işlemden diğerine nasıl gidileceğini belirten kontrol mekanizmalarını, özel bazı şekil ve sembollerle anlatan bir ifade tarzıdır. Akış diyagramlarında kullanılan şekil ve semboller artık standart hale gelmiştir. Aşağıda, bir akış diyagramında sıklıkla kullanılan şekil ve semboller ile kullanıldıkları yerler verilmektedir. 9 Çeşitli problemlerin çözümüne yönelik olarak hazırlanan aşağıdaki akış diyagramı örneklerini inceleyiniz. Şekil 2. N tane sayının ortalaması. Şekil 1. Üç sayının ortalaması. 10 Şekil 3. İkinci dereceden bir denklemin kökleri. Şekil 4. 30 öğrencinin aldığı notların ortalaması. 11 3. C++ DİLİNİN TEMELLERİ 3.1 C++ Karakter Seti Her programlama dilinin kendine özgü bir takım karakterleri vardır. Bu karakterler ve ne anlama geldikleri önceden tanımlanmıştır. Örneğin; * (yıldız) karakteri BASIC dillerinde sadece çarpma anlamına gelirken, C++'da çarpma işleminin yanı sıra çok daha farklı işlevler yüklenmiştir. Bu durum diğer karakterler için de geçerli olabilir. Örneğin ^ (şapka) işareti BASIC dillerinde üs alma anlamına gelirken, C++ için bu karakterin böyle bir anlamı yoktur. Çizelge 3.1'de C++'da kullanılabilecek karakterler sınıflandırılmıştır. Çizelge 3.1 C++ karakter seti. RAKAMLAR 0 1 2 3 4 5 6 7 8 9 KÜÇÜK ALFABETİK KARAKTERLER a b c d e f g h i j k l m n o p q r s t u v w x y x BÜYÜK ALFABETİK KARAKTERLER A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ÖZEL KARAKTERLER. , ; : ' " + - * / _ = ! ? # $ % & @ < > ( ) { } [ ] \ | ~ ^ ETKİSİZ BOŞLUK KARAKTERLERİ \n \t \v \r DİĞER KARAKTERLER \a \b \0 \\ \* Etkisiz boşluk karakterlerinin ingilizce karşılığı 'whitespace' olup, bu ifade 'beyaz boşluk' şeklinde Türkçeye çevrilebilir. Etkisiz boşluk karakterlerinin program içinde kullanılıp kullanılmaması derleyici için farketmez. Ancak bu durum C++'la program yazan bizler için önemlidir. Yazdığımız programların okunabilirliğinin kolaylaştırılması amacıyla sıkça kullanacağımız karakterlerin başında etkisiz boşluk karakterleri gelmektedir. Tablo 3.1'de yer alan Etkisiz Boşluk Karakterleri ile Diğer Karakterler'in yüklendiği işlevler Tablo 3.2'de verilmektedir. KARAKTER ANLAMI GÖREVİ \n Yeni Satır Bir sonraki satıra geçmek \t Tab (Sekme) Bir tab ölçüsünde boşluk bırakmak \v Dikey Tab Bir tab ölçüsünde dikey boşluk bırakmak \r Satır Başı İmleçi satır başına konumlandırmak \a Alarm Uyarı amaçlı bir ses çıkarmak \b Backspace (Geri Al) Kendinden önceki karakteri silmek \0 Null Karakter dizilerini string haline getirmek \\ \ karakterini kullanabilmek için \\ şeklinde yazılır \" " karakterini kullanabilmek için \" şeklinde kullanılır 12 3.1 C++ Programlarının Yapısı Öncelikle, çok basit bir örnek program yazalım ve C++ programlarının yapısını bu örnek program üzerinde inceleyelim. Uygulama // ilk C++ programim #include using namespace std; int main() { cout