アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2017年12月27日

《その209》 問題演習 p.235演習6-2


 今回も、前回《208》の続きの演習問題です。

新版明解C++中級編 p.235 演習6-2
 前回《208》の 演習6-1 で作成したクラスを含め、すべての図形クラス群をテストするプログラムを作成せよ。ただし、各図形の寸法は、キーボードから読み込むようにすること。


// Shape.h-----------------------------
#ifndef ___Class_Shape
#define ___Class_Shape

#include <string>
#include <sstream>
#include <iostream>

// 図形クラス(抽象クラス)
class Shape {
public:
virtual ~Shape() = 0;

// コピー作製
virtual Shape* clone() const = 0;

// 図形出力
virtual void draw() const = 0;

// 出力用文字列作成
virtual std::string to_string() const = 0;

// to_string() の返却値出力 と draw()による図形出力
void print() const {
std::cout << to_string() << '\n';
draw();
}

// デバッグ用情報表示
virtual void debug() const;
};

inline Shape::~Shape() { }

inline void Shape::debug() const
{
std::cout << "-- デバッグ情報 --\n";
std::cout << "型 : " << typeid(*this).name() << '\n';
std::cout << "アドレス : " << this << '\n';
std::cout << "------------------\n";
}


// 点クラス
class Point : public Shape {
public:
void draw() const {
std::cout << "*\n";
}

Point* clone() const {
return new Point;
}

std::string to_string() const {
return "Point";
}

void debug() const {
Shape::debug();
}
};


// 直線クラス(抽象クラス)
class Line : public Shape {
protected:
int length;

public:
Line(int len) : length(len) { }

int get_length() const { return length; }

void set_length(int len) { length = len; }
};


// 横直線クラス
class HorzLine : public Line {
public:
HorzLine(int len) : Line(len) { }

HorzLine* clone() const {
return new HorzLine(length);
}

void draw() const {
for (int i = 1; i <= length; i++)
std::cout << '-';
std::cout << '\n';
}

std::string to_string() const {
std::ostringstream os;
os << "HorzLine(length:" << length << ")";
return os.str();
}
};


// 縦直線クラス
class VertLine : public Line {
public:
VertLine(int len) : Line(len) { }

VertLine* clone() const {
return new VertLine(length);
}

void draw() const {
for (int i = 1; i <= length; i++)
std::cout << "|\n";
}

std::string to_string() const {
std::ostringstream os;
os << "VertLine(length:" << length << ")";
return os.str();
}
};


// 長方形クラス
class Rectangle : public Shape {
int width;
int height;

public:
Rectangle(int w, int h)
: width(w), height(h) { }

Rectangle* clone() const {
return new Rectangle(width, height);
}

void draw() const {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++)
std::cout << '*';
std::cout << '\n';
}
}

std::string to_string() const {
std::ostringstream os;
os << "Rectangle(width:" << width
<< ", height:" << height << ")";
return os.str();
}
};


// 直角二等辺三角形クラス(抽象クラス)
class R_angl_triangle
: public Shape {
protected:
int length;

public:
R_angl_triangle(int len) : length(len) { }

int get_length() const { return length; }

void set_length(int len) { length = len; }
};


// 左下直角の三角形
class R_angl_l_under :
public R_angl_triangle {
public:
R_angl_l_under(int len)
: R_angl_triangle(len) { }

R_angl_l_under* clone() const {
return new R_angl_l_under(length);
}

void draw() const {
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= i; j++)
std::cout << '*';
std::cout << '\n';
}
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_l_under(length:"
<< length << ")";
return os.str();
}
};


// 左上直角の三角形
class R_angl_l_upper
: public R_angl_triangle {
public:
R_angl_l_upper(int len)
: R_angl_triangle(len) { }

R_angl_l_under* clone() const {
return new R_angl_l_under(length);
}

void draw() const {
for (int i = length; i >= 1; i--) {
for (int j = 1; j <= i; j++)
std::cout << '*';
std::cout << '\n';
}
std::cout << '\n';
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_l_upper(length:"
<< length << ")";
return os.str();
}
};


// 右下直角の三角形
class R_angl_r_under
: public R_angl_triangle {
public:
R_angl_r_under(int len)
: R_angl_triangle(len) { }

R_angl_r_under* clone() const {
return new R_angl_r_under(length);
}

void draw() const {
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= length - i; j++)
std::cout << ' ';
for (int j = 1; j <= i; j++)
std::cout << '*';
std::cout << '\n';
}
std::cout << '\n';
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_r_under(length:"
<< length << ")";
return os.str();
}
};


