Menu
Coddy logo textTech

Özet - Öğrenci Kayıt Sistemi

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 39 / 104.

Kapsülleme (encapsulation) bilginizi pratiğe dökme zamanı! Bu meydan okumada, erişim belirleyicilerin, bilgi gizlemenin ve iç içe sınıfların (nested classes) doğru kullanımını gösteren bir Öğrenci Kayıt Sistemi oluşturacaksınız.

Sisteminiz, öğrenci verilerini şu kapsülleme prensipleriyle yönetecek:

  • Notlar ve öğrenci kimlik numaraları gibi hassas bilgileri korumak için Özel (private) veri üyeleri
  • Getter'lar ve kontrollü setter'lar içeren Genel (public) arayüz
  • Bu uygulama detayını öğrenci sınıfı içinde tutmak için ders notlarını temsil eden İç içe bir sınıf (nested class)

İşte uygulayacağınız yapı:

class Student {
public:
    class Grade {    // Ders notları için iç içe sınıf
        // ...
    };
    
    // Öğrenci verileriyle etkileşim için genel arayüz
    
private:
    std::string name;
    int studentId;
    // Not koleksiyonu
};

Bu meydan okuma, bu bölümdeki her şeyi birleştiriyor: uygun erişim seviyelerini seçmek, uygulama detaylarını temiz bir arayüzün arkasına gizlemek ve ilgili türleri düzenlemek için iç içe sınıfları kullanmak. Neyin erişilebilir olması ve neyin gizli kalması gerektiği konusunda dikkatlice düşünün.

challenge icon

Görev

Kolay

Kapsülleme (encapsulation) hakkında öğrendiğiniz her şeyi bir araya getiren bir Öğrenci Kayıt Sistemi oluşturalım. Öğrenci verilerinin uygun şekilde korunduğu, notların iç içe geçmiş (nested) bir sınıf aracılığıyla yönetildiği ve tüm etkileşimlerin temiz bir genel arayüz üzerinden gerçekleştiği bir sistem oluşturacaksınız.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • Student.h: İç içe geçmiş bir Grade sınıfı ile düzgün kapsüllemeyi gösteren bir Student sınıfı tanımlayın.

    İç içe geçmiş Grade sınıfınız (Student sınıfının public bölümünde bildirilmiş), bir kurs adı (string) ve bir puan (double) saklamalıdır. Ona her iki değeri de alan bir yapıcı (constructor) verin ve verilere erişmek için getCourseName() ve getScore() metotlarını sağlayın. Grade sınıfı verilerini özel (private) tutar — Student içinde iç içe geçmiş olsa bile, kendi kapsüllemesini korumaya devam eder.

    Student sınıfı, öğrencinin adı (string), öğrenci numarası (int) ve Grade işaretçilerinden (pointers) oluşan bir koleksiyon için özel (private) üyelere sahip olmalıdır. Şunları sağlayın:

    • Adı ve öğrenci numarasını alan bir yapıcı (constructor)
    • getName() ve getStudentId() alıcıları (getters) (her ikisi de const)
    • Yeni bir Grade oluşturan ve bunu öğrencinin kaydına ekleyen bir addGrade(const std::string& course, double score) metodu (yalnızca puan 0 ile 100 arasındaysa (dahil) ekleyin)
    • Tüm notların ortalamasını hesaplayan ve döndüren veya hiç not yoksa 0.0 döndüren bir getAverageGrade() metodu (const)
    • Öğrencinin tüm kaydını gösteren bir displayRecord() metodu (const)

    Yıkıcı (destructor) içinde dinamik olarak ayrılmış notları temizlemeyi ve uygun başlık koruyucularını (header guards) eklemeyi unutmayın.

  • main.cpp: Girişten bir öğrenci adı, öğrenci numarası ve üç kurs notu okuyun. Giriş formatı beş satır olacaktır: ad, numara, ardından her biri bir boşlukla ayrılmış kurs adı ve puanı içeren üç satır (örneğin, Math 95.5).

    Ad ve numara ile bir Student nesnesi oluşturun, üç notun hepsini ekleyin ve ardından tüm kaydı görüntüleyin.

    displayRecord() için çıktı formatı şu şekilde olmalıdır:

    Student: <name> (ID: <id>)
    Grades:
      <course1>: <score1>
      <course2>: <score2>
      <course3>: <score3>
    Average: <average>

Tüm puanları ve ortalamayı, <iomanip> kütüphanesinden std::fixed ve std::setprecision(1) kullanarak bir ondalık basamakla formatlayın. Kimliği (ID) std::stoi() ve puanları std::stod() kullanarak dönüştürün.

Bu meydan okuma; özel veri üyelerini, genel alıcıları (getters), doğrulama içeren kontrollü ayarlayıcıları (setters) ve iç içe geçmiş bir sınıfı birleştirerek iyi kapsüllenmiş bir öğrenci kayıt sistemi oluşturmak için hepsini birlikte kullanır.

Kopya kağıdı

Kapsülleme (Encapsulation), verileri korumak ve kodu düzenlemek için erişim belirleyicileri, bilgi gizlemeyi ve iç içe geçmiş sınıfları birleştirir.

Veri Koruması için Erişim Belirleyiciler

Hassas veri üyeleri için private ve arayüz için public kullanın:

class Student {
public:
    // Genel arayüz metotları
    
private:
    std::string name;
    int studentId;
    // Diğer özel veriler
};

İç İçe Geçmiş Sınıflar

İç içe geçmiş sınıflar, kendi kapsüllemelerini koruyarak bir sınıf içindeki ilgili türleri düzenler:

class Student {
public:
    class Grade {    // İç içe geçmiş sınıf
    private:
        std::string courseName;
        double score;
    public:
        Grade(const std::string& course, double s) 
            : courseName(course), score(s) {}
        std::string getCourseName() const { return courseName; }
        double getScore() const { return score; }
    };
    
private:
    std::vector<Grade*> grades;
};

Doğrulama ile Kontrollü Erişim

Metotlar, özel üyeleri değiştirmeden önce verileri doğrulayabilir:

void addGrade(const std::string& course, double score) {
    if (score >= 0 && score <= 100) {
        grades.push_back(new Grade(course, score));
    }
}

Const Metotlar

Verileri değiştirmeyen metotları const olarak işaretleyin:

std::string getName() const { return name; }
double getAverageGrade() const {
    // Ortalamayı hesapla ve döndür
}

Bellek Yönetimi

Yıkıcı metot (destructor) içinde dinamik olarak ayrılmış nesneleri temizleyin:

~Student() {
    for (Grade* grade : grades) {
        delete grade;
    }
}

Kendin dene

#include <iostream>
#include <string>
#include <sstream>
#include "Student.h"

int main() {
    // Öğrenci adını oku
    std::string name;
    std::getline(std::cin, name);
    
    // Öğrenci ID'sini oku
    std::string idStr;
    std::getline(std::cin, idStr);
    int studentId = std::stoi(idStr);
    
    // Üç ders notunu oku (format: "CourseName Score")
    std::string line1, line2, line3;
    std::getline(std::cin, line1);
    std::getline(std::cin, line2);
    std::getline(std::cin, line3);
    
    // TODO: Ders adını ve puanını çıkarmak için her satırı ayrıştırın
    // Puan dizelerini double türüne dönüştürmek için `std::stod()` kullanın
    
    // TODO: İsim ve ID ile bir Student nesnesi oluşturun
    
    // TODO: Üç notun tamamını öğrenciye ekleyin
    
    // TODO: Tam öğrenci kaydını görüntüleyin
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler