在线学习平台
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 68 课,共 70 课。
挑战
简单让我们构建一个管理课程、学生和选课信息的在线学习平台!这个挑战会综合运用你学过的所有面向对象编程(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;课程不存在或学生已选课时返回falseGetEnrolledCourses(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} lessonsinfo:输出{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# 在线编译器