1. Ünite: Algoritma Kavramı
Algoritma, bir problemin çözümü için izlenmesi gereken sonlu adımlar dizisidir. Bilgisayar programlamasının temelini oluşturur ve kod yazmaya başlamadan önce çözümün mantıksal kurgusunu kurmayı sağlar. Algoritmalar genellikle “Sözde Kod” (Pseudo-code) veya görsel bir araç olan “Akış Şemaları” (Flowchart) ile ifade edilir. İyi bir algoritma; giriş, işlem ve çıkış aşamalarından oluşur, her adımı net ve kesin olmalıdır. Algoritma geliştirme süreci, karmaşık problemlerin daha küçük ve yönetilebilir parçalara bölünmesini sağlayarak hata yapma riskini minimize eder.
Örnek: İki sayının ortalamasını bulan bir algoritma: 1. Başla, 2. Birinci sayıyı al, 3. İkinci sayıyı al, 4. Sayıları toplayıp ikiye böl, 5. Sonucu yazdır, 6. Bitir.
2. Ünite: Programlamanın Temelleri
Programlama süreci, algoritmaların bilgisayarın anlayacağı dillere (C++ gibi) dökülmesidir. Bu aşamada değişkenler, veri tipleri (int, float, char, bool) ve sabitler temel yapı taşlarıdır. Veriler bellekte saklanır ve her birinin bir türü vardır; örneğin tam sayılar için ‘int’, ondalıklı sayılar için ‘float’ kullanılır. Atama operatörü (=) ile değişkenlere değer atanır, matematiksel operatörlerle işlemler yapılır. C++ dilinde kod yazarken syntax (yazım kuralları) çok önemlidir; örneğin her satır sonunda “;” kullanılması ve kütüphanelerin (#include) projeye dahil edilmesi şarttır.
Örnek: float daire_alan = 3.14 * r * r; satırında, ondalıklı bir değişken tanımlanmış ve matematiksel operatörler kullanılarak bir hesaplama yapılmıştır.
3. Ünite: Karar Yapıları (if, if-else)
Karar yapıları, programın akışını belirli koşullara göre dallandırmaya yarar. Eğer bir koşul sağlanıyorsa (doğruysa) bir kod bloğu, sağlanmıyorsa (yanlışsa) başka bir kod bloğu çalıştırılır. En temel karar yapısı if ve else anahtar kelimeleriyle kurulur. Karşılaştırma operatörleri (>, <, ==, !=) ve mantıksal bağlaçlar (&&, ||) kullanılarak karmaşık kontrol mekanizmaları oluşturulabilir. Bu yapılar, programın “karar vermesini” sağlayarak onu statik bir komut listesinden dinamik bir uygulamaya dönüştürür.
Örnek: Bir sayının tek mi çift mi olduğunu belirlemek için sayının 2’ye bölümünden kalan (mod) kontrol edilir; kalan 0 ise “Çifttir”, değilse “Tektir” yazdırılır.
4. Ünite: Kümelenmiş İf-else İf Yapıları
Birden fazla koşulun birbirine bağlı olduğu durumlarda else if veya iç içe geçmiş (nested) if yapıları kullanılır. Eğer ilk koşul yanlışsa, bir sonraki koşul kontrol edilir; bu süreç bir koşul doğru olana veya else bloğuna ulaşılana kadar devam eder. Ayrıca, bir değişkenin çok sayıda farklı değerini kontrol etmek için switch-case yapısı daha okunabilir bir alternatif sunar. Bu yapılar, karmaşık karar ağaçlarını yönetmek ve programın farklı durumlarda doğru tepki vermesini sağlamak için tasarlanmıştır.
Örnek: Notu 90-100 arası olana “AA”, 80-89 arası olana “BA”, 70-79 arası olana “BB” gibi çok seçenekli bir harf notu sisteminin kurulması.
5. Ünite: Döngüler
Döngüler, belirli bir kod bloğunun bir koşul sağlandığı sürece veya belirli bir sayıda tekrar edilmesini sağlar. C++ dilinde for, while ve do-while olmak üzere üç ana döngü tipi vardır. for döngüsü genellikle tekrar sayısı belliyken, while döngüsü bir koşul devam ettiği sürece çalışır. do-while döngüsü ise koşul ne olursa olsun kodun en az bir kez çalışmasını garanti eder. Döngüler, binlerce veriyi saniyeler içinde işlemek veya tekrarlı işleri tek bir satırla çözmek için programlamanın en güçlü araçlarındandır.
Örnek: 1’den 100’e kadar olan tüm sayıları tek tek ekrana yazdırmak için manuel olarak 100 satır yazmak yerine tek bir for döngüsü kullanılır.
6. Ünite: Diziler
Diziler (Arrays), aynı veri tipindeki birden fazla değeri tek bir isim altında topluca saklamaya yarar. Her elemana bir “indis” numarasıyla (C++’ta 0’dan başlayarak) ulaşılır. Diziler sayesinde, bir sınıftaki öğrencilerin notları veya bir aydaki sıcaklık değerleri gibi ilişkili veriler bir arada tutulabilir. Çok boyutlu diziler (örneğin matrisler) ile tablo yapısındaki veriler de modellenebilir. Diziler, döngülerle birlikte kullanıldığında büyük veri yığınları üzerinde hızlıca arama, sıralama ve hesaplama işlemleri yapılmasına olanak tanır.
Örnek: 50 kişilik bir sınıfın sınav notlarını saklamak için int notlar[50]; şeklinde bir dizi tanımlanarak tüm notlara tek değişken üzerinden ulaşılabilir.
7. Ünite: Fonksiyonlar
Fonksiyonlar, bir işlemi gerçekleştirmek üzere tasarlanmış ve programın farklı yerlerinde defalarca çağrılabilen bağımsız kod bloklarıdır. Kodun modüler olmasını, okunabilirliğinin artmasını ve tekrar kullanımını sağlar. Fonksiyonlar dışarıdan parametre alabilir ve bir değer döndürebilir (return). Bir fonksiyonun adı, dönüş tipi ve parametre listesi onun imzasını oluşturur. Karmaşık bir programı küçük fonksiyonlara bölmek, hata ayıklama sürecini kolaylaştırır ve “kendini tekrar etme” (Don’t Repeat Yourself – DRY) prensibini uygulamaya yardımcı olur.
Örnek: Bir sayının karesini alan bir fonksiyon yazıp, programın istediğiniz yerinde sadece kare(sayi) diyerek sonucu elde edebilirsiniz.
8. Ünite: Sıralama ve Arama Algoritmaları
Sıralama algoritmaları (Bubble Sort, Selection Sort vb.), bir dizi içindeki elemanları belirli bir düzene (artan veya azalan) sokar. Arama algoritmaları ise bir veri kümesi içinde istenen elemanın yerini bulmayı hedefler. Doğrusal arama (Linear Search) her elemanı tek tek kontrol ederken; ikili arama (Binary Search) sadece sıralı dizilerde çalışır ve her adımda arama alanını yarıya indirerek çok daha hızlı sonuç verir. Bu algoritmalar, bilgisayar bilimlerinde işlem performansını ve veri yönetimini optimize etmek için kullanılan temel yöntemlerdir.
Örnek: Binlerce kelime içeren bir sözlükte, sıralı yapı sayesinde istediğiniz kelimeyi saniyeler içinde bulmanızı sağlayan mantık “İkili Arama” algoritmasıdır.
9. Ünite: Yapılar (struct)
Yapılar (Struct), farklı veri tiplerini tek bir çatı altında toplayarak kullanıcı tanımlı yeni bir veri tipi oluşturmaya yarar. Diziler sadece aynı tip verileri tutabilirken, yapılar örneğin bir öğrencinin adını (string), yaşını (int) ve not ortalamasını (float) tek bir nesne gibi saklayabilir. Yapı elemanlarına nokta (.) operatörü ile ulaşılır. Yapılar, gerçek dünya nesnelerini programlama ortamına taşımada ve karmaşık verileri daha organize bir şekilde yönetmede köprü vazifesi görür.
Örnek: Bir kitap için Kitap adında bir yapı oluşturup içinde; kitap_adi, yazar ve sayfa_sayisi gibi farklı türdeki bilgileri bir arada tutmak.
10. Ünite: İşaretçiler (Pointers)
İşaretçiler, bir değişkenin değerini değil, o değerin bellekte saklandığı “adresi” tutan özel değişkenlerdir. C++ dilinin en güçlü özelliklerinden biridir. Adres operatörü (&) ve içerik operatörü (*) ile yönetilirler. İşaretçiler sayesinde bellek doğrudan yönetilebilir, fonksiyonlara veri adresleri gönderilerek performans artırılabilir ve dinamik bellek yönetimi yapılabilir. Karmaşık veri yapıları (bağlı listeler, ağaçlar) işaretçiler üzerine kuruludur. Ancak hatalı kullanımı sistem çökmesine veya bellek sızıntısına yol açabileceği için dikkatle yönetilmelidir.
Örnek: Bir eve gitmek için evin kendisini taşımak yerine, o evin adresini bir kağıda (işaretçi) yazıp o adresi kullanarak eve ulaşmak.
11. Ünite: C++’ta Kullanılan Hazır Fonksiyonlar
C++ dilinde programcıların işini kolaylaştırmak için önceden yazılmış fonksiyon kütüphaneleri bulunur. <cmath>kütüphanesi ile karekök alma (sqrt), üs hesaplama (pow) ve trigonometrik işlemler yapılırken; <cstring> veya <string> kütüphanesi ile metin birleştirme, uzunluk bulma ve karşılaştırma işlemleri gerçekleştirilir. Bu hazır fonksiyonlar, temel matematiksel ve metinsel işlemleri sıfırdan yazmak yerine güvenilir ve optimize edilmiş çözümleri kullanmamıza olanak tanır. Kütüphaneleri projenin en başında #include komutuyla dahil etmek gerekir.
Örnek: Bir sayının karekökünü hesaplamak için karmaşık bir matematiksel formül yazmak yerine sqrt(sayi)fonksiyonunu kullanmak.
12. Ünite: Sınıf ve Nesneler
Sınıflar (Classes), nesne yönelimli programlamanın (OOP) temelidir ve yapıların (struct) gelişmiş halidir. Bir sınıf, hem verileri (nitelikler) hem de bu veriler üzerinde işlem yapan fonksiyonları (metotlar) bir arada tutar. Nesne ise bu sınıfın bellekte hayat bulmuş bir örneğidir. Sınıflar; private, public ve protected gibi erişim belirleyicileri ile verileri koruma altına alarak “Kapsülleme” (Encapsulation) sağlar. Bu yaklaşım, gerçek dünya problemlerini daha doğal, modüler ve güvenli bir şekilde kodlamayı mümkün kılar.
Örnek: “Araba” bir sınıftır (marka, renk, hız özellikleri vardır); senin kapının önündeki “Kırmızı BMW” ise o sınıftan üretilmiş bir nesnedir.
13. Ünite: Kalıtım (Inheritance)
Kalıtım, bir sınıfın (alt sınıf) başka bir sınıftan (üst sınıf) özellikleri ve fonksiyonları devralmasıdır. Kodun tekrar kullanılabilirliğini artırır. Örneğin bir “Hayvan” sınıfındaki temel özellikler, “Kedi” veya “Köpek” sınıflarına otomatik olarak aktarılabilir; böylece her sınıfta aynı kodu tekrar yazmaya gerek kalmaz. Alt sınıf, üst sınıftan aldığı özelliklerin üzerine kendine has yeni özellikler de ekleyebilir. Bu hiyerarşik yapı, yazılım sistemlerinin daha esnek ve geliştirilebilir olmasını sağlar.
Örnek: “Personel” ana sınıfındaki ad, soyad ve maaş bilgilerinin; “Mühendis” ve “Sekreter” sınıfları tarafından miras alınması.
14. Ünite: Dosyalar
Program sonlandığında bellekteki veriler silinir; verilerin kalıcı olması için dosyalara (txt, dat vb.) yazılması gerekir. C++’ta <fstream> kütüphanesi ile dosya işlemleri yapılır. ofstream dosyaya yazmak, ifstream dosyadan okumak, fstream ise her iki işlem için kullanılır. Dosyalar; okuma (in), yazma (out) veya ekleme (app) modlarında açılabilir. Dosya işlemleri bittiğinde dosyanın close() ile kapatılması veri kaybını önlemek için kritiktir. Bu sayede kullanıcı bilgileri, oyun skorları veya raporlar kalıcı olarak saklanabilir.
Örnek: Bir oyundaki en yüksek skorları (High Scores) oyun kapandığında kaybolmaması için “skorlar.txt” dosyasına kaydetmek ve oyun açıldığında oradan okumak.
