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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1813閲覧

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

langhtorn

総合スコア105

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/11 03:23

###実現したいこと
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

###コード

C++

1//最小包囲長方形 2 3#include<iostream> 4#include<cmath> 5#include<vector> 6 7//x座標,y座標を表すクラス 8struct Point 9{ 10 double x; 11 double y; 12 13 //原点を中心に反時計回りにθだけ回転させるメンバ関数 14 void qij_rotate(double theta){ 15 double dx=x; //x座標が変わらないように置いておく 16 x=dx*cos(theta)-y*sin(theta); 17 y=dx*sin(theta)+y*cos(theta); //点(x,y)を原点を中心にθだけ回転させると(xcosθ-ysinθ,xsinθ+ycosθ)となる 18 } 19}; 20 21//長方形を表現するクラス 22struct Rectangle 23{ 24 Point lower_left_corner; //長方形の左下の頂点を表す 25 double width; //長方形の幅を表す 26 double height; //長方形の高さを表す 27 double angle; //長方形の傾いている角度を表す 28 29 //長方形を原点を中心に反時計回りにθだけ回転させるメンバ関数 30 void rotate(double theta) 31 { 32 Point d; 33 d.x=lower_left_corner.x; //x座標が変わらないように置いておく 34 lower_left_corner.x=d.x*cos(theta)-lower_left_corner.y*sin(theta); 35 lower_left_corner.y=d.x*sin(theta)+lower_left_corner.y*cos(theta); 36 angle+=theta; 37 } 38}; 39 40//点集合の包囲長方形を計算する関数 41Rectangle bounding_rectangle(std::vector<Point>& points) 42{ 43 int i,j; 44 int n=points.size(); 45 Point min,max; 46 min.x=points[0].x; 47 max.x=points[0].x; 48 min.y=points[0].y; 49 max.y=points[0].y; 50 std::vector<double> area; //面積の配列 51 std::vector<Rectangle> r; //長方形の配列 52 for(i=0;i<n-1;i++){ 53 for(j=i+1;j<n;j++){ 54 double qij=std::atan2(points[j].y-points[i].y,points[j].x-points[i].x); //x軸の正の方向と線分pipjのなす角度を計算する 55 points[j].qij_rotate(-qij); //pのすべての点を原点を中心に-qij回転させる 56 //軸平行な最小包囲長方形を求める 57 if(points[j].x<min.x){ 58 min.x=points[j].x; 59 } 60 if(points[j].x>max.x){ 61 max.x=points[j].x; 62 } 63 if(points[j].y<min.y){ 64 min.y=points[j].y; 65 } 66 if(points[j].y>max.y){ 67 max.y=points[j].y; 68 } 69 std::cout<<"min.x="<<min.x<<" max.x="<<max.x<<" min.y="<<min.y<<" max.y="<<max.y<<"\n"; 70 Rectangle rij; 71 rij.height=max.y-min.y; //高さ 72 std::cout<<"高さ"<<rij.height<<"\n"; 73 rij.width=max.x-min.x; //幅 74 std::cout<<"幅"<<rij.width<<"\n"; 75 r.push_back(rij); 76 r[i].rotate(qij); //長方形rijを原点を中心にqij回転させる 77 double areas=rij.height*rij.width; //rijの面積 78 std::cout<<"面積"<<areas<<"\n"; 79 area.push_back(areas); 80 } 81 } 82 double min_area=area[0]; 83 int ri; 84 for(i=0;i<n;i++){ 85 if(min_area>area[i]){ 86 min_area=area[i]; 87 ri=i; 88 } 89 } 90 std::cout<<"最小面積"<<min_area<<"\n"; 91 return r[ri]; 92 93} 94 95int main() 96{ 97 int n; //個数 98 int i; 99 std::cout<<"点の個数を入力してください(n>=3)\n"; 100 std::cin>>n; 101 102 std::vector<Point> pts; 103 pts.resize(n); 104 std::cout<<"点の座標を入力してください\n"; 105 for(Point& p:pts){ 106 std::cin>>p.x>>p.y; 107 } 108 109 Rectangle rij=bounding_rectangle(pts); 110 std::cout<<"最小包囲長方形の幅は"<<rij.width<<"高さは"<<rij.height<<"\n"; 111 std::cout<<"長方形の左下の頂点の座標は"<<rij.lower_left_corner<<"\n"; 112 std::cout<<"長方形の傾いている角度は"<<rij.angle<<"\n"; 113 114 return 0; 115 116 117}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2020/07/11 03:31

Kaleidoscope

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/07/11 06:15

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

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構造体の定義より後に以下を追加してください。
出力の書式はお好きなように変更してください。

C++

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

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

diff

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

投稿2020/07/11 05:40

編集2020/07/11 06:22
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/07/11 06:15

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問