复习:学生记录
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 35 课,共 70 课。
挑战
简单让我们构建一个学生档案系统,把你在本章学到的所有封装技巧结合起来。你将创建一个安全的系统,妥善保护学生数据、验证成绩,并确保某些信息在创建后保持不可变。
你将把代码分布在两个文件中:
Student.cs:在Records命名空间中创建一个Student类,展示正确的封装方式。你的学生对象应包含:- 一个
readonly字段Name(字符串),可公开访问,但只能在构造时设置 - 一个私有的
readonly字段,用于存储学生 ID(字符串),外部代码绝不能直接访问它 - 一个用于存储成绩(整数)的私有列表
- 一个公有只读属性
Average,用于计算并返回所有成绩的平均值;如果没有成绩,则返回0 - 一个公有方法
AddGrade(int grade),只接受 0 到 100(含边界值)之间的成绩,无效成绩应被静默忽略 - 一个公有方法
GetGradeCount(),返回已记录的有效成绩数量 - 一个公有方法
GetStudentInfo(),返回一个符合以下格式的字符串:"{Name} (ID: {last 4 characters of student ID})"。注意,你只公开了经过掩码处理的 ID!
- 一个
Program.cs:在主文件中创建一个学生并添加几项成绩,以展示封装的工作方式。你将展示有效成绩会被接受、无效成绩会被拒绝,并且平均值计算正确。
你会收到五个输入:
- 学生姓名
- 学生 ID(至少 4 个字符)
- 要添加的第一项成绩(整数)
- 要添加的第二项成绩(整数,可能是 -5 或 150 这样的无效成绩)
- 要添加的第三项成绩(整数)
按以下格式打印输出:
{GetStudentInfo() result}
Grades recorded: {GetGradeCount()}
Average: {Average}例如,如果输入是 Emma Wilson、STU12345、85、150 和 90,输出应为:
Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5注意,无效成绩 150 被静默拒绝了,因此只记录了两项成绩。学生 ID 受到保护,外部代码无法看到完整 ID,只能通过 GetStudentInfo() 查看经过掩码处理的版本。姓名可以读取,但不可变。这就是封装协同工作,创建出健壮且受到良好保护的类!
亲手试试
using System;
using Records;
class Program
{
public static void Main(string[] args)
{
// 读取输入
string name = Console.ReadLine();
string studentId = Console.ReadLine();
int grade1 = Convert.ToInt32(Console.ReadLine());
int grade2 = Convert.ToInt32(Console.ReadLine());
int grade3 = Convert.ToInt32(Console.ReadLine());
// TODO: 用 name 和 studentId 创建一个 Student 对象
// TODO: 使用 AddGrade 方法添加全部三个成绩
// TODO: 按要求的格式打印输出:
// {GetStudentInfo() 的结果}
// Grades recorded: {GetGradeCount()}
// Average: {Average}
}
}
面向对象编程中的所有课
自己练习: C# 在线编译器