Platform E-Learning
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 103 dari 104.
Tantangan
MudahMari bangun Platform E-Learning yang menyatukan semua konsep OOP yang telah kamu kuasai sepanjang kursus ini. Kamu akan membuat sistem yang mengelola kursus, berbagai jenis pelajaran, dan melacak kemajuan siswa, sekaligus menunjukkan hierarki pewarisan, polimorfisme, smart pointer, dan pola desain yang bekerja secara harmonis.
Kamu akan mengatur kodemu dalam enam file:
User.h: Buat hierarki user dengan class dasarUserdan dua class turunan:StudentdanInstructor.Class dasar
Userharus memiliki nama dan ID, dengan method virtualgetRole()yang mengembalikan tipe user sebagai string, dan methodgetInfo()yang mengembalikan"[name] ([id]) - [role]".Class
Studentmelacak ID kursus yang diikuti (gunakan vector berisi string) dan jumlah pelajaran yang diselesaikan. Tambahkan methodenrollInCourse(const std::string& courseId),completedLesson()untuk menambah jumlahnya, dangetCompletedCount().Class
Instructormenyimpan string spesialisasi dan melacak ID kursus yang diajarkannya. TambahkanaddCourse(const std::string& courseId)dangetSpecialty().Lesson.h: Bangun hierarki pelajaran menggunakan class dasar abstrak.Class dasar
Lessonharus memiliki judul dan durasi (dalam menit), dengan method virtual murnicomplete()yang mengembalikan pesan penyelesaian, dan methodgetType()yang mengembalikan tipe pelajaran.Buat tiga class turunan:
VideoLesson: Memiliki URL video.complete()-nya mengembalikan"Watched video: [title]"QuizLesson: Memiliki jumlah pertanyaan.complete()-nya mengembalikan"Completed quiz: [title] ([questions] questions)"TextLesson: Memiliki jumlah kata.complete()-nya mengembalikan"Read article: [title]"
Masing-masing harus meng-override
getType()untuk mengembalikan"Video","Quiz", atau"Text"secara berurutan.Course.h: Buat classCourseyang memiliki pelajarannya menggunakan smart pointer.Sebuah kursus memiliki judul, ID, dan ID pengajar. Simpan pelajaran sebagai
std::vector<std::unique_ptr<Lesson>>karena kursus memiliki pelajarannya secara eksklusif.Tambahkan method:
addLesson(std::unique_ptr<Lesson> lesson): memindahkan kepemilikan pelajaran ke kursusgetLessonCount(): mengembalikan jumlah pelajarangetLesson(size_t index): mengembalikan pointer ke pelajaran pada indeks tersebut (atau nullptr jika tidak valid)displayCurriculum(): menampilkan tipe dan judul setiap pelajaran dalam format"[index]. [Type]: [title]"
LessonFactory.h: Terapkan pola Factory untuk membuat berbagai tipe pelajaran.Buat class
LessonFactorydengan method statiscreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra)yang mengembalikanstd::unique_ptr<Lesson>.Parameter
typemenentukan pelajaran yang akan dibuat ("video","quiz", atau"text"). Parameterextraberisi data khusus untuk tiap tipe: URL untuk video, jumlah pertanyaan untuk kuis (urai sebagai int), atau jumlah kata untuk teks (urai sebagai int).Platform.h: Bangun class pusatPlatformyang mengoordinasikan semuanya.Simpan kursus sebagai
std::vector<std::shared_ptr<Course>>dan user sebagaistd::vector<std::shared_ptr<User>>.Terapkan:
addCourse(std::shared_ptr<Course> course)addUser(std::shared_ptr<User> user)findCourse(const std::string& id): mengembalikan shared_ptr atau nullptrfindUser(const std::string& id): mengembalikan shared_ptr atau nullptrenrollStudent(const std::string& studentId, const std::string& courseId): mencari keduanya, mendaftarkan siswa, lalu menampilkan"Enrolled [name] in [course title]"atau"Enrollment failed"completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex): mencari siswa dan kursus, memanggil method complete() pada pelajaran, menambah jumlah pelajaran yang diselesaikan siswa, lalu menampilkan pesan penyelesaian atau"Could not complete lesson"
main.cpp: Satukan semuanya untuk menunjukkan platformmu.Baca empat input:
- Nama platform
- Detail kursus (format:
title,courseId,instructorId) - Detail siswa (format:
name,studentId) - Pelajaran yang akan ditambahkan (format:
type,title,duration,extra)
Buat platform dan tampilkan
"Welcome to [platform name]!". Buat kursus dan siswa, lalu tambahkan keduanya ke platform. Gunakan LessonFactory untuk membuat pelajaran dan menambahkannya ke kursus. Tampilkan kurikulum kursus. Daftarkan siswa ke kursus. Selesaikan pelajaran pertama (indeks 0) untuk siswa tersebut. Terakhir, tampilkan info siswa dan jumlah pelajaran yang diselesaikannya sebagai"Completed lessons: [count]".
Contohnya, dengan input CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001, dan video,Introduction to OOP,30,https://example.com/oop:
Welcome to CodeAcademy!
1. Video: Introduction to OOP
Enrolled Alice in C++ Mastery
Watched video: Introduction to OOP
Alice (S001) - Student
Completed lessons: 1Dengan input LearnHub, Python Basics,PY100,I002, Bob,S002, dan quiz,Variables Quiz,15,10:
Welcome to LearnHub!
1. Quiz: Variables Quiz
Enrolled Bob in Python Basics
Completed quiz: Variables Quiz (10 questions)
Bob (S002) - Student
Completed lessons: 1Tantangan ini menunjukkan bagaimana platform e-learning nyata disusun, dengan pemisahan yang jelas antara user, konten, dan platform yang mengoordinasikan keduanya. Pola Factory membuat pembuatan pelajaran fleksibel, smart pointer memastikan pengelolaan memori yang aman, dan polimorfisme memungkinkan kamu memperlakukan semua tipe pelajaran secara seragam, sementara tiap tipe berperilaku secara unik.
Coba sendiri
#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() {
// Baca input
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: Uraikan courseDetails untuk mengambil title, courseId, instructorId
// TODO: Uraikan studentDetails untuk mengambil name, studentId
// TODO: Uraikan lessonDetails untuk mengambil type, title, duration, extra
// TODO: Buat platform dan tampilkan "Welcome to [platform name]!"
// TODO: Buat kursus dan siswa, lalu tambahkan keduanya ke platform
// TODO: Gunakan LessonFactory untuk membuat pelajaran dan menambahkannya ke kursus
// TODO: Tampilkan kurikulum kursus
// TODO: Daftarkan siswa ke kursus
// TODO: Selesaikan pelajaran pertama (indeks 0) untuk siswa
// TODO: Tampilkan informasi siswa dan jumlah pelajaran yang telah diselesaikan
// Format: "Completed lessons: [count]"
return 0;
}
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online