2次元平面上の点と原点との距離の計算と出力

このQ&Aのポイント
  • 平面上の点の数n、n個の点の座標を読み込む
  • 原点からの平均距離を計算し、平均距離から4以上18以下の点の座標とその数を出力する
  • 入力例と出力例を示す
回答を見る
  • ベストアンサー

どこを変えればいいか教えてください。

2次元平面上の点と原点との距離 [問題]平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み,原点 (0, 0) からの平均距離を計算した後,平均距離,原点からの距離が(平均距離-4)以上で,かつ,(平均距離+18)以下であるすべての点の座標,及び,その数を出力するプログラムを書け(座標は,入力された順に出力). (入力例) コメントの部分は除く 3 // 点の数 10 20 // 1 番目の点の x 及び y 座標 30 20 // 2 番目の点の x 及び y 座標 20 30 // 3 番目の点の x 及び y 座標 (出力例) コメントの部分は除く 31.49・・・ // 平均距離 30 20 // 2 番目の点の x 及び y 座標 20 30 // 3 番目の点の x 及び y 座標 2 // 点の数 #include <iostream> #include <math.h> int main() { double mean = 0.0, x[100], y[100], r[100]; int i1, k = 0, n; // _ ̐ std::cin >> n; // _ ̍ W ̓ ͂ƕ ϋ ̌v Z for (i1 = 0; i1 < n; i1++) { std::cin >> x[i1] >> y[i1]; r[i1] = sqrt(x[i1] * x[i1] + y[i1] * y[i1]); mean += r[i1]; } mean /= n; // i ϋ {10 j ȏ㗣 ꂽ _ ̏o std::cout << mean << std::endl; for (i1 = 0; i1 < n; i1++) { if (r[i1] >= mean+10.0) { std::cout << x[i1] << " " << y[i1] << std::endl; k++; } } std::cout << k << std::endl; return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

現在のプログラムが「距離が平均より10以上大きい」ものを表示する、というのは理解できてますか? 理解できてないのなら、まず、このプログラムの動作のしくみをよく理解しましょう。 理解できれば、どこを変えれば目的の条件になるかわかるはずです。

