C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① Studentクラスと Score入れ子クラスの例を拡張して、その生徒の各学期末(1学期、2学期、3学期)の成績を管理するようにしてください。各教科の得点は、以下のように与えられているものとします。
const Student::Score SCORES[] = {
::Score(90, 60, 71),
Student::Score(84, 70, 65),
Student::Score(92, 67, 73),
Student};
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))
class Student {
public:
class Score {
public:
(int japanese, int math, int english);
Score
public:
int GetAverage() const;
private:
enum Subject {
,
SUBJECT_JAPANESE,
SUBJECT_MATH,
SUBJECT_ENGLISH
, // 総数を表すダミー
SUBJECT_NUM};
private:
int mScores[SUBJECT_NUM];
};
typedef std::vector<Score> Scores_t;
static const int SCORE_DATA_NUM = 3;
public:
(const std::string& name, const Scores_t& scores) :
Student(name),
mName(scores)
mScores{
assert(mScores.size() == SCORE_DATA_NUM);
}
public:
inline const std::string& GetName() const
{
return mName;
}
inline const Score& GetScore(int term) const
{
assert(0 <= term && term < SCORE_DATA_NUM);
return mScores[term];
}
private:
const std::string mName;
const Scores_t mScores;
};
::Score::Score(int japanese, int math, int english)
Student{
[SUBJECT_JAPANESE] = japanese;
mScores[SUBJECT_MATH] = math;
mScores[SUBJECT_ENGLISH] = english;
mScores}
int Student::Score::GetAverage() const
{
int sum = 0;
for (int i = 0; i < SIZE_OF_ARRAY(mScores); ++i) {
+= mScores[i];
sum }
return sum / SIZE_OF_ARRAY(mScores);
}
int main()
{
const Student::Score SCORES[Student::SCORE_DATA_NUM] = {
::Score(90, 60, 71),
Student::Score(84, 70, 65),
Student::Score(92, 67, 73),
Student};
("Tanaka Miki", Student::Scores_t(SCORES, SCORES + Student::SCORE_DATA_NUM));
Student student
std::cout << "Name: " << student.GetName() << "\n"
<< " 1st term Average: " << student.GetScore(0).GetAverage() << "\n"
<< " 2nd term Average: " << student.GetScore(1).GetAverage() << "\n"
<< " 3rd term Average: " << student.GetScore(2).GetAverage() << std::endl;
}
実行結果:
Name: Tanaka Miki
1st term Average: 73
2nd term Average: 73
3rd term Average: 77
Studentクラスの mScore を拡張して、3学期分のデータを保持できるようにする必要があります。生の配列でも構いませんが、今回は vector(【標準ライブラリ】第5章)を使用しました(STLコンテナを積極的に使ってみることをします)。
問題② Printerローカルクラスの例を変形して、ローカル関数のような使い方をするプログラムを作成してください。
ローカルクラスに、staticメンバ関数を持たせれば簡単です。
#include <iostream>
int main()
{
class Printer {
public:
static void Puts(const char* str, const char* begin = "", const char* end = "")
{
std::cout << begin << str << end << std::endl;
}
};
::Puts("Test Message1");
Printer::Puts("Test Message2", "[[", "]]");
Printer::Puts("Test Message3", "[[", "]]");
Printer}
実行結果:
Test Message1
[[Test Message2]]
[[Test Message3]]
サイト全体で表記を統一(「静的メンバ」–>「staticメンバ」)
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |