Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
#1

Площадь многоугольника - C++

09.08.2012, 13:24. Просмотров 986. Ответов 7
Метки нет (Все метки)

Необходимо вычислить площади двух многоугольников(ну а в дальнейшем проверить, лежит ли один из них в другом, пока мне это не надо) по известным вершинам. У меня получилось вот это."Это" не работает.Где ошибки? Заранее спасибо

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
float Ploshad(float x[],float y[], const int n);
int main(){
int i,n1,n2;
cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n1;i++){
cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<" ";
cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
x1[n1+1]=x1[1];
y1[n1+1]=y1[1];
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n2;i++){
cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<" ";
cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
x2[n2+1]=x2[1];
y2[n2+1]=y2[1];
float s1,s2;
s1=Ploshad(x1,y1,n1+1);
cout<<"S1="<<s1;
s2=Ploshad(x2,y2,n2+1);
cout<<"S2="<<s2;
return(0);};

float Ploshad(float x[],float y[], const int n){
int min=1,max=1,i;
// находим крайние вершины по оси 0х
for(int i=0;i<=n;i++){
if (x[min]<x[i]) min=i;
if (x[max]>x[1]) max=i;};
float s1=0, s2=0,s=0;
// площадь многоугольника, разбивая на трапеции ( 2 случая)
if (max>min) {
i=min; while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=max; while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
}
else {
i=max; while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=min; while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
s=abs(s1-s2);
return(s);};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 13:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Площадь многоугольника (C++):

Вычислить площадь многоугольника с использованием функции,которая определяет площадь по координатам его вершин - C++
Народ помогите пож нужно очень срочно. совсем запутался с этим задание,буду благодарен за помощь. Вычислить площадь многоугольника с...

Площадь многоугольника - C++
Найти площадь невыпуклого многоугольника(n-угольник). Входные данные: координаты точек. На output вывести площадь.

Площадь многоугольника - C++
Всем добрый вечер! Есть задача: Заданы координаты n последовательных вершин многоугольника. Определить его площадь. Входные данные...

Площадь выпуклого многоугольника - C++
Доброго времени суток! Собственно, задача звучит как: &quot;Расчет площади выпуклого многоугольника при вводимых координатах вершин&quot;. ...

Найти площадь многоугольника - C++
найти площадь многоугольника по заданным точкам его вершин(точки, даны по обходу многоугольника по часовой стрелке).

Вычислить площадь многоугольника - C++
Задача 33* Выпуклый многоугольник задан координатами своих вершин. Вершины упорядочены. Вычислить площадь многоугольника. ...

7
John Prick
805 / 738 / 146
Регистрация: 27.07.2012
Сообщений: 2,110
Завершенные тесты: 3
09.08.2012, 13:35 #2
Выделите кусок кода под тэги CPP и отформатируйте с оступами. А так разбираться ну уж очень тяжко.
0
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 13:42  [ТС] #3
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
float Ploshad(float x[],float y[], const int n);
int main(){
int i,n1,n2;
cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n1;i++){
cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<" ";
cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
x1[n1+1]=x1[1];
y1[n1+1]=y1[1];
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n2;i++){
cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<" ";
cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
x2[n2+1]=x2[1];
y2[n2+1]=y2[1];
float s1,s2;
s1=Ploshad(x1,y1,n1+1);
cout<<"S1="<<s1;
s2=Ploshad(x2,y2,n2+1);
cout<<"S2="<<s2;
return(0);};

float Ploshad(float x[],float y[], const int n){
int min=1,max=1,i;
// находим крайние вершины по оси 0х
for(int i=0;i<=n;i++){
if (x[min]<x[i]) min=i;
if (x[max]>x[1]) max=i;};
float s1=0, s2=0,s=0;
// площадь многоугольника, разбивая на трапеции ( 2 случая)
if (max>min) {
i=min; while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=max; while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
}
else {
i=max; while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=min; while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
s=abs(s1-s2);
return(s);};
0
titans2011
300 / 261 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 13:46 #4
Первое что могу сказать, строка
C++
1
float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
У вас статический массив а не динамический.
Или делайте так (например)
float x1[2+1]
Или выделяйте динамическую память, решите этот вопрос, посмотрим дальше.
0
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 13:48  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
float Ploshad(float x[],float y[], const int n);
int main(){
  int i,n1,n2;
  cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
  cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
  float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
  cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
  cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
  // вводим координаты вершин 1 многоугольника
   for(i=1;i<=n1;i++){
       cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<" ";
       cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
  x1[n1+1]=x1[1];
  y1[n1+1]=y1[1];
      // вводим координаты вершин 1 многоугольника
  for(i=1;i<=n2;i++){
     cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<" ";
     cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
  x2[n2+1]=x2[1];
  y2[n2+1]=y2[1];
  float s1,s2;
  s1=Ploshad(x1,y1,n1+1);
  cout<<"S1="<<s1;
  s2=Ploshad(x2,y2,n2+1);
  cout<<"S2="<<s2;
return(0);};
 
float Ploshad(float x[],float y[], const int n){
    int min=1,max=1,i;
    // находим крайние вершины по оси 0х
    for(int i=0;i<=n;i++){
     if (x[min]<x[i]) min=i;
     if (x[max]>x[1]) max=i;};
   float s1=0, s2=0,s=0;
   // площадь многоугольника, разбивая на трапеции ( 2 случая)
  if (max>min) {
     i=min; while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=max; while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=1; while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     }
  else {
     i=max; while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=min; while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=1; while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
  s=abs(s1-s2);
    return(s);};
Добавлено через 1 минуту
обязательно выделять динамический массив?
0
titans2011
300 / 261 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 14:10 #6
На ваше усмотрение. Если вы делаете статический массив, то размер массива должна определять константа. Исходя из этого решайте. что вам лучше.
Это раз, а во вторых, что означает строка ?:
C++
1
2
3
 int i,n1,n2;
  cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
  cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
Переменные не проинициализированны, и если вы хотите ввести число, то нужно использовать cin.
0
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 14:28  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream>
#include<cstdlib> 
#include<cmath> 
using namespace std;
float Ploshad(float *x[],float *y[], const int n);
int main(){
    int i,n1,n2;
    cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1; 
    cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
    float *x1= new float [n1+1];
    float *y1= new float [n1+1];
    float *x2= new float [n2+1];
    float *y2= new float [n2+1];
    cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
    cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
    // ââîäèì êîîðäèГ*Г*ГІГ» âåðøèГ* 1 Г¬Г*îãîóãîëüГ*ГЁГЄГ*
    for(i=1;i<=n1;i++){
      cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<"  ";
      cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
    x1[n1+1]=x1[1];
    y1[n1+1]=y1[1];
      // ââîäèì êîîðäèГ*Г*ГІГ» âåðøèГ* 1 Г¬Г*îãîóãîëüГ*ГЁГЄГ*
    for(i=1;i<=n2;i++){
      cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<"  ";
      cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
    x2[n2+1]=x2[1];
    y2[n2+1]=y2[1];
    float s1,s2;
    s1=Ploshad(&x1,&y1,n1+1);
    cout<<"S1="<<s1;
    s2=Ploshad(&x2,&y2,n2+1);
    cout<<"S2="<<s2;
    delete []x1;
    delete []x2;
    delete []y1;
    delete []y2;
    return(0);};
 
float Ploshad(float *x[],float *y[], const int n){
 int min=1,max=1,i;
 // Г*Г*õîäèì ГЄГ°Г*Г©Г*ГЁГҐ âåðøèГ*Г» ГЇГ® îñè 0Гµ
 for(int i=0;i<=n;i++){
         if (x[min]<x[i]) min=i;
         if (x[max]>x[1]) max=i;};
 float s1=0, s2=0,s=0;
 // ïëîùГ*äü Г¬Г*îãîóãîëüГ*ГЁГЄГ*,  Г°Г*çáèâГ*Гї Г*Г* ГІГ°Г*ïåöèè ( 2 ñëó÷Г*Гї) 
 if (max>min) {
  i=min;    while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=max;    while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=1;      while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
 }
 else {
  i=max;     while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=min;     while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=1;       while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
   s=abs(s1-s2);
 return(s);};
выделил динамический массив, но сейчас выходит ошибка.Что сделано не так?
0
titans2011
300 / 261 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 14:32 #8
Указатели надо было разыменовывать. Привожу пример для первой ошибки, дальше уже сами исправите:
C++
1
2
3
4
5
6
  i=min;    
  while(i<max)
      {
      s1=s1+(*y[i+1]+*y[i])*(*x[i+1]-*x[i])/2;
      i++;
      };
1
09.08.2012, 14:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 14:32
Привет! Вот еще темы с ответами:

Вычислить площадь многоугольника - C++
Не могу понять почему VS 2015 всегда показывает площадь равную 0, в то время как dev C++ вычисляет её нормально. ...

Вычислить площадь простого многоугольника - C++
В первой строке вводится одно число N (3≤N≤100000). Далее в N строках задается по паре чисел – координаты очередной вершины простого...

Найти площадь вогнутого многоугольника - C++
пожалуйста, народ, помогите (подскажите) как найти площадь вогнутого многоугольника? при условии,что вершин больше 3.

Площадь выпуклого многоугольника методом триангуляции - C++
ребят помогите разработать программу для расчёта площади выпуклого многоугольника методом триангуляции (разбиения на треугольники) по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru