• 締切済み

c++プログラミング

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

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.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内接する図形();   図形の描画; } ってな感じにできるかと。 # ちなみに、円に内接する *長方形* は無限にあるので、それを特定する # 条件を何か考えなければ行けないですね

回答No.2

モデル化に絞ってアドバイスです。円クラスが子供の矩形クラスを所有し矩形クラスが子供の円クラスを所有、さらにその円クラスが矩形クラスを所有する構造をモデル化すればよいのですよね。 C++は処理を細分化・部品化することが得意ですし、とても重要です。今回の例では、親の情報から自分自身を作って、そして自分自身をさらに子供に渡す。子供がどのようなロジックで自分自身を作るのかは親は感知しません。(処理の部品化) もっと高度の概念では、virtualを使った仮想関数で継承をサポートしたりもできます。(進化(?)した別のロジックで、自身を作るクラスを定義するなど・・) 下記は、円が真円・矩形が正方形を前提とした単純なモデル化の例です。 解説: 各クラスのコンストラクタが親のクラスのポインタを引き継ぎます。その情報を基に自身の情報を決定していきます。これで、ルートクラスをたったひとつ作ってやるだけであとはクラスが勝手に子供を作っていきます(^^)。 class CYen; class CSquare; static long nNestCount = 0L; // 繰り返し回数 #define NSTCNT 10 // 繰り返し制限値 class CYen // 円クラス { private: double m_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: double m_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の円 を作る } すいません長くなりました。 参考になれば幸いです。ではがんばってください。

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.1

プログラミングというより数学の問題みたいですね。 「以下は問題です。」の下の文は、練習問題の通り なんでしょうか?何を求められているのか、 よくわかりません。 具体的には、以下の点が曖昧です。 1)「一つの円の中に4点を交わるように」とは、 円に内接するように、ということでしょうか? そうだとすると、 2)「一つの円の中に4点を交わるように1つの 長方形を描き」というのは、円に内接する長方形を 描くことになります。ある円に内接する長方形という のは無数に描けますが、どんな長方形をどんな向きで 描くのかはユーザが与えるんでしょうか?それとも ランダム? 3)最初に円を与え、それに内接する長方形をユーザが与える かランダムに決めるかして描けたとしましょう。すると、 さらにその長方形に内接する円も(この長方形が正方形で ない限り)無数に描けますが、これはどうしましょう? 最初の円と同心円にしますか? 4)さらに、次に描いた円に内接する長方形も2)と同じ 理屈で無数に描けますが、一々ユーザが与えるんでしょうか? それともランダムでしょうか? …以下繰返し。

