Menu
Coddy logo textTech

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 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 bir User sınıfı ve iki türetilmiş sınıf olan Student ve Instructor ile bir kullanıcı hiyerarşisi oluşturun.

    Temel User sınıfınız bir isme ve ID'ye sahip olmalı, kullanıcı türünü dize olarak döndüren sanal bir getRole() metoduna ve "[name] ([id]) - [role]" döndüren bir getInfo() metoduna sahip olmalıdır.

    Student sı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çin completedLesson() ve getCompletedCount() metodlarını ekleyin.

    Instructor sınıfı bir uzmanlık (specialty) dizesi saklar ve öğrettikleri kurs ID'lerini takip eder. addCourse(const std::string& courseId) ve getSpecialty() metodlarını ekleyin.

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

    Lesson temel 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 bir getType() 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 bir Course sı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 devreder
    • getLessonCount() — ders sayısını döndürür
    • getLesson(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 bir createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra) metoduna sahip bir LessonFactory sınıfı oluşturun.

    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ın) veya metin için kelime sayısı (int olarak ayrıştırın).

  • Platform.h: Her şeyi koordine eden merkezi Platform sı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ür
    • findUser(const std::string& id) — shared_ptr veya nullptr döndürür
    • enrollStudent(const std::string& studentId, const std::string& courseId) — her ikisini de bulur, öğrenciyi kaydeder, "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() 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:

    1. Platform adı
    2. Kurs detayları (format: title,courseId,instructorId)
    3. Öğrenci detayları (format: name,studentId)
    4. 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: 1

LearnHub, 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: 1

Bu 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