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

    Temel User sınıfın bir ad ve kimlik bilgisine sahip olmalı; kullanıcı türünü bir dize olarak döndüren sanal bir getRole() yöntemi ve getInfo() döndüren bir "[name] ([id]) - [role]" yöntemi içermelidir.

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

    Instructor sınıfı bir uzmanlık alanı dizesi saklar ve ders verdikleri kurs kimliklerini takip eder. 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.

    Lesson temel sınıfın bir başlığa ve dakika cinsinden süreye sahip olmalı; tamamlanma mesajı döndüren saf sanal bir complete() yöntemi ve ders türünü döndüren bir getType() 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 bir Course sı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ır
    • getLessonCount(): ders sayısını döndürür
    • getLesson(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.

    LessonFactory döndüren, createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra) statik yöntemine sahip bir std::unique_ptr<Lesson> 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ılır) veya metin için kelime sayısı (int olarak ayrıştırılı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): her ikisini de bulur, öğrenciyi kaydeder ve "Enrolled [name] in [course title]" ya da "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ı 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:

    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]!" 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: 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 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

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