Menu
CoddyTech

在线学习平台

本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 68 课,共 70 课。

challenge icon

挑战

简单

让我们构建一个管理课程、学生和选课信息的在线学习平台!这个挑战会综合运用你学过的所有面向对象编程(OOP)知识,包括类、继承、接口、封装,以及在整洁架构中协同工作的服务。

你需要将代码分为 5 个文件:

  • Lesson.cs:在 ELearning.Models 命名空间中创建一个 Lesson 类。每节课都有只读属性 Title(string)和 DurationMinutes(int),并通过构造函数设置。
  • Course.cs:在 ELearning.Models 命名空间中创建一个 Course 类。课程包含只读属性 Id(string)、Title(string)和 Instructor(string),以及一个 Lessons 列表。添加一个 AddLesson(Lesson lesson) 方法,以及一个只读属性 TotalDuration,用于计算所有课程时长的总和。
  • Student.cs:在 ELearning.Models 命名空间中创建一个 Student 类,包含只读属性 Id(int)和 Name(string)。学生通过一个私有字典跟踪学习进度,该字典将课程 ID 映射到已完成课程的数量。添加 CompleteLesson(string courseId) 方法来增加进度,并添加 GetProgress(string courseId) 方法来返回已完成课程的数量(如果未选课,则返回 0)。
  • EnrollmentService.cs:在 ELearning.Services 命名空间中创建一个 EnrollmentService 类。该服务使用私有集合管理课程和选课信息。实现以下方法:
    • AddCourse(Course course):将课程添加到平台
    • Enroll(Student student, string courseId):选课成功时返回 true;课程不存在或学生已选课时返回 false
    • GetEnrolledCourses(Student student):返回学生已选课程 ID 的列表
    • GetCourse(string courseId):返回课程;如果未找到,则返回 null
  • Program.cs:将所有内容整合起来,根据输入创建课程和课程内容、为学生选课、跟踪学习进度并显示结果。

你将收到以下输入:

  • 要创建的课程数量
  • 每门课程的信息:ID、标题、讲师、课程数量;然后是每节课的信息:标题和时长(分钟)
  • 学生 ID 和姓名
  • 要执行的操作数量
  • 每项操作的信息:操作(enroll、complete、progress 或 info),后跟课程 ID

输出格式:

  • enroll:输出 Enrolled in: {CourseTitle} 或 Enrollment failed: {courseId}
  • complete:输出 Completed lesson in {CourseTitle}(进度增加 1)
  • progress:输出 {CourseTitle}: {completed}/{total} lessons
  • info:输出 {CourseTitle} by {Instructor} - {TotalDuration} minutes

例如,如果输入为:

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

输出应为:

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

注意,服务负责管理学生与课程之间的关系,而每个类负责处理自己的职责。学生跟踪自己的学习进度,课程计算总时长,选课服务则协调所有工作。这种设计实现了清晰的职责分离!

亲手试试

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

class Program
{
    public static void Main(string[] args)
    {
        // 读取课程数量
        int numCourses = Convert.ToInt32(Console.ReadLine());
        
        // TODO: 创建一个 EnrollmentService 实例
        
        // TODO: 读取并创建每门课程及其课
        // 对每门课程:读取 ID、标题、讲师和课的数量
        // 对每节课:读取标题和时长
        // 将课添加到课程中,再将课程添加到服务中
        
        // 读取学生信息
        int studentId = Convert.ToInt32(Console.ReadLine());
        string studentName = Console.ReadLine();
        
        // TODO: 创建一个 Student 实例
        
        // 读取操作数量
        int numOperations = Convert.ToInt32(Console.ReadLine());
        
        // TODO: 处理每个操作
        // 对每个操作:读取动作和 courseId
        // 处理以下动作:enroll、complete、progress、info
        // 根据操作输出相应的消息
    }
}

面向对象编程中的所有课

自己练习: C# 在线编译器