私は今、C++を勉強していますが、読んでいる本に付いている練習問題がありました、私が自分でやりましたが、うまくいかないです、助けてほしいです。
 以下は問題です。
 一つの円の中に4点を交わるように1つの長方形を描き、次にこの長方形に内接するように1つの円を描いていくことを繰り返す操作を考える。
 この操作をモデル化にするとき、どうすればいいでしょうか?
 よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

やや揚げ足取りの回答と取られかねないですが、No.2の方の回答はオブジェクトっぽく


ないです。「円」と「長方形」がクラスになっている、というのは納得できるんです
が、極かぎられた情報(内接する図形)が属性になっている、というのはいただけない。

class 円 {
public:
  円(中心の座標, 半径);
  ~円();
  長方形 get内接する長方形() const;
};

class 長方形 {
public:
  長方形(ある角の座標, その対角の座標);
  ~長方形();
  円 get内接する円(パラメータがあるかも) const;
};

ってな感じ。

あるオブジェクトの属性は、そのオブジェクトの性質を表すものです。
「ある長方形に内接する円」というのは、どう考えても属性では無いです。


更に、図形が長方形と円しか無い世界を考えるのであれば、

class 図形 {
protected:
  図形();
  virtual 図形();
  virtual 図形* get内接する図形() const;
};

class 円 : public 図形 {
public:
  円(中心の座標, 半径);
  ~円();
  図形* get内接する図形() const;
};

class 長方形 : public 図形 {
public:
  長方形(ある角の座標, その対角の座標);
  ~長方形();
  図形* get内接する図形() const;
};

図形* shape = 最初の図形;
while(終了条件) {
  shape = shape->get内接する図形();
  図形の描画;
}

ってな感じにできるかと。

# ちなみに、円に内接する *長方形* は無限にあるので、それを特定する
# 条件を何か考えなければ行けないですね
    • good
    • 0

モデル化に絞ってアドバイスです。

円クラスが子供の矩形クラスを所有し矩形クラスが子供の円クラスを所有、さらにその円クラスが矩形クラスを所有する構造をモデル化すればよいのですよね。
C++は処理を細分化・部品化することが得意ですし、とても重要です。今回の例では、親の情報から自分自身を作って、そして自分自身をさらに子供に渡す。子供がどのようなロジックで自分自身を作るのかは親は感知しません。(処理の部品化)
もっと高度の概念では、virtualを使った仮想関数で継承をサポートしたりもできます。(進化(?)した別のロジックで、自身を作るクラスを定義するなど・・)


下記は、円が真円・矩形が正方形を前提とした単純なモデル化の例です。
解説:
各クラスのコンストラクタが親のクラスのポインタを引き継ぎます。その情報を基に自身の情報を決定していきます。これで、ルートクラスをたったひとつ作ってやるだけであとはクラスが勝手に子供を作っていきます(^^)。


class CYen;
class CSquare;
static long nNestCount = 0L; // 繰り返し回数
#define NSTCNT 10 // 繰り返し制限値


class CYen//円クラス
{
private:
doublem_d;// 直径
CSquare* m_pChild;// 子 正方形クラス
public:
double D() const {return m_d;}
protected:
virtual void MakeParam(const CSquare*);
public:
CYen(const double d);// 開始のコンストラクタ
CYen(const CSquare*);// コンストラクタ
virtual ~CYen();// デストラクタ
};

class CSquare// 正方形クラス
{
private:
doublem_w;// 辺
CYen* m_pChild;// 子 円クラス
public:
double W() const {return m_w;}
protected:
virtual void MakeParam(const CYen*);
public:
CSquare(const CYen*);// コンストラクタ
virtual ~CSquare();// デストラクタ
};

CYen::CYen(const double d) : m_pChild(NULL), m_d(d)
{
ASSERT(m_d > 0.0);

nNestCount++;
if(nNestCount >= NSTCNT)return;
m_pChild = new CSquare(this);
}

CYen::CYen(const CSquare* pParent) : m_pChild(NULL)
{
nNestCount++;
if(nNestCount >= NSTCNT)return;
MakeParam(pParent);// 自分の形状を親矩形クラスの情報から作成する
m_pChild = new CSquare(this);
}

CYen::~CYen()
{
if(m_pChild)delete (CSquare*)m_pChild;
}

void CYen::MakeParam(const CSquare* pParent)
{
m_d = pParent->W();// 正方形と仮定すると、一辺長 = 直径
ASSERT(m_d > 0.0);
}

CSquare::CSquare(const CYen* pParent) : m_pChild(NULL)
{
nNestCount++;
if(nNestCount >= NSTCNT)return;
MakeParam(pParent);// 自分の形状を親円クラスの情報から作成する
m_pChild = new CYen(this);
}

CSquare::~CSquare()
{
if(m_pChild)delete (CYen*) m_pChild;
}

void CSquare::MakeParam(const CYen* pParent)
{
// 前提条件:内接図形は正方形
m_w = pParent->D() * sin(atan(1.0));
}

int main(void)
{
CYen(100.0); // ルートクラス 直径100の円 を作る
}

