E-Öğrenme Platformu
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 103 / 104.
Görev
KolayBu kursta öğrendiğin tüm OOP kavramlarını bir araya getiren bir E-Öğrenme Platformu oluşturalım. Kursları ve farklı ders türlerini yöneten, öğrencilerin ilerlemesini takip eden bir sistem oluşturacaksın: kalıtım hiyerarşilerinin, çok biçimliliğin, akıllı işaretçilerin ve tasarım kalıplarının uyum içinde nasıl çalıştığını göstereceksin.
Kodunu altı dosyaya ayıracaksın:
User.h: TemelUsersınıfı ve ondan türetilen iki sınıf olanStudentveInstructorile bir kullanıcı hiyerarşisi oluştur.Temel
Usersınıfında bir ad ve kimlik bulunmalı. Kullanıcı türünü bir dize olarak döndüren sanal birgetRole()yöntemi ve"[name] ([id]) - [role]"değerini döndüren birgetInfo()yöntemi olmalı.Studentsınıfı kayıtlı olduğu kursların kimliklerini (bir dize vektörü kullan) ve tamamlanan ders sayısını izler.enrollInCourse(const std::string& courseId), sayacı artırancompletedLesson()vegetCompletedCount()yöntemlerini ekle.Instructorsınıfı bir uzmanlık alanı dizesi tutar ve verdiği kursların kimliklerini izler.addCourse(const std::string& courseId)vegetSpecialty()yöntemlerini ekle.Lesson.h: Soyut bir temel sınıf kullanarak bir ders hiyerarşisi oluştur.Temel
Lessonsınıfında bir başlık ve süre (dakika cinsinden) bulunmalı. Tamamlanma mesajı döndüren saf sanal bircomplete()yöntemi ve ders türünü döndüren birgetType()yöntemi olmalı.Türetilmiş üç sınıf oluştur:
VideoLesson: Bir video URL'si içerir.complete()yöntemi"Watched video: [title]"değerini döndürür.QuizLesson: Soru sayısını içerir.complete()yöntemi"Completed quiz: [title] ([questions] questions)"değerini döndürür.TextLesson: Sözcük sayısını içerir.complete()yöntemi"Read article: [title]"değerini döndürür.
Her sınıf, sırasıyla
"Video","Quiz"veya"Text"değerini döndürecek şekildegetType()yöntemini geçersiz kılmalı.Course.h: Derslerinin sahipliğini akıllı işaretçilerle üstlenen birCoursesınıfı oluştur.Bir kursun başlığı, kimliği ve eğitmen kimliği vardır. Kurs derslerin tek sahibi olduğundan, dersleri
std::vector<std::unique_ptr<Lesson>>olarak sakla.Şu yöntemleri ekle:
addLesson(std::unique_ptr<Lesson> lesson): dersin sahipliğini kursa aktarırgetLessonCount(): ders sayısını döndürürgetLesson(size_t index): belirtilen dizindeki derse işaretçi döndürür (geçersizse nullptr)displayCurriculum(): her dersin türünü ve başlığını"[index]. [Type]: [title]"biçiminde yazdırır
LessonFactory.h: Farklı ders türleri oluşturmak için Factory kalıbını uygula.std::unique_ptr<Lesson>döndüren statik bircreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra)yöntemi bulunan birLessonFactorysınıfı oluştur.typeparametresi hangi dersin oluşturulacağını belirler ("video","quiz"veya"text").extraparametresi türe özgü verileri içerir: video için URL, quiz için soru sayısı (int olarak ayrıştır) veya text için sözcük sayısı (int olarak ayrıştır).Platform.h: Her şeyi koordine eden merkeziPlatformsınıfını oluştur.Kursları
std::vector<std::shared_ptr<Course>>, kullanıcıları isestd::vector<std::shared_ptr<User>>olarak sakla.Şunları uygula:
addCourse(std::shared_ptr<Course> course)addUser(std::shared_ptr<User> user)findCourse(const std::string& id): shared_ptr veya nullptr döndürürfindUser(const std::string& id): shared_ptr veya nullptr döndürürenrollStudent(const std::string& studentId, const std::string& courseId): ikisini de bulur, öğrenciyi kaydeder ve"Enrolled [name] in [course title]"veya"Enrollment failed"yazdırırcompleteLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex): öğrenciyi ve kursu bulur, dersin complete() yöntemini çağırır, öğrencinin tamamlanan ders sayısını artırır ve tamamlanma mesajını veya"Could not complete lesson"değerini yazdırır
main.cpp: Platformunu tanıtmak için her şeyi bir araya getir.Dört girdi oku:
- Platform adı
- Kurs ayrıntıları (biçim:
title,courseId,instructorId) - Öğrenci ayrıntıları (biçim:
name,studentId) - Eklenecek ders (biçim:
type,title,duration,extra)
Platformu oluştur ve
"Welcome to [platform name]!"değerini görüntüle. Kursu ve öğrenciyi oluştur, ardından platforma ekle. Dersi oluşturmak ve kursa eklemek için LessonFactory'yi kullan. Kurs müfredatını görüntüle. Öğrenciyi kursa kaydet. Bu öğrenci için ilk dersi (dizin 0) tamamla. Son olarak, öğrencinin bilgilerini ve tamamladığı ders sayısını"Completed lessons: [count]"biçiminde yazdır.
Örneğin, girdiler CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 ve video,Introduction to OOP,30,https://example.com/oop olduğunda:
Welcome to CodeAcademy!
1. Video: Introduction to OOP
Enrolled Alice in C++ Mastery
Watched video: Introduction to OOP
Alice (S001) - Student
Completed lessons: 1Girdiler LearnHub, Python Basics,PY100,I002, Bob,S002 ve quiz,Variables Quiz,15,10 olduğunda:
Welcome to LearnHub!
1. Quiz: Variables Quiz
Enrolled Bob in Python Basics
Completed quiz: Variables Quiz (10 questions)
Bob (S002) - Student
Completed lessons: 1Bu görev, kullanıcılar, içerik ve bunları koordine eden platform arasında net bir ayrım bulunan gerçek e-öğrenme platformlarının nasıl yapılandırıldığını gösterir. Factory kalıbı ders oluşturmayı esnek hâle getirir, akıllı işaretçiler güvenli bellek yönetimi sağlar ve çok biçimlilik, her ders türü kendine özgü davranırken tüm ders türlerini aynı biçimde ele almana olanak tanır.
Kendin dene
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "User.h"
#include "Lesson.h"
#include "Course.h"
#include "LessonFactory.h"
#include "Platform.h"
int main() {
// Girdileri oku
std::string platformName;
std::getline(std::cin, platformName);
std::string courseDetails; // biçim: title,courseId,instructorId
std::getline(std::cin, courseDetails);
std::string studentDetails; // biçim: name,studentId
std::getline(std::cin, studentDetails);
std::string lessonDetails; // biçim: type,title,duration,extra
std::getline(std::cin, lessonDetails);
// TODO: title, courseId ve instructorId değerlerini çıkarmak için courseDetails verisini ayrıştır
// TODO: name ve studentId değerlerini çıkarmak için studentDetails verisini ayrıştır
// TODO: type, title, duration ve extra değerlerini çıkarmak için lessonDetails verisini ayrıştır
// TODO: Platformu oluştur ve "Welcome to [platform name]!" mesajını göster
// TODO: Kursu ve öğrenciyi oluştur, ardından onları platforma ekle
// TODO: Dersi oluşturmak için LessonFactory kullan ve dersi kursa ekle
// TODO: Kurs müfredatını göster
// TODO: Öğrenciyi kursa kaydet
// TODO: Öğrenci için ilk dersi (indeks 0) tamamla
// TODO: Öğrencinin bilgilerini ve tamamladığı ders sayısını yazdır
// Biçim: "Completed lessons: [count]"
return 0;
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarC++ Derleme ve Derleme SüreciHeader Dosyaları ve Kaynak DosyalarıNamespace'ler ve KapsamC++'ta Nesne Yönelimli Programlamaya GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriTekrar - Basit Hesap Makinesi4Sınıf Özellikleri
Nesne ve Statik ÜyelerGetter ve Setter'larconst Üye Fonksiyonlarımutable Anahtar SözcüğüStatik 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 DüzeyleriCtor ve Dtor Çağrı SırasıMetot Geçersiz KılmaVirtual Fonksiyonlar ve VTableÇoklu KalıtımVirtual KalıtımÖzet - Çalışan Hiyerarşisi2Bellek Yönetimi
Stack ve Heap Belleğiİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++’ta Akıllı İşaretçilerC++’ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'ta Erişim BelirleyicileriErişim Belirleyicilerine Derinlemesine BakışBilgi GizlemeStruct ve Class Karşılaştırmasıİç İçe ve İç SınıflarTekrar - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme Zamanı 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ıDinamik Tür Dönüştürme ve RTTITekrar - Şekil Hesaplayıcı11İleri Düzey OOP Kavramları
Bileşim ve KalıtımCRTP ile Mixin'lerPimpl İdiomuTür SilmeEnum Sınıfları ve Güçlü TürlemeOOP'de İstisna YönetimiÖzel İstisna Hiyerarşileri14Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpBir Kalıp Olarak RAII3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopyalama YapıcısıTaşıma YapıcısıYapıcı Başlatma ListeleriYönlendiren YapıcılarYıkıcıları Derinlemesine İncelemeÜç / 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örleri Aşırı YüklemeKarşılaştırma Operatörlerini Aşırı YüklemeAkış OperatörleriAtama Operatörünü Aşırı Yükleme[] ve () Operatörlerini Aşırı YüklemeTür Dönüşüm OperatörleriTekrar - Matrix Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeDeğişken Sayıda Argüman Alan ŞablonlarSFINAE ve Tür Özelliklerinin TemelleriTekrar: Genel Amaçlı KapsayıcıKendi başına pratik yap: Online C++ derleyicisi