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

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

ただいまの
回答率

88.93%

`std::cout`に対するエラーが突然大量にでてきた。

解決済

回答 2

投稿

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

langhtorn

score 59

実現したいこと

std::coutに対するエラーが突然大量にでてきた。
左下の頂点を出すところだけでてきます。どう違うのか教えてください。

問題点

エラーがとても大量にでてきたので一部だけ貼ります。

kadai31.cpp: In function 'int main()':
kadai31.cpp:114:44: error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'Point')
  114 |     std::cout<<"m<<rij.lower_left_corner;
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
      |              |                                   |
      |              std::basic_ostream<char>            Point

コード

//最小包囲長方形

#include<iostream>
#include<cmath>
#include<vector>

//x座標,y座標を表すクラス
struct Point
{
    double x;
    double y;

    //原点を中心に反時計回りにθだけ回転させるメンバ関数
    void qij_rotate(double theta){
        double dx=x; //x座標が変わらないように置いておく
        x=dx*cos(theta)-y*sin(theta);
        y=dx*sin(theta)+y*cos(theta); //点(x,y)を原点を中心にθだけ回転させると(xcosθ-ysinθ,xsinθ+ycosθ)となる
    }
};

//長方形を表現するクラス
struct Rectangle
{
    Point lower_left_corner; //長方形の左下の頂点を表す
    double width; //長方形の幅を表す
    double height; //長方形の高さを表す
    double angle; //長方形の傾いている角度を表す

    //長方形を原点を中心に反時計回りにθだけ回転させるメンバ関数
    void rotate(double theta)
    {
        Point d;
        d.x=lower_left_corner.x; //x座標が変わらないように置いておく
        lower_left_corner.x=d.x*cos(theta)-lower_left_corner.y*sin(theta);
        lower_left_corner.y=d.x*sin(theta)+lower_left_corner.y*cos(theta);
        angle+=theta;
    }
};

//点集合の包囲長方形を計算する関数
Rectangle bounding_rectangle(std::vector<Point>& points)
{
    int i,j;
    int n=points.size();
    Point min,max;
    min.x=points[0].x;
    max.x=points[0].x;
    min.y=points[0].y;
    max.y=points[0].y;
    std::vector<double> area; //面積の配列
    std::vector<Rectangle> r; //長方形の配列
    for(i=0;i<n-1;i++){
        for(j=i+1;j<n;j++){
            double qij=std::atan2(points[j].y-points[i].y,points[j].x-points[i].x); //x軸の正の方向と線分pipjのなす角度を計算する
            points[j].qij_rotate(-qij); //pのすべての点を原点を中心に-qij回転させる
            //軸平行な最小包囲長方形を求める
            if(points[j].x<min.x){
                min.x=points[j].x;
            }
            if(points[j].x>max.x){
                max.x=points[j].x;
            }
            if(points[j].y<min.y){
                min.y=points[j].y;
            }
            if(points[j].y>max.y){
                max.y=points[j].y;
            }
            std::cout<<"min.x="<<min.x<<"  max.x="<<max.x<<"  min.y="<<min.y<<" max.y="<<max.y<<"\n";
            Rectangle rij;
            rij.height=max.y-min.y; //高さ
            std::cout<<"高さ"<<rij.height<<"\n";
            rij.width=max.x-min.x; //幅
            std::cout<<"幅"<<rij.width<<"\n";
            r.push_back(rij);
            r[i].rotate(qij); //長方形rijを原点を中心にqij回転させる
            double areas=rij.height*rij.width; //rijの面積
            std::cout<<"面積"<<areas<<"\n";
            area.push_back(areas);
        }
    }
    double min_area=area[0];
    int ri;
    for(i=0;i<n;i++){
        if(min_area>area[i]){
            min_area=area[i];
            ri=i;
        }
    }
    std::cout<<"最小面積"<<min_area<<"\n";
    return r[ri];

}

int main()
{
    int n; //個数
    int i;
    std::cout<<"点の個数を入力してください(n>=3)\n";
    std::cin>>n;

    std::vector<Point> pts;
    pts.resize(n);
    std::cout<<"点の座標を入力してください\n";
    for(Point& p:pts){
        std::cin>>p.x>>p.y;
    }

    Rectangle rij=bounding_rectangle(pts);
    std::cout<<"最小包囲長方形の幅は"<<rij.width<<"高さは"<<rij.height<<"\n";
    std::cout<<"長方形の左下の頂点の座標は"<<rij.lower_left_corner<<"\n";
    std::cout<<"長方形の傾いている角度は"<<rij.angle<<"\n";

    return 0;


}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

Pointクラスのrij.lower_left_cornerが文字列に変換できないからです。
Pointクラスに string ToString()等の関数を作成し内容をstringにして返すようにし、

std::cout<< rij.lower_left_corner.ToString();

のような形で呼び出せばよいかと。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/11 15:15

    そうですね。いろいろ考えてみます。ありがとうございました。

    キャンセル

checkベストアンサー

0

kadai31.cpp:114:44: error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'Point')

Pointstd::cout(std::basic_ostream<char>)にどう出力すればいいかわからないからです。
Point構造体の定義より後に以下を追加してください。
出力の書式はお好きなように変更してください。

std::ostream& operator<<(std::ostream& stream, const Point& point)
{
    stream << '(' << point.x << ',' << point.y << ')';
    return stream;
}

bounding_rectangle()の以下の箇所でarea[0]が最小値の場合、riが不定値となり範囲外アクセスが発生します。
i0の場合は条件成立しないのは明らかなので、i1開始で良いですね。

    double min_area = area[0];
-    int ri;
+    int ri = 0;
-    for (i = 0; i < n; i++) {
+    for (i = 1; i < n; i++) {
        if (min_area > area[i]) {
            min_area = area[i];
            ri = i;
        }
    }
    std::cout << "最小面積" << min_area << "\n";
    return r[ri]; // <- ここで範囲外アクセス

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/11 15:15

    よくわかりました。ありがとうございます。

    キャンセル

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

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

関連した質問

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