// 右上直角の三角形
class R_angl_r_upper
: public R_angl_triangle {
public:
R_angl_r_upper(int len)
: R_angl_triangle(len) { }

R_angl_r_upper* clone() const {
return new R_angl_r_upper(length);
}

void draw() const {
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= i - 1; j++)
std::cout << ' ';
for (int j = 1; j <= length - i + 1; j++)
std::cout << '*';
std::cout << '\n';
}
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_r_upper(length:"
<< length << ")";
return os.str();
}
};


// 挿入子「 << 」の多重定義
inline std::ostream& operator<<(
std::ostream& os,
const Shape& s
)
{
return os << s.to_string();
}

#endif
// ------------------------------------

// ShapeTest.cpp-----------------------
#include <iostream>
#include "Shape.h"

using namespace std;

int main() {
int x1, x2, x3, x4, x5;
cout << "次の寸法を入力してください。\n"
" ・横直線の長さ\n"
" ・縦直線の長さ\n"
" ・長方形の横幅・高さ\n"
" ・直角二等辺三角形の直角をはさむ辺の長さ\n\n";
cout << " 入力・横直線の長さ : "; cin >> x1;
cout << " 入力・縦直線の長さ : "; cin >> x2;
cout << " 入力・長方形の横幅 : "; cin >> x3;
cout << " 入力・ 高さ : "; cin >> x4;
cout << " 入力・直角二等辺三角形の直角をはさむ"
"辺の長さ : "; cin >> x5;

Shape* a[] = {
new Point(),
new HorzLine(x1),
new VertLine(x2),
new Rectangle(x3, x4),
new R_angl_l_under(x5),
new R_angl_l_upper(x5),
new R_angl_r_under(x5),
new R_angl_r_upper(x5),
};

for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
cout << "\n◆ "<< i + 1 << ".\n";
a[i]->print();
a[i]->debug();
cout << '\n';
}

for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
delete a[i];
}
// ------------------------------------

f06_02.png



新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





《その208》 問題演習 p.235演習6-1


 以下は、今回の演習問題の課題となる図形クラス群です。
  ・図形クラス(抽象クラス) Shape
から派生した
  ・点クラス Point
  ・直線クラス(抽象クラス) Line
  ・長方形クラス Rectangle
さらに、直線クラス(抽象クラス) Line から派生した
  ・横線クラス HorzLine
  ・縦線クラス VertLine
で、構成されています。


// ------------------------------------
#ifndef ___Class_Shape
#define ___Class_Shape

#include <string>
#include <sstream>
#include <iostream>

// 図形クラス(抽象クラス)
class Shape {
public:
virtual ~Shape() = 0;

// コピー作製
virtual Shape* clone() const = 0;

// 図形出力
virtual void draw() const = 0;

// 出力用文字列作成
virtual std::string to_string() const = 0;

// to_string() の返却値出力 と draw()による図形出力
void print() const {
std::cout << to_string() << '\n';
draw();
}

// デバッグ用情報表示
virtual void debug() const = 0;
};

inline Shape::~Shape() { }

inline void Shape::debug() const
{
std::cout << "-- デバッグ情報 --\n";
std::cout << "型 : " << typeid(*this).name() << '\n';
std::cout << "アドレス : " << this << '\n';
}


// 点クラス
class Point : public Shape {
public:
void draw() const {
std::cout << "*\n";
}

Point* clone() const {
return new Point;
}

std::string to_string() const {
return "Point";
}

void debug() const {
Shape::debug();
}
};


// 直線クラス(抽象クラス)
class Line : public Shape {
protected:
int length; // 長さ

public:
Line(int len) : length(len) { }

int get_length() const { return length; }

void set_length(int len) { length = len; }

void debug() const {
Shape::debug();
std::cout << "長さ : " << length << '\n';
}
};


// 横直線クラス
class HorzLine : public Line {
public:
HorzLine(int len) : Line(len) { }

virtual HorzLine* clone() const {
return new HorzLine(length);
}

void draw() const {
for (int i = 1; i <= length; i++)
std::cout << '-';
std::cout << '\n';
}

std::string to_string() const {
std::ostringstream os;
os << "HorzLine(length:" << length << ")";
return os.str();
}
};


