Menu
CoddyTech

复习:学生记录

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

challenge icon

挑战

简单

让我们构建一个学生档案系统,把你在本章学到的所有封装技巧结合起来。你将创建一个安全的系统,妥善保护学生数据、验证成绩,并确保某些信息在创建后保持不可变。

你将把代码分布在两个文件中:

  • 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!
    构造函数应按顺序接收姓名和学生 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# 在线编译器