関連するQ&A

  • カーニハン・リッチー『プログラミングC言語』

    このサイトでの回答者のお薦めで、カーニハン・リッチー『プログラミングC言語』を買いました。この本には、本の中の練習問題の解答書が別に売っているようですが、これも買った方がいいでしょうか。教えて下さい。

  • 猫でもわかるC++プログラミングについて

    猫でもわかるC++ プログラミングで学習している初心者です。 そこで質問です。 Visual C++ 2010 Expressを使って学習していて、 自分では本に書かれている通りやっているつもりなのですが ビルドが問題なく成功しているのに デバッグをしてプログラムを実行すると そのプログラムが勝手に一瞬で終了してしまいます。 プログラムの実行結果が確認できず困っています。 何が間違っているのか自分では分かりません。 問題点が分かれば指摘していただけると嬉しいです。 よろしくお願いします。

  • Java言語プログラミングについて質問です

    次の問題をどう組んだらいいかわかりません。教えてください。 問.2次元上の円と長方形を表すデータファイルが与えられたとき、以下の処理を行うプログラムを作成せよ。ただし、長方形は必ず座標軸に並行変を持つとする。 1.全図形の合計面積を表示せよ 2.一番免責の大きい図形データを表示せよ 3.周の長さ順に図形データを表示せよ 4.重なり合ってるすべての円のペアを列挙せよ 5.重なり合っているすべての図形のペアも列挙せよ 図形データのフォーマットは以下のようなCSV形式で与えられているとする。 円  ID、1、中心点のX座標(double型)、中心点のY座標(double型)、半径(double型) 長方形 ID、2、左上の点のX座標(double型)、左上の点のY座標(double型)、右下の点のX座標(double型)、右下の点のY座標(double型) ただし、IDは図形間でユニークな整数値であるとする。 図形データの例 1. 1, 50, 0, 50, 0, 50.0 2. 2, -100, 0, 100, 0, 0, 0, 0, 0 3. 1, 0, 0, 0, 0, 10.0 4. 1, 50, 0, 0, 0, 30.0 5. 2, -75, 0, 75.0, -25.0, 25.0 まだ自分に知識がないので、この問題をどう組んだらいいかわかりません。教えてください。よろしくお願いします。解説とソースをお願いします。

  • C言語のプログラミング

    今、独学でC言語を勉強しています。それで、練習にと思い、損益分岐点計算をC言語で作ってみようと思い、作りました。以下が、私が作ったプログラミングです。 float tanka,hendo,kotei,ryo; printf("単価 ¥"); scanf("%d",&tanka); printf("変動費¥");scanf("%d",&hendo); printf("固定費¥");scanf("%d",&kotei); ryo=kotei/(tanka-hendo); printf("限界利益率は %3.1f%です\n",(1-hendo/tanka)*100); printf("損益分岐点時の販売量は%.0fです\n",ryo); printf("損益分岐点時の売上高は%.0fです\n",kotei/(tanka-hendo)); しかし、実行してみると、最後の「損益分岐点時の売上高」が0になってしまいました。 参考書などの問題ではないので、答えがなくて困っています。どこがおかしいのかが分かる方、ぜひ教えてください。

  • プログラミングC#が難しくて困っています。

    プログラミングをしたいと思い、独習C#を使ってプログラミングの勉強中です。 プログラミングは全くの初心者です。 他の入門書でもそうなのかもしれませんが、論理演算子やビット演算子、配列などの内容が書かれていますが、これらが一体何の役に立つのか分からなくて困っています。 読んでいても理解できないです。 本にケチを付けているわけではないです。 おそらく私にプログラミングのセンスがないんだと思います。 また、この本では、コンソールアプリケーションの説明が多いのですが、私はウェブアプリケーションに関心があります。 基礎だと思って読み進めるべきでしょうか? サンプルプログラムも地道に本の真似をして自分で打っていったほうがいいのでしょうか? わからないことがあってGoogleで調べても、理解できないです。 本当に、プログラミングが難しいです。 独習C#のような本は、全て理解する必要があるのでしょうか? 質問が多くなって申し訳ありません。

  • 円の直径を求める問題なのですが

    ○十年ぶりに算数の問題を解いてみたのですが、ひとつ分からない問題があります。図解ではなく言葉で問題を書くのは大変難しいのですが、次のような問題です。 円の中心から向かって右水平方向に線を引き円に内接します。これが半径です。内接したところから、左水平方向に3センチ戻ったところから、垂直下方向へ線を引き、円に内接します。そこから、水平左方向へ線を引き、円の中心から垂直下方向へ引いた線と先ほどの線が交わります。そこには長方形ができるのですが、交わった点から対角線を引くと、はじめの3センチの点と交わり、その対角線の長さが9.5センチになります。この場合の円の直径を求めよというものです。わかっている長さは3センチと9.5センチです。方程式を使って解くのでしょうか、もう、まったく思い出せません。どなたか、是非、教えてください。よろしくお願いします。

  • windowsプログラミングの入門書

    明けましておめでとうございます。 ちょっと遅いかもしれませんが(笑) 自分は3Dのゲームを作ろうと思い、ネットで調べたらC→C++→win32→directxの順番で勉強するのがいいと聞きました。 CとC++は1通り勉強しました。 次にwin32の勉強をしようと思い、本を買ったのですがどうやらwindowsシステムプログラミングの本で、しかも入門書ではありませんでしたOTL。8000円もしたのに~(笑) アマゾンやジュンク堂のwebサイトでwindowsプログラミングの入門書を調べたのですが、あっても1990年代の本しかなく、在庫ぎれもありました。 自分は無償のvisual studio 2008でしたいので、最近のwindowsプログラミングの入門書でvisual studio 2008を使って学べるいい本はあるのでしょうか?あっ、猫でも分かるプログラミングの本はアマゾンのカスタマーレビューを見て良くなさそうな本だったので、これ抜きでお願いします。 自分はdirectxの本が読める程度のwindowsプログラミングを学べる方法を探しています。よろしくお願いします。

  • C#でネットワークプログラミング

    C#でネットワークプログラムをしているものです。 本を読みながら勉強しているのですが C#だとTcpListener・TcpClientを用いれば 簡単にチャットを作れますよね。 で、他にも方法があって Socket通信と非同期なSocket通信というものが ありますが、 実際問題としてこの二つの違いというのが よくわかりません。 どっちでもいいじゃんと思えるのです。 違いをわかりやすく教えていただけると幸いです。 具体的にチャット(3人以上でできるもの) だとどれがどうとかありますでしょうか?

  • MACでのプログラミング C#など

    前回の質問でMACでの開発にPHP、JAVA、JSは問題ないということはわかりました。 http://okwave.jp/qa/q7928891.html C言語について ObjectCはC言語を拡張したものでC言語に機能を追加したようなものだと聞きました。 そうすると、MACではC言語の開発は出来るのでしょうか? 次にC#について 「Mono」を使ってC#を勉強するだけなら問題なくて、開発となるとVisualstudioの入っているWindowsが良い、ということですね。 ではMonoを使って開発した場合そのコードをVisualstudioに貼り付ければ動作するのでしょうか? わかる方教えて下さい。

  • C言語について

     プログラミング言語について質問があります。今、C言語を練習中ですが、C言語に関する本を見ると、大体、(入門者用の教科書しか知らないのですが)ファイル操作とか、構造体とかの説明とかで、終わっています。それで、自分はWindowsでグラフィック操作(例:動画とかを扱う)とかの、プログラムを組みたいのですが、C言語でそれができるのでしょうか。それともC++言語とか、Javaとか他の言語を習得しなければいけないのでしょうか。また、欲張りますが、C言語でグラフィック操作ができるのなら、どんな本を読めばいいのでしょうか。解らなかったので、投稿しました。よろしければ、回答宜しくお願いします。

専門家に質問してみよう