Menu
CoddyTech

E-Öğrenme Platformu

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

challenge icon

Görev

Kolay

Bu 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: Temel User sınıfı ve ondan türetilen iki sınıf olan Student ve Instructor ile bir kullanıcı hiyerarşisi oluştur.

    Temel User sınıfında bir ad ve kimlik bulunmalı. Kullanıcı türünü bir dize olarak döndüren sanal bir getRole() yöntemi ve "[name] ([id]) - [role]" değerini döndüren bir getInfo() yöntemi olmalı.

    Student sı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ıran completedLesson() ve getCompletedCount() yöntemlerini ekle.

    Instructor sınıfı bir uzmanlık alanı dizesi tutar ve verdiği kursların kimliklerini izler. addCourse(const std::string& courseId) ve getSpecialty() yöntemlerini ekle.

  • Lesson.h: Soyut bir temel sınıf kullanarak bir ders hiyerarşisi oluştur.

    Temel Lesson sınıfında bir başlık ve süre (dakika cinsinden) bulunmalı. Tamamlanma mesajı döndüren saf sanal bir complete() yöntemi ve ders türünü döndüren bir getType() 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 şekilde getType() yöntemini geçersiz kılmalı.

  • Course.h: Derslerinin sahipliğini akıllı işaretçilerle üstlenen bir Course sı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ır
    • getLessonCount(): ders sayısını döndürür
    • getLesson(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 bir createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra) yöntemi bulunan bir LessonFactory sınıfı oluştur.

    type parametresi hangi dersin oluşturulacağını belirler ("video", "quiz" veya "text"). extra parametresi 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 merkezi Platform sınıfını oluştur.

    Kursları std::vector<std::shared_ptr<Course>>, kullanıcıları ise std::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ür
    • findUser(const std::string& id): shared_ptr veya nullptr döndürür
    • enrollStudent(const std::string& studentId, const std::string& courseId): ikisini de bulur, öğrenciyi kaydeder ve "Enrolled [name] in [course title]" veya "Enrollment failed" yazdırır
    • completeLesson(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:

    1. Platform adı
    2. Kurs ayrıntıları (biçim: title,courseId,instructorId)
    3. Öğrenci ayrıntıları (biçim: name,studentId)
    4. 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: 1

Girdiler 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: 1

Bu 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

Kendi başına pratik yap: Online C++ derleyicisi