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 ustalaştığınız tüm OOP kavramlarını bir araya getiren bir E-Öğrenme Platformu inşa edelim. Kursları, farklı ders türlerini yöneten ve öğrenci ilerlemesini takip eden bir sistem oluşturacaksınız; bu sistem kalıtım hiyerarşilerini, polimorfizmi, akıllı işaretçileri (smart pointers) ve tasarım desenlerinin uyum içinde çalışmasını sergileyecek.
Kodunuzu altı dosya halinde düzenleyeceksiniz:
User.h: Temel birUsersınıfı ve iki türetilmiş sınıf olanStudentveInstructorile bir kullanıcı hiyerarşisi oluşturun.Temel
Usersınıfınız bir isme ve ID'ye sahip olmalı, kullanıcı türünü dize olarak döndüren sanal birgetRole()metoduna ve"[name] ([id]) - [role]"döndüren birgetInfo()metoduna sahip olmalıdır.Studentsınıfı, kayıt olunan kurs ID'lerini (bir string vektörü kullanın) ve tamamlanan ders sayılarını takip eder.enrollInCourse(const std::string& courseId), sayıyı artırmak içincompletedLesson()vegetCompletedCount()metodlarını ekleyin.Instructorsınıfı bir uzmanlık (specialty) dizesi saklar ve öğrettikleri kurs ID'lerini takip eder.addCourse(const std::string& courseId)vegetSpecialty()metodlarını ekleyin.Lesson.h: Soyut bir temel sınıf kullanarak bir ders hiyerarşisi oluşturun.Lessontemel sınıfınız bir başlığa (title) ve süreye (dakika cinsinden duration) sahip olmalı, bir tamamlama mesajı döndüren saf sanal (pure virtual)complete()metoduna ve ders türünü döndüren birgetType()metoduna sahip olmalıdır.Üç türetilmiş sınıf oluşturun:
VideoLesson: Bir video URL'sine sahiptir.complete()metodu"Watched video: [title]"döndürür.QuizLesson: Bir soru sayısına sahiptir.complete()metodu"Completed quiz: [title] ([questions] questions)"döndürür.TextLesson: Bir kelime sayısına sahiptir.complete()metodu"Read article: [title]"döndürür.
Her biri
getType()metodunu sırasıyla"Video","Quiz"veya"Text"döndürecek şekilde geçersiz kılmalıdır (override).Course.h: Akıllı işaretçiler kullanarak derslerine sahip olan birCoursesınıfı oluşturun.Bir kursun başlığı, ID'si ve eğitmen ID'si vardır. Kurs derslerine özel olarak sahip olduğu için dersleri
std::vector<std::unique_ptr<Lesson>>olarak saklayın.Şu metodları ekleyin:
addLesson(std::unique_ptr<Lesson> lesson)— dersin sahipliğini kursa devredergetLessonCount()— ders sayısını döndürürgetLesson(size_t index)— o indeksteki derse bir işaretçi döndürür (geçersizse nullptr)displayCurriculum()— her dersin türünü ve başlığını"[index]. [Type]: [title]"formatında yazdırır
LessonFactory.h: Farklı ders türleri oluşturmak için Factory desenini uygulayın.std::unique_ptr<Lesson>döndüren statik bircreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra)metoduna sahip birLessonFactorysınıfı oluşturun.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ın) veya metin için kelime sayısı (int olarak ayrıştırın).Platform.h: Her şeyi koordine eden merkeziPlatformsınıfını oluşturun.Kursları
std::vector<std::shared_ptr<Course>>ve kullanıcılarıstd::vector<std::shared_ptr<User>>olarak saklayın.Şunları uygulayın:
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)— her ikisini de bulur, öğrenciyi kaydeder,"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() metodunu çağırır, öğrencinin tamamlanan ders sayısını artırır, tamamlama mesajını veya"Could not complete lesson"yazdırır
main.cpp: Platformunuzu sergilemek için her şeyi bir araya getirin.Dört girdi okuyun:
- Platform adı
- Kurs detayları (format:
title,courseId,instructorId) - Öğrenci detayları (format:
name,studentId) - Eklenecek ders (format:
type,title,duration,extra)
Platformu oluşturun ve
"Welcome to [platform name]!"mesajını görüntüleyin. Kursu ve öğrenciyi oluşturun, platforma ekleyin. Dersi oluşturmak için LessonFactory'yi kullanın ve kursa ekleyin. Kurs müfredatını görüntüleyin. Öğrenciyi kursa kaydedin. O öğrenci için ilk dersi (indeks 0) tamamlayın. Son olarak, öğrencinin bilgilerini ve tamamlanan ders sayısını"Completed lessons: [count]"olarak yazdırın.
Örneğin, CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 ve video,Introduction to OOP,30,https://example.com/oop girdileriyle:
Welcome to CodeAcademy!
1. Video: Introduction to OOP
Enrolled Alice in C++ Mastery
Watched video: Introduction to OOP
Alice (S001) - Student
Completed lessons: 1LearnHub, Python Basics,PY100,I002, Bob,S002 ve quiz,Variables Quiz,15,10 girdileriyle:
Welcome to LearnHub!
1. Quiz: Variables Quiz
Enrolled Bob in Python Basics
Completed quiz: Variables Quiz (10 questions)
Bob (S002) - Student
Completed lessons: 1Bu zorluk, gerçek e-öğrenme platformlarının nasıl yapılandırıldığını gösterir; kullanıcılar, içerik ve bunları koordine eden platform arasında net bir ayrım vardır. Factory deseni ders oluşturmayı esnek hale getirir, akıllı işaretçiler güvenli bellek yönetimi sağlar ve polimorfizm, her biri benzersiz davranırken tüm ders türlerine tek tip davranmanıza 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; // format: title,courseId,instructorId
std::getline(std::cin, courseDetails);
std::string studentDetails; // format: name,studentId
std::getline(std::cin, studentDetails);
std::string lessonDetails; // format: type,title,duration,extra
std::getline(std::cin, lessonDetails);
// TODO: title, courseId, instructorId bilgilerini çıkarmak için courseDetails değişkenini ayrıştırın
// TODO: name, studentId bilgilerini çıkarmak için studentDetails değişkenini ayrıştırın
// TODO: type, title, duration, extra bilgilerini çıkarmak için lessonDetails değişkenini ayrıştırın
// TODO: Platformu oluşturun ve "Welcome to [platform name]!" mesajını görüntüleyin
// TODO: Kursu ve öğrenciyi oluşturun, onları platforma ekleyin
// TODO: Dersi oluşturmak için LessonFactory kullanın ve dersi kursa ekleyin
// TODO: Kurs müfredatını görüntüleyin
// TODO: Öğrenciyi kursa kaydedin
// TODO: Öğrenci için ilk dersi (indeks 0) tamamlayın
// TODO: Öğrenci bilgilerini ve tamamlanan ders sayısını yazdırın
// Format: "Completed lessons: [count]"
return 0;
}
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