今日(てか、昨日)のC++の演習課題w
Q.2次元座標上の3角形の重心の座標を求めるプログラムを作成せよ。
ほいほいとこなしたので、せっかくだから
「n角形の重心を求めるプログラムにしたい」
と思い立ち考えてみたw
とりあえず、3角形のプログラムを弄ればいいので、コピペw
1.まず、n角形と言うのをしているすための変数Nをグローバル変数で宣言しておかなければw
int N;
2.構造体で宣言されているx座標y座標を構造体配列にぶっこむプログラムを
N角形なのでN回繰り返すようにする。
int i;
for(i=0;i<N;i++){
cin>>p[i].x;
cin>>p[i].y;
}
3.3角形の重心の座標を求めるには
x座標=(x1+x2+x3)/3
y座標=(y1+y2+y3)/3
だったので、N角形ならば、
x座標=(x1+x2+x3+・・・+xn)/n
y座標=(y1+y2+y3+・・・+xn)/n
になるはず。
しかし、プログラム上、これは多分1つのプログラムではできない気がする・・・。
(というか、絶対これアルゴリズムあるよね!)
仕方ないので、分子を先に計算させてそれをnで割るようにする。
int i;
double sum_x=0;
double sum_y=0;
for(i=0;i<N;i++){
sum_x+=p[i].x;
sum_y+=p[i].y;
}
g.x=sum_x/N;
g.y=sum_y/N;
(※p[]とgは構造体)
4.表示は丸パクリwww
何もかえないでおkw
cout<<N<<"角形の重心の座標=("<<g.x<<","<<g.y<<")"<<endl;
5.こいつらを、それぞれの関数にぶっこむ。
6.完成
って、くだらないプログラム作ってないで、レポートやらねぇと、樹海行きになる三┏( ^o^)┛
意味はないがソースコードw(無駄なメッセージ入り)
うわぁ・・・インテリジェントつかねぇのか・・・
ポインタやらなんやら使ったら以下のようになったwww
#include <iostream>
using namespace std;
int N;
struct coord //2次元座標用構造体
{
double x,y; //x座標値,y座標値
};
void message(){
cout<<
"どんな角の図形の重心の座標でも求めて差し上げよう\n図形の重心の座標を求めるには(x1+x2+x3+・・・+xn/n,y1+y2+y3+・・・+yn/n)\nめんどくさい!\nということでこのプログラムを作ってみたw"<<endl;
}
//図形の角数を指定
int large(int &N){
cout<<"何角形の重心を求めますか?(3~100角形)"<<endl;
cin>>N;
return (N);
}
//角の座標を指定(Nこ)
void InputData(coord *p)
{
int i;
cout<<"2次元座標上の"<<N<<"角形の重心を求めます."<<endl;
cout<<"各頂点の座標値(x, y)を入力して下さい."<<endl;
//読み込み(N回繰り返す)
for(i=0;i<N;i++){
cout<<i+1<<"点目: x = ";
cin>>p[i].x;
cout<<i+1<<"点目: y = ";
cin>>p[i].y;
}
}
//重心を計算
coord CalcGravity(coord *p)
{
int i;
double sum_x=0;
double sum_y=0;
//重心計算
//N角すべての総和
for(i=0;i<N;i++){
sum_x+=p[i].x;
sum_y+=p[i].y;
}
//N角形の角数で割る
p->x = sum_x/N;
p->y = sum_y/N;
return (*p);
}
//表示させるため"だけ"のプログラム
void Print(coord p)
{
//表示
cout<<N<<"角形の重心(x,y)= ("<<p.x<<","<<p.y<<")"<<endl;
}
//メイン関数
int main(void)
{
message();
//限界角数として100を指定
coord point[100];
//図形
large(N);
//読み込み
InputData(point);
//計算+表示
Print(CalcGravity(point));
return 0;
}