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 kurs boyunca öğrendiğin tüm OOP kavramlarını bir araya getiren bir E-Öğrenme Platformu oluşturalım. Kursları, farklı ders türlerini yöneten ve öğrencilerin ilerlemesini takip eden bir sistem oluşturacaksın: kalıtım hiyerarşilerini, çok biçimliliği, akıllı işaretçileri ve tasarım kalıplarını uyum içinde çalışırken göstereceksin.
Kodunu altı dosya arasında düzenleyeceksin:
User.h: Temel birUsersınıfı ve ondan türeyen iki sınıf,StudentveInstructorile bir kullanıcı hiyerarşisi oluştur.Temel
Usersınıfın bir ad ve kimlik bilgisine sahip olmalı; kullanıcı türünü bir dize olarak döndüren sanal birgetRole()yöntemi vegetInfo()döndüren bir"[name] ([id]) - [role]"yöntemi içermelidir.Studentsınıfı, kayıt olunan kurs kimliklerini (bir dize vektörü kullan) ve tamamlanan ders sayılarını takip eder.enrollInCourse(const std::string& courseId), sayacı artırmak içincompletedLesson()vegetCompletedCount()yöntemlerini ekle.Instructorsınıfı bir uzmanlık alanı dizesi saklar ve ders verdikleri kurs kimliklerini takip eder.addCourse(const std::string& courseId)vegetSpecialty()yöntemlerini ekle.Lesson.h: Soyut bir temel sınıf kullanarak bir ders hiyerarşisi oluştur.Lessontemel sınıfın bir başlığa ve dakika cinsinden süreye sahip olmalı; tamamlanma mesajı döndüren saf sanal bircomplete()yöntemi ve ders türünü döndüren birgetType()yöntemi içermelidir.Türetilmiş üç sınıf oluştur:
VideoLesson: Bir video URL'sine sahiptir.complete()yöntemi"Watched video: [title]"döndürür.QuizLesson: Bir soru sayısına sahiptir.complete()yöntemi"Completed quiz: [title] ([questions] questions)"döndürür.TextLesson: Bir kelime sayısına sahiptir.complete()yöntemi"Read article: [title]"döndürür.
Her sınıf, sırasıyla
getType(),"Video"veya"Quiz"döndürecek şekilde"Text"yöntemini ezmelidir.Course.h: Akıllı işaretçiler kullanarak derslerinin sahibi olan birCoursesınıfı oluştur.Bir kursun başlığı, kimliği ve eğitmen kimliği vardır. Kurs derslerinin münhasır 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 bir işaretçi döndürür (veya 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.LessonFactorydöndüren,createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra)statik yöntemine sahip birstd::unique_ptr<Lesson>sı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ılır) veya metin için kelime sayısı (int olarak ayrıştırılı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): her ikisini de bulur, öğrenciyi kaydeder ve"Enrolled [name] in [course title]"ya da"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ı ya da"Could not complete lesson"yazdırır
main.cpp: Platformunu göstermek 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]!"mesajını görüntüle. Kursu ve öğrenciyi oluşturup 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 (index 0) tamamla. Son olarak öğrencinin bilgilerini ve tamamlanan ders sayısını"Completed lessons: [count]"biçiminde yazdır.
Ö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 görev, gerçek e-öğrenme platformlarının nasıl yapılandırıldığını; kullanıcılar, içerik ve bunları koordine eden platform arasında net bir ayrım olduğunu gösterir. Factory kalıbı ders oluşturmayı esnek hale getirir, akıllı işaretçiler güvenli bellek yönetimi sağlar ve çok biçimlilik, her ders türü kendine özgü şekilde davranırken tüm ders türlerini tek biçimde ele almanı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; // 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, instructorId çıkarmak için courseDetails'i ayrıştır
// TODO: name, studentId çıkarmak için studentDetails'i ayrıştır
// TODO: type, title, duration, extra çıkarmak için lessonDetails'i ayrıştır
// TODO: Platformu oluştur ve "Welcome to [platform name]!" görüntüle
// TODO: Kursu ve öğrenciyi oluştur, onları platforma ekle
// TODO: LessonFactory kullanarak dersi oluştur ve kursa ekle
// TODO: Kurs müfredatını görüntüle
// TODO: Öğrenciyi kursa kaydet
// TODO: Öğrenci için ilk dersi (index 0) tamamla
// TODO: Print the student's info and completed lesson count
// 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 KonteynerKendi başına pratik yap: Online C++ derleyicisi