Menu
CoddyTech

Ôn tập: hồ sơ học sinh

Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 35 trên 70.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống lưu trữ hồ sơ học sinh, kết hợp tất cả các kỹ thuật đóng gói mà bạn đã học trong chương này. Bạn sẽ tạo một hệ thống bảo mật, trong đó dữ liệu học sinh được bảo vệ đúng cách, điểm số được xác thực và một số thông tin không thể thay đổi sau khi khởi tạo.

Bạn sẽ sắp xếp code trong hai tệp:

  • Student.cs: Tạo một lớp Student trong không gian tên Records để thể hiện cách đóng gói đúng. Lớp học sinh của bạn cần có:
    • Một trường readonly Name (chuỗi) có thể được truy cập công khai nhưng chỉ có thể được gán giá trị khi khởi tạo
    • Một trường readonly riêng tư lưu mã học sinh (chuỗi), không thể truy cập trực tiếp từ bên ngoài
    • Một danh sách riêng tư để lưu điểm số (số nguyên)
    • Một thuộc tính chỉ đọc công khai Average để tính và trả về điểm trung bình của tất cả điểm số, hoặc 0 nếu chưa có điểm nào
    • Một phương thức công khai AddGrade(int grade) chỉ chấp nhận điểm từ 0 đến 100 (bao gồm cả hai giá trị này), điểm không hợp lệ sẽ bị bỏ qua mà không thông báo
    • Một phương thức công khai GetGradeCount() trả về số điểm hợp lệ đã được ghi nhận
    • Một phương thức công khai GetStudentInfo() trả về một chuỗi theo định dạng "{Name} (ID: {last 4 characters of student ID})", hãy chú ý rằng bạn chỉ để lộ phiên bản đã che của mã học sinh!
    Hàm khởi tạo cần nhận tên và mã học sinh theo thứ tự đó.
  • Program.cs: Trong tệp chính, hãy tạo một học sinh và thêm một vài điểm để minh họa cách tính đóng gói hoạt động. Bạn sẽ cho thấy điểm hợp lệ được chấp nhận, điểm không hợp lệ bị từ chối và điểm trung bình được tính chính xác.

Bạn sẽ nhận năm đầu vào:

  • Tên học sinh
  • Mã học sinh (ít nhất 4 ký tự)
  • Điểm thứ nhất cần thêm (số nguyên)
  • Điểm thứ hai cần thêm (số nguyên, có thể không hợp lệ như -5 hoặc 150)
  • Điểm thứ ba cần thêm (số nguyên)

In ra kết quả theo định dạng này:

{GetStudentInfo() result}
Grades recorded: {GetGradeCount()}
Average: {Average}

Ví dụ: nếu đầu vào là Emma Wilson, STU12345, 85, 150 và 90, kết quả sẽ là:

Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5

Hãy chú ý rằng điểm không hợp lệ 150 đã bị bỏ qua mà không thông báo, nên chỉ có hai điểm được ghi nhận. Mã học sinh được bảo vệ, code bên ngoài không thể xem toàn bộ mã, mà chỉ thấy phiên bản đã che thông qua GetStudentInfo(). Tên có thể đọc được nhưng không thể thay đổi. Đây là cách tính đóng gói phối hợp để tạo nên một lớp vững chắc và được bảo vệ tốt!

Tự làm thử

using System;
using Records;

class Program
{
    public static void Main(string[] args)
    {
        // Đọc dữ liệu đầu vào
        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: Tạo đối tượng Student với name và studentId

        // TODO: Thêm cả ba điểm bằng phương thức AddGrade

        // TODO: In đầu ra theo định dạng yêu cầu:
        // {kết quả của GetStudentInfo()}
        // Grades recorded: {GetGradeCount()}
        // Trung bình: {Average}
    }
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C# online