質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

c++ classの実装

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 288

aimztmyrsk

score 20

9th.inの内容を取得し,はじめの点(二次元)とデータ点との距離が r 未満である場合は true, それ以外の場合は false を一行ごとに出力するプログラムをかきたいのですが,ほとんど何も分かっていません...。

9th.inの中には
1行目: x 座標, y 座標, 半径 r
2行目: データ数 n
3行目から 3 + n 行目: データ点の x 座標, y 座標
が含まれています。

加算,減算を行う二次元ベクトルクラスを作成.以下の4つの機能も実装しなければなりません。
長さを計算する関数 len
加算演算子
減算演算子
コンストラクタ

4つの機能の実装のコードは(全然未完成かもしれませんが)下記のような感じです。

長さを計算する関数len

    class A{
        double z;
    public:
        double x;
        double y;
        double len(){
            return sqrt(x*x + y*y);
        }
    };

加算演算子と減算演算子

    class R1{
    public:
        double x;
        R1(double x){
            (*this).x = x;
        }
        R1 operator+(R1 r1){
            return R1((*this).x + r1.x);
        }
        R1 operator-(R1 r1){
            return R1((*this).x - r1.x);
        }
    };


    class R2{
    public:
        double y;
        R2(double y){
            (*this).y = y;
        }
        R2 operator+(R2 r2){
            return R2((*this).y - r2.y);
        }
        R2 operator-(R2 r2){
            return R2((*this).y + r2.y);
        }
    };

コンストラクタ

class A2{
public:
    double x;
    A2(double x){
        (*this).x = x;
    }
};

9th.inの内容の取得については全くわかりません。
この4つをまとめて一枚に書けばいい感じですか?

皆さんの回答を参考に書き直したコードです

#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;

class A{

public:
    double x;
    double y;

    A() = default;

    //コンストラクタ
    A(double x,double y){
        (*this).x = x;
        (*this).y = y;
    }

    //長さを計算する関数len
    double len(){
        return sqrt((-1.14453-x)*(-1.14453-x) + (0.560077-y)*(0.560077-y));
    }

    //加算演算子と減算演算子
    A operator+(A a1){
        return A((*this).x + a1.x);
    }
    A operator-(A a1){
        return A((*this).x - a1.x)
    }

};

int main(){
    ifstream ifs("9th.in");
    if(!ifs) return 1;

    double x,y,x0,y0,r;
    int n;
    ifs >> x0 >> y0 >> r >> n;

    cout << boolalpha;
    for(int i=o;i<n;i++){
        ifs >> x >> y;
        cout << (hypot(x - x0,y - y0) < r) << endl;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

二次元ベクトルクラス

が,

長さを計算する関数 len
加算演算子
減算演算子
コンストラクタ 

の4つを有する,という話であると思います.(クラスを4種類作るのではなくて)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 14:42

    なるほど!!ありがとうございます!

    ちなみに9th.inのファイルの中身の取得については何か案はありませんでしょうか・・・?

    キャンセル

  • 2020/07/14 14:54

    「案」と言われても,
    std::ifstreamでも使って,std::getline()で1行ずつ読み込んで,行によっては必要に応じてカンマの位置でその読み込んだ文字列を細切れにしては数値に解釈する…といったことを行えばよいのではないでしょうか.

    キャンセル

  • 2020/07/14 16:33

    ありがとうございます!!

    キャンセル

+1

加算,減算を行う二次元ベクトルクラスを作成.以下の4つの機能も実装しなければなりません。
長さを計算する関数 len
加算演算子
減算演算子
コンストラクタ

こいつら全部 複素数クラス: std::complex<double> で解決しそうです。

[追記] ものは試しに書いてみた:

#include <iostream>
#include <fstream>
#include <complex>
#include <string>

int main() {
  std::string _9th_in = 
    "3 4 3\n"
    "3\n"
    "0 0 \n"
    "1 2 \n"
    "3 4 \n";
  std::istringstream stream(_9th_in);

  double x, y, r;
  stream >> x >> y >> r;
  std::complex<double> p(x,y);

  int n;
  stream >> n;
  while ( n-- ) {
    stream >> x >> y;
    std::complex<double> q(x,y);
    double distance = std::abs(p-q); // q-p間の距離
    std::cout << p << ':' << q << " " << distance << " : " 
              << std::boolalpha << (distance < r) << std::endl;
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 14:43

    ありがとうございます!!

    キャンセル

+1

多分あなたが作ろうとしているものと同じものを昔作ったことがあるのでよければ
https://github.com/Nagarei/DxLibEx/blob/master/dxlibex/basic_types/point2d.hpp

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 16:33

    ありがとうございます!!参照させていただきます!

    キャンセル

+1

ファイル 9th.in を読み込むには ifstream を使います。

#include <iostream> // cin, cout, endl
#include <fstream>  // ifstream
#include <cmath>    // hypot
using namespace std;


int main()
{
    ifstream ifs("9th.in");
    if (!ifs) return 1;

    double x, y, x0, y0, r;
    int n;
    ifs >> x0 >> y0 >> r >> n;

    cout << boolalpha;
    for (int i = 0; i < n; i++) {
        ifs >> x >> y;
        cout << (hypot(x - x0, y - y0) < r) << endl;
    }
}


追記
解決済みにしたのなら、どのようにして解決したのかコードを書いてほしい
と思います。後から質問を検索してみる人のためにも。

#include <iostream>  // cout, endl, boolalpha
#include <fstream>   // ifstream
#include <cmath>     // hypot
using namespace std;

class Vector {
    double x, y;
public:
    Vector(double x = 0, double y = 0) { this->x = x; this->y = y; }
    Vector(const Vector& v) { x = v.x; y = v.y; }  // copy constructor

    Vector operator+(const Vector& v) { return Vector(x + v.x, y + v.y); }
    Vector operator-(const Vector& v) { return Vector(x - v.x, y - v.y); }

    double len(const Vector& v) {
        Vector p = *this - v;  // operator- を使用
        return hypot(p.x, p.y);  // 直角三角形の斜辺 c = hypot(a, b)
    }
};

int main()
{
    ifstream ifs("9th.in");  // input file stream
    if (!ifs) return 1;

    double x, y, r;
    int n;
    ifs >> x >> y >> r >> n;
    Vector v0(x, y);

    cout << boolalpha;
    for (int i = 0; i < n; i++) {
        ifs >> x >> y;
        Vector v(x, y);
        cout << (v0.len(v) < r) << endl;
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 08:59

    具体的なコードまで・・・!!本当にありがとうございます( ; ; )少し分かってきました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る