Menu
CoddyTech

Nền tảng học trực tuyến

Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 68 trên 70.

challenge icon

Thử thách

Dễ

Hãy cùng xây dựng một nền tảng học trực tuyến quản lý các khóa học, học viên và việc đăng ký! Thử thách này kết hợp mọi điều bạn đã học về lập trình hướng đối tượng (OOP): lớp, kế thừa, giao diện, tính đóng gói và các dịch vụ phối hợp với nhau trong một kiến trúc rõ ràng.

Bạn sẽ sắp xếp code trong năm tệp:

  • Lesson.cs: Tạo lớp Lesson trong không gian tên ELearning.Models. Mỗi bài học có thuộc tính chỉ đọc Title (string) và DurationMinutes (int), được thiết lập thông qua hàm khởi tạo.
  • Course.cs: Tạo lớp Course trong không gian tên ELearning.Models. Một khóa học có các thuộc tính chỉ đọc Id (string), Title (string) và Instructor (string), cùng với danh sách Lessons. Thêm phương thức AddLesson(Lesson lesson) và thuộc tính chỉ đọc TotalDuration để tính tổng thời lượng của tất cả bài học.
  • Student.cs: Tạo lớp Student trong không gian tên ELearning.Models, với các thuộc tính chỉ đọc Id (int) và Name (string). Học viên theo dõi tiến độ của mình bằng một từ điển riêng tư, ánh xạ ID khóa học sang số bài học đã hoàn thành. Thêm các phương thức CompleteLesson(string courseId) để tăng tiến độ và GetProgress(string courseId) để trả về số bài học đã hoàn thành (hoặc 0 nếu chưa đăng ký).
  • EnrollmentService.cs: Tạo lớp EnrollmentService trong không gian tên ELearning.Services. Dịch vụ này quản lý khóa học và việc đăng ký bằng các tập hợp riêng tư. Triển khai:
    • AddCourse(Course course): thêm khóa học vào nền tảng
    • Enroll(Student student, string courseId): trả về true nếu đăng ký thành công, false nếu khóa học không tồn tại hoặc học viên đã đăng ký
    • GetEnrolledCourses(Student student): trả về danh sách ID của các khóa học mà học viên đã đăng ký
    • GetCourse(string courseId): trả về khóa học hoặc null nếu không tìm thấy
  • Program.cs: Kết hợp mọi thứ bằng cách tạo khóa học kèm bài học, đăng ký học viên, theo dõi tiến độ và hiển thị kết quả dựa trên đầu vào.

Bạn sẽ nhận các đầu vào sau:

  • Số khóa học cần tạo
  • Với mỗi khóa học: ID, tiêu đề, giảng viên, số bài học, sau đó với mỗi bài học: tiêu đề và thời lượng (phút)
  • ID và tên học viên
  • Số thao tác cần thực hiện
  • Với mỗi thao tác: hành động (enroll, complete, progress hoặc info), theo sau là ID khóa học

Định dạng đầu ra:

  • enroll: In ra Enrolled in: {CourseTitle} hoặc Enrollment failed: {courseId}
  • complete: In ra Completed lesson in {CourseTitle} (tăng tiến độ thêm 1)
  • progress: In ra {CourseTitle}: {completed}/{total} lessons
  • info: In ra {CourseTitle} by {Instructor} - {TotalDuration} minutes

Ví dụ, nếu đầu vào là:

2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999

Đầu ra sẽ là:

Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999

Lưu ý cách dịch vụ quản lý mối quan hệ giữa học viên và khóa học, trong khi mỗi lớp đảm nhận trách nhiệm riêng. Học viên tự theo dõi tiến độ, khóa học tính tổng thời lượng, còn dịch vụ đăng ký điều phối mọi thứ: đó là sự phân tách trách nhiệm rõ ràng!

Tự làm thử

using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;

class Program
{
    public static void Main(string[] args)
    {
        // Đọc số lượng khóa học
        int numCourses = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Tạo một instance của EnrollmentService
        
        // TODO: Đọc dữ liệu và tạo từng khóa học cùng các bài học
        // Với mỗi khóa học: đọc ID, tiêu đề, giảng viên và số lượng bài học
        // Với mỗi bài học: đọc tiêu đề và thời lượng
        // Thêm các bài học vào khóa học, rồi thêm khóa học vào dịch vụ
        
        // Đọc thông tin học viên
        int studentId = Convert.ToInt32(Console.ReadLine());
        string studentName = Console.ReadLine();
        
        // TODO: Tạo một instance của Student
        
        // Đọc số lượng thao tác
        int numOperations = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Xử lý từng thao tác
        // Với mỗi thao tác: đọc hành động và courseId
        // Xử lý: enroll, complete, progress, info
        // In ra thông báo phù hợp với thao tác
    }
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C# online