# 实验二-学生选课模拟系统
#### 实验目的
- 初步了解分析系统需求,从学生选课角度了解系统中的实体及其关系,学会定义类中的属性以及方法;
- 掌握面向对象的类设计方法(属性、方法);
- 掌握通过构造方法实例化对象;
#### 业务要求
学校人员分为“教师”和“学生”,教师教授“课程”,学生选择“课程”。初期为了设计简单,每名教师讲1门课程,每名学生选1门课程。
对象:
1. 教师(编号、姓名、性别、所授课程)
2. 学生(编号、姓名、性别、所选课程)
3. 这里是列表文本课程(编号、课程名称、上课地点、时间)
#### 解题思路
1. 首先,定义Teacher类,包含教师的ID、姓名、性别和所教授的课程名称。可以使用构造方法初始化教师的信息,并提供一个teachCourse()方法,用于打印教师开设课程的信息。
2. 然后,定义Student类,包含学生的ID、姓名、性别和所选的课程名称。可以使用构造方法初始化学生的信息,并提供一个selectCourse()方法,用于选择课程并将选课信息打印出来;还有一个dropCourse()方法,用于退选课程并打印退选的课程信息;以及一个getSelectedCourse()方法,用于获取学生当前选课的信息。
3. 接下来,定义Course类,包含课程的ID、名称、上课地点和时间。可以使用构造方法初始化课程的信息,并提供一个getCourseInfo()方法,用于获取课程的详细信息。
4. 最后,定义Selection类作为程序的入口,在main()方法中实例化两个教师对象、两个学生对象和两个课程对象。然后模拟教师开设课程、学生选课和退课的过程,并打印学生的课表信息。
#### 实验步骤
1. 在Teacher类中定义教师的属性(ID、姓名、性别和所教授的课程名称),并提供构造方法进行初始化。在teachCourse()方法中,打印教师开设课程的信息。
2. 在Student类中定义学生的属性(ID、姓名、性别和所选的课程名称),并提供构造方法进行初始化。在selectCourse()方法中,将选课信息保存到selectedCourse属性中,并打印选课信息;在dropCourse()方法中,将selectedCourse属性置为null,并打印退选的课程信息;在getSelectedCourse()方法中,返回学生当前选课的信息。
3. 在Course类中定义课程的属性(ID、名称、上课地点和时间),并提供构造方法进行初始化。在getCourseInfo()方法中,返回课程的详信息。
4. 在Selection类中作为程序的入口,实例化两个教师对象、两个学生对象和两个课程对象。然后模拟教师开设课程、学生选课和退课的过程,并打印学生的课表信息。
#### 流程图
![输入图片说明](%E6%B5%81%E7%A8%8B%E5%9B%BE..png)
#### 关键代码
1. 用于学生选课,先将学生信息完整的传给selectCourse方法:
```
student1.selectCourse(mathCourse.getCourseInfo());
student2.selectCourse(englishCourse.getCourseInfo());
```
```
public String getCourseInfo() {
return "课程名称:" + courseName + ",上课地点:" + location + ",时间:" + time;
}
```
```
public void selectCourse(String courseName) {
selectedCourse = courseName;
System.out.println(name + selectedCourse );
}
```
2. 用于学生退课,将selectedCourse = null,用于之后打印信息的判断:
```
public void dropCourse() {
System.out.println(name + "退选了课程:" + selectedCourse);
selectedCourse = null;
}
```
3. 通过判断selectedCourse的值来打印学生的信息:
```
System.out.println("学生1课表信息:");
if (student1.getSelectedCourse() != null) {
System.out.println(student1.getSelectedCourse());
}
else {
System.out.println("未选择课程");
}
```
4. 联系起来老师对象和课程对象
```
public void teachCourse(Course course) {
System.out.println(name + "开授课程:" + course.getCourseInfo() );
}
```
```
teacher1.teachCourse(mathCourse);
teacher2.teachCourse(englishCourse);
```
#### 运行截图
![输入图片说明](%E8%BF%90%E8%A1%8C%E6%88%AA%E5%9B%BE.png)
#### 感想与体会
在本次实验中,我通过学生选课系统的设计和实现,获得了以下的总结和收获:
1. 系统需求分析能力:通过分析学校人员角色和其之间的关系,我能够更好地理解实际业务需求,并根据需求设计合适的类和对象。
2. 面向对象的类设计方法:通过定义教师、学生和课程这三个类,我学会了如何确定类的属性和方法,并且合理划分类的职责。
3. 属性和方法的定义:在类的设计过程中,我学会了如何选择适合的属性来描述对象的状态,以及如何定义方法来实现对象的行为和功能。
4. 构造方法的使用:通过使用构造方法来实例化对象,我能够在创建对象时为对象的属性进行初始化,提高代码的可读性和维护性。
5. 对象的作用和使用:学会通过创建对象来实现对数据和行为的封装和管理,从而更好地组织和管理代码。
通过本次实验,我掌握了面向对象编程的基本概念和设计方法,为以后更复杂的软件开发任务打下了坚实的基础。同时,本次实验也培养了我的逻辑思维和问题解决能力,通过分析和设计系统,提升了我的实际操作能力。总的来说,本次实验是一次很有价值的学习和实践机会。