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

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

新規登録して質問してみよう
ただいま回答率
85.50%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

3回答

1456閲覧

メンバ関数の使用に関するエラーがわからない。

langhtorn

総合スコア104

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

0グッド

0クリップ

投稿2020/07/10 09:56

###質問内容&考察
エラー内容を教えてください。
まず、58行目ですがPointクラスでvoid qij_rotate(double theta)を作っているのにそんなのないと言われる。
76行目も58行目と同じです。
88行目はriはすぐ上で定義しているのにそんなのないと言われる。
いずれもRectangle bounding_rectangle(std::vector<Point>& points)関数内です。
###問題点
エラー

kadai31.cpp: In function 'Rectangle bounding_rectangle(std::vector<Point>&)': kadai31.cpp:58:20: error: 'class std::vector<Point>' has no member named 'qij_rotate' 58 | points.qij_rotate(-qij); //pij ^~~~~~~~~~ kadai31.cpp:76:20: error: 'class std::vector<Point>' has no member named 'qij_rotate' 76 | points.qij_rotate(qij); //rijij ^~~~~~~~~~ kadai31.cpp:88:14: error: 'ri' was not declared in this scope; did you mean 'r'? 88 | return r[ri]; | ^~ |

###コード

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.qij_rotate(-qij); //pのすべての点を原点を中心に-qij回転させる 56 //軸平行な最小包囲長方形を求める 57 if(points[i].x<min.x){ 58 min.x=points[i].x; 59 } 60 if(points[i].x<max.x){ 61 max.x=points[i].x; 62 } 63 if(points[i].y<min.y){ 64 min.y=points[i].y; 65 } 66 if(points[i].y>max.y){ 67 max.y=points[i].y; 68 } 69 Rectangle rij; 70 rij.height=max.y-min.y; //高さ 71 rij.width=max.x-min.x; //幅 72 r.push_back(rij); 73 points.qij_rotate(qij); //rijを原点を中心にqij回転させる 74 double areas=rij.height*rij.width; //rijの面積 75 area.push_back(areas); 76 } 77 } 78 double min_area=area[0]; 79 for(i=0;i<n;i++){ 80 if(min_area>area[i]){ 81 min_area=area[i]; 82 int ri=i; 83 } 84 } 85 return r[ri]; 86 87} 88 89int main() 90{ 91 int n; //個数 92 int i; 93 std::cout<<"点の個数を入力してください(n>=3)\n"; 94 std::cin>>n; 95 96 std::vector<Point> pts; 97 pts.resize(n); 98 std::cout<<"点の座標を入力してください\n"; 99 for(Point& p:pts){ 100 std::cin>>p.x>>p.y; 101 } 102 103 Rectangle rij=bounding_rectangle(pts); 104 std::cout<<"最小包囲長方形の幅は"<<rij.width<<"高さは"<<rij.height; 105 106 return 0; 107 108 109}

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

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

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

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

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

guest

回答3

0

ベストアンサー

points.qij_rotate(-qij);

pointsはPoint型ではないので.

投稿2020/07/10 09:58

fana

総合スコア11632

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

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

langhtorn

2020/07/10 10:39

std::vector<Point>では型が違うというのは気づきませんでした。ありがとうございます。
guest

0

qij_rotateの方は回答がついているので、もう一方のみ。

88行目はriはすぐ上で定義しているのにそんなのないと言われる。

変数は宣言したブロックの外では使えません。

C++

1 for(i=0;i<n;i++){ 2 if(min_area>area[i]){ 3 min_area=area[i]; 4 int ri=i; 5 } // <-ここ以降ではriは存在しない。 6 } 7 return r[ri];

投稿2020/07/10 10:03

編集2020/07/10 10:04
SHOMI

総合スコア4079

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

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

langhtorn

2020/07/10 10:40

forの外でriを定義したらできました。ありがとうございます。
guest

0

エラーを直した後のコードです。

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[i].qij_rotate(-qij); //pのすべての点を原点を中心に-qij回転させる 56 //軸平行な最小包囲長方形を求める 57 if(points[i].x<min.x){ 58 min.x=points[i].x; 59 } 60 if(points[i].x>max.x){ 61 max.x=points[i].x; 62 } 63 if(points[i].y<min.y){ 64 min.y=points[i].y; 65 } 66 if(points[i].y>max.y){ 67 max.y=points[i].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 points[i].qij_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; 111 112 return 0; 113 114 115}

投稿2020/07/10 13:21

langhtorn

総合スコア104

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問