関連するQ&A

  • どこを変えればいいですか?

    2次元平面上の2点間の距離 [問題]平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み,すべての点の間の距離を計算し,その距離が最大になる点の組(2つの点の座標.最初に入力した点の座標を最初),及び,その距離を出力するプログラムを書け. (入力例) コメントの部分は除く 3   // 点の数 0 10   // 1 番目の点の x 及び y 座標 0 0   // 2 番目の点の x 及び y 座標 20 0   // 3 番目の点の x 及び y 座標 (出力例) コメントの部分は除く 0 10   // 1 番目の点の x 及び y 座標 20 0   // 3 番目の点の x 及び y 座標 22.36・・・   // 2点間の距離 #include <iostream> #include <math.h> int main() { double max = 0.0, x[100], x1, y[100], y1, r; int i1, i2, n, m1, m2; // 点の数 std::cin >> n; // 点の座標の入力 for (i1 = 0; i1 < n; i1++) std::cin >> x[i1] >> y[i1]; // 点間の距離の計算 for (i1 = 0; i1 < n-1; i1++) { for (i2 = i1+1; i2 < n; i2++) { x1 = x[i1] - x[i2]; y1 = y[i1] - y[i2]; r = sqrt(x1 * x1 + y1 * y1); if (r > max) { max = r; m1 = i1; m2 = i2; } } } // 出力 std::cout << x[m1] << " " << y[m1] << std::endl; std::cout << x[m2] << " " << y[m2] << std::endl; std::cout << max << std::endl; return 0; }

  • C++について。

    現在”猫でもわかるプログラミング”のC++編をSDKと共に勉強している身です。 現在第22章、第23章を勉強中です。 22章 http://www.kumei.ne.jp/c_lang/cpp/cpp_22.htm 23章 http://www.kumei.ne.jp/c_lang/cpp/cpp_23.htm 作業環境はVisual Studio 2005.net C++です 22章でのプログラムを作成し、実行した結果エラーが出てしまいました。 ソースです #include <iostream> class xy_position { int x; int y; public: xy_position(int x = 0, int y = 0){ xy_position::x = x; xy_position::y = y; } int X() const {return x;} int Y() const {return y;} }; ostream& operator << (ostream& o, const xy_position& p) { return o << "(" << p.X() << "," << p.Y() << ")"; } int main(void) { xy_position a(50, 60), b; std::cout << a << b << std::endl; return 0; } (17):error C2143: 構文エラー : ';' が '&' の前にありません。 (17):error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません (17):error C2065: 'o' : 定義されていない識別子です。 (17):error C2059: 構文エラー : 'const' (18):error C2143: 構文エラー : ';' が '{' の前にありません。 (18):error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) (26):error C2679: 二項演算子 '<<' : 型 'xy_position' の右オペランドを扱う演算子が見つかりません (または変換できません)。 このようなエラーが出てしまいました。 もちろんソースは全て同様に書いています。 この”猫でも”で使用しているコンパイラと異なるために出たエラーでしょうか? それに単に cout << のように記述するとエラーが出てしまい、 std::cout << のように記述しなければ通りません。 また、エラーとは別の質問になってしまいますが、プログラム中に int X() const {return x;} という記述がありますが、このconstの意味が分かりません。 単純に return x が変更不可能という意味でしょうか? 次に23章についての質問です。 ここでもソースは同じなのに以下のようなエラーが出てしまいます。 ソースです。 #include <iostream> int main(void) { int x=10, y=15, z=20; std::cout << "16進表示" << std::endl; std::cout.setf(ios::hex); std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; std::cout.unsetf(iostream::hex); std::cout << "8進数" << std::endl; std::cout.setf(ios::oct); std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; return 0; } (8):error C2653: 'ios' : 識別子がクラス名でも名前空間名でもありません。 (8):error C2065: 'hex' : 定義されていない識別子です。 (13):error C2653: 'iostream' : 識別子がクラス名でも名前空間名でもありません。 (15):error C2653: 'ios' : 識別子がクラス名でも名前空間名でもありません。 (15):error C2065: 'oct' : 定義されていない識別子です。 これも何か設定をしなければいけないのでしょうか? なにぶんC++は・・・というかオブジェクト指向の言語は初心者なもので疑問も多いですorz

  • うまく実行ができない(相関図)

    C++で二次元配列を勉強しています。そこで二次元配列を使用して相関図をつくるプログラムの問題をやっているのですが、自分なりにプログラムをつくったところ、コンパイルはできるのですが実行すると無限ループがおこり、うまく実行できません。いくら考えてもなにがいけないのかわからないので質問させていただきました。 下のは読み込むデータファイル例とその実行例です http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5254.txt 以下はつくってみた間違いプログラムです #include<iostream> #include<string> #include<iomanip> #include<fstream> using namespace std; int main() { int data; string filename,Madata,Endata; int i=0,j=0,x=0,y=0,m=0,n=0,num=100; char* graph[21][21]; ifstream fin; cout << "This program's spec:"<< endl; cout << "point range=(0-100) div=5 leftspace=4 divspace=3" << endl; cout << "Input data File Name!:"; cin >> filename; fin.open(filename.c_str()); if(!fin) { cerr << "指定されたファイルを開けません" << endl; return 1; } while(fin >> data) { Madata[i]=data; fin >> data; Endata[i]=data; i++; } for(m=0; m<21; m++) { for(n=0; n<21; n++) { graph[m][n]=" "; } } for(m=0; m<i; m++) { x=Madata[m]/5; y=Endata[m]/5; graph[x][y]="*"; } for(x=0; x<21; x++) { cout << setw(3) << num << "|"; for(y=0; y<21; y++) { cout << setw(3) << graph[x][y]; } cout << endl; num=num-5; } cout << "----------------------------------------------------------------------" << endl; cout << setw(3) << "|"; for(num=0; num<=100; num+5) { cout << setw(3) << num; } cout << endl; return 0; } 上記のプログラムだと0の無限ループになります。 長々となりましたが、時間のある方教えてください、よろしくおねがいします

  • C++の配列についてなんですが

    #include <iostream> using namespace std; int main() { int i,goukei=0; int kokugo[5]; float heikin; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績を入力してください\n"; cin >> kokugo[i]; goukei = goukei + kokugo[i]; } heikin = (float)goukei/5.0; cout << "平均点は" << heikin << "点です\n"; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績は" << kokugo[i]; cout << "点で、平均との差は" << heikin-(float)kokugo[i] << "です\n"; } return 0; } これを基に 数学の点数も入力する 数学の平均も出力する 国語と数学の総合的な平均点も出力する ようにするにはどうすればいいんですか?

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • C++ ソートのやり方

    僕が作ったプログラムで、これはバブルソートなのかわからないので教えてください。 また、ほかのソートの仕方も教えてください。 よろしくお願いします。 汎用関数を使っているのでわかりにくいかもしれないですがお願いします。 #include <iostream> using namespace std; template <class X>void Sort(X *data, int size) { X temp; for (int i = 0; i < size; i++){ for (int j = i + 1; j < size; j++){ if (data[i]>data[j]){ temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } int main() { int i[10]{1, 4, 3, 5, 2, 10, 2, 7, 6, 8}; char c[10]{'c', 'b', 'z', 'a', 'x', 'y', 'j', 'n', 'm', 'r'}; Sort(c, 10); Sort(i, 10); for (int j = 0; j < 10; j++){ cout << i[j] << ' '; } cout << endl; for (int j = 0; j < 10; j++){ cout << c[j] << ' '; } cout << endl; getchar(); return 0; }

  • C++で10進数→2進数に

    C++で10進数を2進数に変換するプログラムを 順番通りに表示できるようにする っていうのを配列を使って作るんですが 下はあまり関係ないですが、こんな感じのが参考になるかなと思ったんですが、どうすればいいんですか #include <iostream> using namespace std; int main() { int i,goukei=0; int kokugo[5]; float heikin; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績を入力してください\n"; cin >> kokugo[i]; goukei = goukei + kokugo[i]; } heikin = (float)goukei/5.0; cout << "平均点は" << heikin << "点です\n"; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績は" << kokugo[i]; cout << "点で、平均との差は" << heikin-(float)kokugo[i] << "です\n"; } return 0; }

  • 標準ライブラリのcos関数の値がおかしいです。

    標準ライブラリのcos関数の値がおかしいです。 環境は OS:WindowsXP 言語:C++ 開発環境:Visual C++ ExpressiEdition です。 以下がサンプルコードです。 #include<iostream> #include<stdio.h> #include<math.h> int main(){ double y=cos(90.0 * 3.14159265358979323846264338327950288 / 180.0); printf("%lf\n",y); std::cout<<y<<std::endl; printf("%d\n",y*10); std::cout<<y*10<<std::endl; getchar(); return 0; } 上記のコードを実行すると、 0.000000 6.12323e-017 -1076268279 6.12323e-016 と出力されます。 本来なら、cos90の値は0ですから全て「0」と表示されると思うのですが・・・ 原因が分かる方がいらっしゃいましたら、教えていただけると助かります。

  • どこを変えたらいいか教えて下さい。

    余りによる数字の分類 [問題]複数の正の整数値を入力し( 0 で入力を終了し,その 0 はデータ数に含めない),41 で割り切れる数の個数,41で割ると 1 余る数の個数,・・・,及び,41 で割ると 40 余る数の個数とそれらの全体の個数に対する割合(%で表示し,小数点以下は切り捨て)を出力するプログラムを書け.出力データは,上で述べた順番で,個数と割合をペアーにし,以下に示すような形式で出力すること(コメントの部分は含まない) 15 2 // 10 で割れる数の個数と全体に対する割合 10 25 // 10 で割ると 1 余る数の個数と全体に対する割合 ・・・ #include <iostream> int main() { int i1, data, k, n = 0, x[10] = {0}, y[10]; // データの入力 std::cin >> data; while (data > 0) { k = data % 10; x[k]++; n++; std::cin >> data; } // 割合の計算 for (i1 = 0; i1 < 10; i1++) y[i1] = 100 * x[i1] / n; // 出力 for (i1 = 0; i1 < 10; i1++) std::cout << x[i1] << " " << y[i1] << std::endl; return 0; }

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

専門家に質問してみよう