// 縦直線クラス
class VertLine : public Line {
public:
VertLine(int len) : Line(len) { }

virtual VertLine* clone() const {
return new VertLine(length);
}

void draw() const {
for (int i = 1; i <= length; i++)
std::cout << "|\n";
}

std::string to_string() const {
std::ostringstream os;
os << "VertLine(length:" << length << ")";
return os.str();
}
};


// 長方形クラス
class Rectangle : public Shape {
int width; // 横幅
int height; // 高さ

public:
Rectangle(int w, int h)
: width(w), height(h) { }

Rectangle* clone() const {
return new Rectangle(width, height);
}

void draw() const {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++)
std::cout << '*';
std::cout << '\n';
}
}

std::string to_string() const {
std::ostringstream os;
os << "Rectangle(width:" << width
<< ", height:" << height << ")";
return os.str();
}

void debug() const {
Shape::debug();
std::cout << "横幅 : " << width << '\n';
std::cout << "高さ : " << height << '\n';
}
};


// 挿入子「 << 」の多重定義
inline std::ostream& operator<<(
std::ostream& os,
const Shape& s
)
{
return os << s.to_string();
}

#endif
// ------------------------------------




新版明解C++中級編 p.235 演習6-1
 上記の図形クラス群に対して、直角二等辺三角形を表すクラス群を追加せよ。左下が直角のもの、左上が直角のもの、右下が直角のもの、右上が直角のものを追加すること。直角二等辺三角形を表す抽象クラスを作り、そこから個々のクラスを派生して作ること。

 以下が、解答のクラス群です。
  ・直角二等辺三角形クラス(抽象クラス) R_angl_triangle
と、この抽象クラスから派生した
  ・左下が直角の直角二等辺三角形クラス R_angl_l_under
  ・左上が直角の直角二等辺三角形クラス R_angl_l_upper
  ・右下が直角の直角二等辺三角形クラス R_angl_r_under
  ・右上が直角の直角二等辺三角形クラス R_angl_r_upper
の構成です。


// 直角二等辺三角形クラス(抽象クラス)
class R_angl_triangle
: public Shape {
protected:
int length; // 直角をはさむ辺の長さ

public:
R_angl_triangle(int len) : length(len) { }

int get_length() const { return length; }

void set_length(int len) { length = len; }

void debug() const {
Shape::debug();
std::cout << "length : "
<< length << '\n';
}
};


// 左下直角の三角形
class R_angl_l_under :
public R_angl_triangle {
public:
R_angl_l_under(int len)
: R_angl_triangle(len) { }

virtual R_angl_l_under* clone() const {
return new R_angl_l_under(length);
}

void draw() const {
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= i; j++)
std::cout << '*';
std::cout << '\n';
}
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_l_under(length:"
<< length << ")";
return os.str();
}
};


// 左上直角の三角形
class R_angl_l_upper
: public R_angl_triangle {
public:
R_angl_l_upper(int len)
: R_angl_triangle(len) { }

virtual R_angl_l_under* clone() const {
return new R_angl_l_under(length);
}

void draw() const {
for (int i = length; i >= 1; i--) {
for (int j = 1; j <= i; j++)
std::cout << '*';
std::cout << '\n';
}
std::cout << '\n';
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_l_upper(length:"
<< length << ")";
return os.str();
}
};


// 右下直角の三角形
class R_angl_r_under
: public R_angl_triangle {
public:
R_angl_r_under(int len)
: R_angl_triangle(len) { }

virtual R_angl_r_under* clone() const {
return new R_angl_r_under(length);
}

void draw() const {
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= length - i; j++)
std::cout << ' ';
for (int j = 1; j <= i; j++)
std::cout << '*';
std::cout << '\n';
}
std::cout << '\n';
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_r_under(length:"
<< length << ")";
return os.str();
}
};


// 右上直角の三角形
class R_angl_r_upper
: public R_angl_triangle {
public:
R_angl_r_upper(int len)
: R_angl_triangle(len) { }

virtual R_angl_r_upper* clone() const {
return new R_angl_r_upper(length);
}

void draw() const {
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= i - 1; j++)
std::cout << ' ';
for (int j = 1; j <= length - i + 1; j++)
std::cout << '*';
std::cout << '\n';
}
}

std::string to_string() const {
std::ostringstream os;
os << "R_angl_r_upper(length:"
<< length << ")";
return os.str();
}
};



新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)






 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2017年12月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。