回顾:学生记录
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 51 课,共 107 课。
挑战
简单让我们构建一个学生档案系统,展示如何正确封装数据。你将创建一个学生管理结构,在保护敏感学业数据的同时,通过设计良好的方法提供受控访问。
你将把代码分到两个文件中:
student.go:创建一个Student结构体,在公开安全数据的同时保护敏感信息。学生的Name应该是导出的(可公开访问),但grade(float64)和studentID(string)应该是未导出的,以保护这些敏感信息。实现以下内容:
- 构造函数
NewStudent(name, id string, initialGrade float64) *Student,用于创建学生。只有当初始成绩在 0 到 100 之间(含 0 和 100)时,才设置该成绩;否则,默认设为 0。 - 获取方法
Grade() float64,用于返回当前成绩 - 获取方法
StudentID() string,用于返回学生 ID - 设置方法
SetGrade(newGrade float64) bool,只有当新值在 0 到 100 之间(含 0 和 100)时,才更新成绩。如果成绩已更新,则返回true;否则返回false。 - 方法
Summary() string,用于返回以下格式:[Name] (ID: [studentID]) - Grade: [grade]
- 构造函数
main.go:从输入中读取学生信息,使用构造函数创建学生,然后执行成绩操作。创建学生后,以及每次尝试更新成绩后,都显示学生摘要。
将提供以下输入:
- 第 1 行:学生姓名
- 第 2 行:学生 ID
- 第 3 行:初始成绩
- 第 4 行:要设置的第一个新成绩
- 第 5 行:要设置的第二个新成绩
创建学生后,打印其摘要。然后尝试更新每个成绩,如果更新成功,就打印更新后的摘要;如果更新被拒绝,就打印 Invalid grade rejected。所有成绩值都保留两位小数。
例如,给定 Emma Wilson、STU001、85.5、92.0 和 150,你的输出应为:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejected最后一次更新失败,因为 150 超出了有效范围。你的设置方法会强制执行这一规则,确保学生数据有效。注意,studentID 和 grade 无法直接访问:外部代码必须使用你的获取方法和设置方法来访问这些受保护的数据。
亲手试试
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 读取学生姓名
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// 读取学生 ID
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// 读取初始成绩
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// 读取第一个新成绩
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// 读取第二个新成绩
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: 使用 NewStudent 构造函数创建一个新学生
// TODO: 创建后输出该学生的摘要
// TODO: 尝试第一次更新成绩
// 如果成功,输出更新后的摘要
// 如果被拒绝,输出 "Invalid grade rejected"
// TODO: 尝试第二次更新成绩
// 如果成功,输出更新后的摘要
// 如果被拒绝,输出 "Invalid grade rejected"
// 提示:在 Summary() 中使用 fmt.Sprintf 和 %.2f 格式化成绩
_ = newGrade1 // 使用这个变量时,删掉这一行
_ = newGrade2 // 使用这个变量时,删掉这一行
}
面向对象编程中的所有课
自己练习: Go 在线编译器