Menu
Coddy logo textTech

復習 - 学生記録システム

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 39/104。

カプセル化の知識を実践に活かす時間です!この課題では、アクセス指定子、情報隠蔽、ネストしたクラスの適切な使用を示す学生記録システムを構築します。

このシステムでは、次のカプセル化の原則に基づいて学生データを管理します。

  • 成績や学生 ID などの機密情報を保護するPrivate データメンバー
  • ゲッターと制御されたセッターを備えたPublic インターフェース
  • 個々のコースの成績を表し、この実装の詳細を学生クラス内に収めるネストしたクラス

実装する構造は次のとおりです。

class Student {
public:
    class Grade {    // コースの成績用のネストクラス
        // ...
    };
    
    // 学生データとやり取りするためのパブリックインターフェース
    
private:
    std::string name;
    int studentId;
    // 成績のコレクション
};

この課題では、この章で学んだすべての内容を組み合わせます。適切なアクセスレベルの選択、実装の詳細を明確なインターフェースの背後に隠すこと、そして関連する型を整理するためのネストしたクラスの使用です。何をアクセス可能にし、何を隠しておくべきかをよく考えてください。

challenge icon

チャレンジ

簡単

カプセル化について学んだすべてを組み合わせた Student Records System を構築しましょう。学生データが適切に保護され、成績がネストされたクラスを通じて管理され、すべての操作が整理された public インターフェースを介して行われるシステムを作成します。

コードを整理するために、次の2つのファイルを作成します。

  • Student.h: ネストされた Grade class による適切なカプセル化を示す Student class を Define します。

    Student の public セクションで宣言するネストされた Grade class は、course name(string)と score(double)を保存する必要があります。両方の値を受け取る constructor を用意し、データにアクセスするための getCourseName() および getScore() メソッドを提供してください。Grade class は Student の内部にネストされていてもデータを private に保ち、独自のカプセル化を維持します。

    Student class には、学生の name(string)、student ID(int)、および Grade ポインターの collection 用の private メンバーを持たせます。次の要素を提供してください。

    • name と student ID を受け取る constructor
    • Getters getName()getStudentId()(どちらも const)
    • 新しい Grade を作成して学生の記録に追加するメソッド addGrade(const std::string& course, double score)(score が 0 以上 100 以下の between の場合のみ追加)
    • すべての成績の Average を計算して返すメソッド getAverageGrade()(const)。成績が exist しない場合は 0.0 を返す
    • 学生の complete な記録を表示するメソッド displayRecord()(const)

    destructor では dynamically allocated された成績を clean することを忘れず、適切な header guards を include してください。

  • main.cpp: input から学生の name、student ID、および3つの course grades を読み取ります。input format は5行です。name、ID、その後にそれぞれ course name と score を space で区切って含む3行です(例: Math 95.5)。

    name と ID を使って Student を Create し、3つすべての成績を Add してから、complete な記録を Display します。

    displayRecord() の output format は次のとおりです。

    Student: <name> (ID: <id>)
    Grades:
      <course1>: <score1>
      <course2>: <score2>
      <course3>: <score3>
    Average: <average>

すべての score と Average を小数点以下1桁で format するために、<iomanip>std::fixedstd::setprecision(1) を使用します。ID は std::stoi() で convert し、score は std::stod() で convert します。

この challenge では、private data members、public getters、validation 付きの制御された setters、そして nested class を組み合わせ、適切にカプセル化された student records system を作成します。

自分で試してみよう

#include <iostream>
#include <string>
#include <sstream>
#include "Student.h"

int main() {
    // 学生名を読み取る
    std::string name;
    std::getline(std::cin, name);
    
    // 学生IDを読み取る
    std::string idStr;
    std::getline(std::cin, idStr);
    int studentId = std::stoi(idStr);
    
    // 3つのコース成績を読み取る(形式: "CourseName Score")
    std::string line1, line2, line3;
    std::getline(std::cin, line1);
    std::getline(std::cin, line2);
    std::getline(std::cin, line3);
    
    // TODO: 各行を解析してコース名とスコアを抽出する
    // std::stod() を使ってスコア文字列を double に変換する
    
    // TODO: 名前とIDで Student オブジェクトを作成する
    
    // TODO: 3つの成績すべてを学生に追加する
    
    // TODO: 完全な学生記録を表示する
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