Ö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.
Görev
KolayKapsü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ş birGradesınıfı ile düzgün kapsüllemeyi gösteren birStudentsınıfı tanımlayın.İç içe geçmiş
Gradesınıfınız (Studentsı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çingetCourseName()vegetScore()metotlarını sağlayın.Gradesınıfı verilerini özel (private) tutar —Studentiçinde iç içe geçmiş olsa bile, kendi kapsüllemesini korumaya devam eder.Studentsınıfı, öğrencinin adı (string), öğrenci numarası (int) veGradeiş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()vegetStudentId()alıcıları (getters) (her ikisi de const)- Yeni bir
Gradeoluşturan ve bunu öğrencinin kaydına ekleyen biraddGrade(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
Studentnesnesi 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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner