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

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

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

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

Q&A

解決済

3回答

723閲覧

入力用の演算子の作り方がわからない

langhtorn

総合スコア104

C++

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

0グッド

0クリップ

投稿2020/06/18 08:28

###実現したいこと
球と点の交差判定のプログラムを作っています。
入力用の演算子
std::istream& operator>>(std::istream& in,Sphere& s)
を用いて、sphere sの中心の座標,球Sの半径,点pの座標の順番で入力したいです。
###問題点
エラーがでました。

kadai22.cpp: In function 'std::istream& operator>>(std::istream&, Sphere&)': kadai22.cpp:45:55: error: 'p' was not declared in this scope 45 | in>>s.center.x>>s.center.y>>s.center.z>>s.radius>>p.x>>p.y>>p.z; | ^ kadai22.cpp: In function 'int main()': kadai22.cpp:55:19: error: 'p' was not declared in this scope 55 | if(s.contains(p)){ |

エラー内容は多分
・45の方はSphereメンバの中でpが定義されていない
・55の方はmain関数内でpが定義されていない
だと思います。
ではこれをどう直すのかと考えると
・sphereメンバの中ではpはbool関数のところで定義されています。→これではいけないのでしょうか?いけない場合どうすればいいのでしょうか?
・入力用の演算子
std::istream& operator>>(std::istream& in,Sphere& s)によってこの中でpという定義がなされると思ったのですが違うみたいです。pはどこでどう定義すればいいのでしょうか?

###コード

C++

1//球と点の交差判定 2 3#include<iostream> 4#include<cmath> 5 6//3次元空間内の点を表現するクラス 7struct Point3 8{ 9 double x; //x座標 10 double y; //y座標 11 double z; //z座標 12}; 13 14//2点間の距離を求める 15double distance(Point3 a,Point3 b) 16{ 17 double d=std::sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); 18 return d; 19} 20 21//球を表現するクラス 22struct Sphere 23{ 24 Point3 center; //球の中心 25 double radius; //球の半径 26 27 //点pが球の内部・球面上に含まれるか判定するメンバ関数 28 bool contains(Point3 p) 29 { 30 double d=distance(center,p); 31 if(d<=radius){ 32 return true; 33 }else{ 34 return false; 35 } 36 } 37}; 38 39//sphereに対する入力用の演算子 40std::istream& operator>>(std::istream& in,Sphere& s) 41{ 42 in>>s.center.x>>s.center.y>>s.center.z>>s.radius>>s.p.x>>s.p.y>>s.p.z; 43 return in; 44} 45 46int main() 47{ 48 Sphere s; 49 std::cout<<"球Sの中心座標,球Sの半径,点pの座標を入力してください\n "; 50 std::cin>>s; 51 52 if(s.contains(p)){ 53 std::cout<<"点pは球の内部または球面にある\n"; 54 }else{ 55 std::cout<<"点pは球の外部にある\n"; 56 } 57 58 return 0; 59}

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

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

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

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

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

guest

回答3

0

"そのものヅバリ"じゃないと満足してくれないみたいだから:

C++

1//球と点の交差判定 2 3#include<iostream> 4#include<cmath> 5 6//3次元空間内の点を表現するクラス 7struct Point3 { 8 double x; //x座標 9 double y; //y座標 10 double z; //z座標 11}; 12 13//Point3に対する入力用の演算子 14std::istream& operator>>(std::istream& in, Point3& s) { 15 return in >> s.x >> s.y >> s.z; 16} 17 18 19//2点間の距離を求める 20double distance(const Point3& a, const Point3& b) { 21 return std::sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z)); 22} 23 24//球を表現するクラス 25struct Sphere { 26 Point3 center; //球の中心 27 double radius; //球の半径 28 29 //点pが球の内部・球面上に含まれるか判定するメンバ関数 30 bool contains(const Point3& p) const { 31 return distance(center, p) <= radius; 32 } 33}; 34 35//Sphereに対する入力用の演算子 36std::istream& operator>>(std::istream& in, Sphere& s) { 37 return in >> s.center >> s.radius; 38} 39 40int main() { 41 Sphere s; 42 Point3 p; 43 std::cout << "球Sの中心座標,球Sの半径,点pの座標を入力してください\n"; 44 std::cin >> s >> p; 45 46 if (s.contains(p)) { 47 std::cout << "点pは球の内部または球面にある\n"; 48 } else { 49 std::cout << "点pは球の外部にある\n"; 50 } 51 52 return 0; 53}

投稿2020/06/20 11:28

episteme

総合スコア16614

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

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

0

int型のデータとdouble型のデータを入力したいとき,

int i; double d; std::cin >> i >> d;

とか書くでしょうから,同じように,
球(Sphere)のデータと,点(Point3)のデータを入力したいならば,

Sphere s; Point3 p; std::cin >> s >> p;

といった形にするのが自然でしょう.
すなわち,Sphere型用と,Point3型用の2つのoperator>>を用意すべきように思います.

投稿2020/06/18 08:50

fana

総合スコア11654

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

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

0

自己解決

資料を作った方に問い合わせをしてみたら誤植だったようです。
正しくは
sphere sにの中心の座標,球Sの半径
これとはまた別に
int main内で点pの座標を入力するのか正しいそうです。
これらを踏まえたうえで、コードを書いてみたらできました。
お答えいただいた方ありがとうございます。お騒がせしてすみませんでした。

C++

1//球と点の交差判定 2 3#include<iostream> 4#include<cmath> 5 6//3次元空間内の点を表現するクラス 7struct Point3 8{ 9 double x; 10 double y; 11 double z; 12}; 13 14//2点間の距離を求める 15double distance(Point3 a,Point3 b) 16{ 17 double d=std::sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); 18 return d; 19} 20 21//球を表現するクラス 22struct Sphere 23{ 24 Point3 center; //球の中心 25 double radius; //球の半径 26 27 //点pが球の内部・球面上に含まれるか判定するメンバ関数 28 bool contains(Point3 p) 29 { 30 double d=distance(center,p); 31 if(d<=radius){ 32 return true; 33 }else{ 34 return false; 35 } 36 } 37}; 38 39//sphereに対する入力用の演算子 40std::istream& operator>>(std::istream& in,Sphere& s) 41{ 42 in>>s.center.x>>s.center.y>>s.center.z>>s.radius; 43 return in; 44} 45 46int main() 47{ 48 Sphere s; //球のクラス 49 Point3 p; //点のクラス 50 std::cout<<"球Sの中心座標,球Sの半径を入力してください\n"; 51 std::cin>>s; 52 std::cout<<"点pの座標を入力してください\n"; 53 std::cin>>p.x>>p.y>>p.z; 54 55 56 if(s.contains(p)){ 57 std::cout<<"点pは球の内部または球面にある\n"; 58 }else{ 59 std::cout<<"点pは球の外部にある\n"; 60 } 61 62 return 0; 63} 64 65/*実行結果 66球Sの中心座標,球Sの半径を入力してください 670 0 0 682 69点pの座標を入力してください 705 7 6 71点pは球の外部にある 72---------------------------------------- 73球Sの中心座標,球Sの半径を入力してください 740 0 0 755 76点pの座標を入力してください 772 1 3 78点pは球の内部または球面にある 79*/

投稿2020/06/20 12:16

langhtorn

総合スコア104

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問