復習 - 学生記録システム
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 39/104。
カプセル化の知識を実践に活かす時間です!この課題では、アクセス指定子、情報隠蔽、ネストしたクラスの適切な使用を示す学生記録システムを構築します。
このシステムでは、次のカプセル化の原則に基づいて学生データを管理します。
- 成績や学生 ID などの機密情報を保護するPrivate データメンバー
- ゲッターと制御されたセッターを備えたPublic インターフェース
- 個々のコースの成績を表し、この実装の詳細を学生クラス内に収めるネストしたクラス
実装する構造は次のとおりです。
class Student {
public:
class Grade { // コースの成績用のネストクラス
// ...
};
// 学生データとやり取りするためのパブリックインターフェース
private:
std::string name;
int studentId;
// 成績のコレクション
};この課題では、この章で学んだすべての内容を組み合わせます。適切なアクセスレベルの選択、実装の詳細を明確なインターフェースの背後に隠すこと、そして関連する型を整理するためのネストしたクラスの使用です。何をアクセス可能にし、何を隠しておくべきかをよく考えてください。
チャレンジ
簡単カプセル化について学んだすべてを組み合わせた Student Records System を構築しましょう。学生データが適切に保護され、成績がネストされたクラスを通じて管理され、すべての操作が整理された public インターフェースを介して行われるシステムを作成します。
コードを整理するために、次の2つのファイルを作成します。
Student.h: ネストされたGradeclass による適切なカプセル化を示すStudentclass を Define します。Studentの public セクションで宣言するネストされたGradeclass は、course name(string)と score(double)を保存する必要があります。両方の値を受け取る constructor を用意し、データにアクセスするためのgetCourseName()およびgetScore()メソッドを提供してください。Gradeclass はStudentの内部にネストされていてもデータを private に保ち、独自のカプセル化を維持します。Studentclass には、学生の 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::fixed と std::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;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