すいません長くなりました。
参考になれば幸いです。ではがんばってください。
    • good
    • 0

プログラミングというより数学の問題みたいですね。



「以下は問題です。」の下の文は、練習問題の通り
なんでしょうか?何を求められているのか、
よくわかりません。

具体的には、以下の点が曖昧です。

1)「一つの円の中に4点を交わるように」とは、
円に内接するように、ということでしょうか?

そうだとすると、

2)「一つの円の中に4点を交わるように1つの
長方形を描き」というのは、円に内接する長方形を
描くことになります。ある円に内接する長方形という
のは無数に描けますが、どんな長方形をどんな向きで
描くのかはユーザが与えるんでしょうか?それとも
ランダム?

3)最初に円を与え、それに内接する長方形をユーザが与える
かランダムに決めるかして描けたとしましょう。すると、
さらにその長方形に内接する円も(この長方形が正方形で
ない限り)無数に描けますが、これはどうしましょう?
最初の円と同心円にしますか?

4)さらに、次に描いた円に内接する長方形も2)と同じ
理屈で無数に描けますが、一々ユーザが与えるんでしょうか?
それともランダムでしょうか?

…以下繰返し。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QC++にて、塗りつぶされた円を描くプログラムを描くにはどうすればいいで

C++にて、塗りつぶされた円を描くプログラムを描くにはどうすればいいでしょう?

Aベストアンサー

中心x0,y0、半径rの円を塗りつぶすには、いろいろと方法があると思います。
・ベタな方法
全座標(x,y)について、 (x-x0)*(x-x0)+(y-y0)*(y-y0) を計算、 <= r*r なら円の中なので色を付ける。
実際には、円に外接する正方形よりだけ確認すればよいで 、 x0-r<=x<=x0+r,y0-r<=y<=y0+rの範囲を調べる。

・y0-r<=y<=y0+r のyについて、dy = y - y0 とする。
dx=x-x0 とすると、r,dx,dyからなる直角三角形ができるので、値のわかっているr,dyからdxが求まる。
左右の座標がそれぞれ x0-dx,y と x0+dx,yになるので、その間に色を付ける。

・(塗りつぶさない)円をかくアルゴリズムをつかって、円を書く
→囲まれた領域を塗りつぶす方法(ペイントアルゴリズムと言われたりする)を使って、円の中を塗る。

QC++でコマンドプロンプトに図形を描くプログラム

コマンドプロンプトで長方形を描くプログラムがわかりません。
長方形の4点(x1,y1),(x2,y2),(x3,y3),(x4,y4)の座標を保存してから、長方形の外周と中身を
それぞれ適当な文字で埋めて長方形の絵を作るプログラムなのですが、
どうすれば指定した座標に好きな文字をコマンドプロンプトで表示できるのでしょうか?
私の知識ではprintfを使ってスペースで間隔あけて表示することくらいしか分からなくて困っています。

Aベストアンサー

ANSIエスケープシーケンスを使うとか、CUI用ライブラリ( curses等 )を使うとか、方法はありますが。

学校の課題なら
・W列xH行を順番に出力させる。
・長方形の中なら適当な文字、外なら空白。
程度のことを求めているのではないか、と。


> printfを使ってスペースで間隔あけて表示する

なにを使うかはともかく、そんな感じでではないでしょうか。


そうではなく、任意の座標に表示させることが求められているなら、最初に書いたキーワードで調べてみてください。

Q長方形、円、三角形の計算するプログラムでエラーがでます

タイトルの通りなんですがエラーがでます><
コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。
どこがおかしいのでしょうか?
#include <stdio.h>
int sikaku(void); int en(void);

int main(void)
{
char ch;
int a,b;

printf("円(A) 長方形(B) 三角形(C)\n");
printf("入力してください:");
ch = getche();

if(ch == 'C'){
printf("\n底辺を入力してください:");
scanf("%d ",a);
printf("高さを入力してください:\n");
scanf("%d",b);
printf("%dです",a * b);
}
else if(ch == 'B')
sikaku();
else if(ch == 'A')
en();
return 0;
}

int en(void)
{
int a;
float f;
printf("\n半径を入力してください:");
scanf("%d",a);
printf("円周率を入力してください:");
scanf("%f",f);
printf("%fです",a * a * f);
return 0;
}

int sikaku(void)
{
int a,b;

printf("\n縦を入力してください:");
scanf("%d",a);
printf("横を入力してくさい:\n");
scanf("%d",b);
printf("dです",a * b);
return 0;
}

タイトルの通りなんですがエラーがでます><
コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。
どこがおかしいのでしょうか?
#include <stdio.h>
int sikaku(void); int en(void);

int main(void)
{
char ch;
int a,b;

printf("円(A) 長方形(B) 三角形(C)\n");
printf("入力してください:");
ch = getche();

if(ch == 'C'){
printf("\n底辺を入力してください:");
scanf("%d ",a);
printf("高さを入力してください:\n");
scanf("%d",b);
p...続きを読む

Aベストアンサー

#include <stdio.h>
int sikaku(void);
int en(void);

int main(void)
{
char ch;
int a,b;

printf("円(A) 長方形(B) 三角形(C)\n");
printf("入力してください:");
ch = getchar(); // getche()という関数は標準にはありません。

if(ch == 'C'){
printf("\n底辺を入力してください:");
scanf("%d", &a); // 引数は、aではなく、&aにすべきです。
printf("高さを入力してください:\n");
scanf("%d", &b);
printf("%fです", a * b / 2.0); // 三角形ですので、2で割りましょう。
}
else if(ch == 'B')
sikaku();
else if(ch == 'A')
en();
return 0;
}

int en(void)
{
int a;
float f;
printf("\n半径を入力してください:");
scanf("%d", &a);
printf("円周率を入力してください:");
scanf("%f", &f);
printf("%fです", a * a * f);
return 0;
}

int sikaku(void)
{
int a,b;

printf("\n縦を入力してください:");
scanf("%d", &a);
printf("横を入力してくさい:\n");
scanf("%d", &b);
printf("%dです",a * b);
return 0;
}

#include <stdio.h>
int sikaku(void);
int en(void);

int main(void)
{
char ch;
int a,b;

printf("円(A) 長方形(B) 三角形(C)\n");
printf("入力してください:");
ch = getchar(); // getche()という関数は標準にはありません。

if(ch == 'C'){
printf("\n底辺を入力してください:");
scanf("%d", &a); // 引数は、aではなく、&aにすべきです。
printf("高さを入力してください:\n");
scanf("%d", &b);
printf("%fです", a * b / 2.0); // 三角形ですの...続きを読む

QVC++の操作

VC++6.0でC言語のソースファイルを実行できるのでしょうか?
できるのであれば、操作手順を教えてください。

Aベストアンサー

1) VC++6.0を起動する。
2) [ファイル]-[開く]でソースファイルを開く。
3) [ビルド]-[デバッグの開始]-[実行](F5)で実行。
4) 適当に「はい」でプロジェクト作成、~.exeの作成を行う。

で良いハズです。

QVC++2005EEでPowerPointの操作

Microsoft Office PowerPoint 2003でつくったプレゼン中にテンキー等のキーがおされたら、指定したページのスライドに移動するという常駐プログラムをVisual C++ 2005 Express Editionで作ろうとしています。
いろいろ調べてみたら、PowerPointのスライドを操作するにはAPIという関数が必要などいろいろとあったのですが、指定したページのスライドに移動をできるようなことが書かれたサイトはみつかりませんでした。

そもそも、PowerPointのスライドを外部プログラムで操作することは可能なのでしょうか?
もしできるのなら、サイトか構文などをおしえてもらえないでしょうか?

Aベストアンサー

参考になるサイト情報を教えて頂き有難う御座いました。
COMは情報をかき集めるのが結構大変です。一応、少ないですがCOM
オブジェクトを使ったプログラミングの参考書も出版されているの
で、そちらも購入されると良いと思います。検索ワードはCOM、ATL
等のキーワードです。

COMは・・・う~ん、うまい言葉が見つからないんですが、この場合、
PPTの制御用にmicrosoftが開発した命令セットをプログラム上で我々
が使う為の仕組みです。

PPT意外でも、メディアプレイヤー、WORD用のCOMオブジェクトという
のもあります。ユーザーはCOMを上手に使う事で仰る様な製品の制御
を行える様になるかも知れません。

ただ、何が出来るかは、公開されたインターフェースの機能に依存し、
それを調べる事から始めないといけません。PPT位メジャーなもので
あれば情報入手もある程度可能かもしれませんが、まず、そこが壁
です。それが分かれば、後は呼び出す為の規約通りに初期化して生成
してメソッドを使って破棄してと言うような感じの流れです。

恐らく、下のリンクのサンプルは非常に理解の助けになるはずです。

あと、常駐と組み合わせるよりは、このCOMを使ったアプリを作成して、
PPTのファイルをそのアプリにドラッグドロップし起動させれるよう
にして、それを使ってスライドショーを行う場合に上記の機能が
使えるという様なアプリ構成にした方が作りやすいと思います。
常駐だと、多分、起動するアプリの拡張子を見張るとかの処理が必
要になりそうで面倒に感じます。

おなじ言葉でCOMポートというものも存在するので間違えない様にし
てください。これは全く別物です

自分もそこまで詳しくはないので、参考にならなかったら御免なさい。
一応、何か追加で補足があれば付け加えておいてください。^^;)

参考になるサイト情報を教えて頂き有難う御座いました。
COMは情報をかき集めるのが結構大変です。一応、少ないですがCOM
オブジェクトを使ったプログラミングの参考書も出版されているの
で、そちらも購入されると良いと思います。検索ワードはCOM、ATL
等のキーワードです。

COMは・・・う~ん、うまい言葉が見つからないんですが、この場合、
PPTの制御用にmicrosoftが開発した命令セットをプログラム上で我々
が使う為の仕組みです。

PPT意外でも、メディアプレイヤー、WORD用のCOMオブジェクトと...続きを読む


人気Q&Aランキング

おすすめ情報