Форум программистов, компьютерный форум CyberForum.ru

Программа должна находить площадь произвольного многоугольника - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
08.01.2014, 02:19     Программа должна находить площадь произвольного многоугольника #1
Здравствуйте. Моя программа должна находит площадь произвольного многоугольника, с предварительной проверкой, можно ли построить его вообще. Если вводит количество сторон = 4, то пишет, что построить нельзя и соответственно ничего не считает, хотя координаты правильные. А для 5,6,7,8 и т.д. сторон вообще ничего не выдает, на вводе координат ее работа заканчивается. Если не сложно, помогите, пожалуйста, найти ошибку. Я думаю она в основной функции Void main(), там я вызываю подфункцию Proverka и проверяю ее значение, т.е. все ее вызову должны быть равны 1 для подсчитки площади, и которая с xy[k]... вызывается несколько раз, может я со скобками напутала? Все подпрограммы я составляла по формулам, должно быть все правильно.
C++ (Qt)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include<stdio.h>
#include<math.h>
float** create_xy(int n)
{
float** xy=new float*[n];
for(int i=0;i<n;i++)
xy[i]=new float[2];
return xy;
}
 
 
void Line(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4,float *x,float *y)
{
float A1,A2,B1,B2,C1,C2;
A1=y3-y1;A2=y4-y2;
B1=x1-x3;B2=x2-x4;
C1=x3*y1-x1*y3;
C2=x4*y2-x2*y4;
*x=(B1*C2-B2*C1)/(A1*B2-A2*B1);
*y=(C1*A2-C2*A1)/(A1*B2-A2*B1);
}
 
 
 
int Proverka(float x,float y,float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
{
float maxx,maxy,minx,miny;
maxx=x1;
maxy=y1;
minx=x1;
miny=y1;
 
if(x2>x1 && x2>x3 && x2>x4)
maxx=x2;
if(x2<x1 && x2<x3 && x2<x4)
minx=x2;
if(x3>x1 && x3>x2 && x3>x4)
maxx=x3;
if(x3<x1 && x3<x2 && x3<x4)
minx=x3;
if(x4>x1 && x4>x3 && x4>x2)
maxx=x4;
if(x4<x1 && x4<x3 && x4<x2)
minx=x4;
if(y2>y1 && y2>y3 && y2>y4)
maxy=y2;
if(y2<y1 && y2<y3 && y2<y4)
miny=y2;
if(y4>y1 && y4>y3 && y4>y2)
maxy=y4;
if(y4<y1 && y4<y3 && y4<y2)
miny=y4;
if(y3>y1 && y3>y2 && y3>y4)
maxy=y3;
if(y3<y1 && y3<y2 && y3<y4)
miny=y3;
 
 
if(x>minx && x<maxx && y>miny && y<maxy)
return 1;
else return 0;
}
 
void massive(float** xy,int n)
{
printf("Vvedite koordinaty vershin:\n");
 
for(int k=0; k<n; k++)
{
   scanf("%f",&xy[k][0]);
   scanf("%f",&xy[k][1]);
 
printf("Koordinats: x[%d] = %5.2f;  y[%d] = %5.2f \n",k+1, xy[k][0], k+1, xy[k][1]);
}
}
void main()
{
float **xy;
int n,k,i;
float S,x,y,S2;
float S1=0;
 
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
 
float** points;
points=create_xy(n);
massive(points,n);
 
for(k=0;k+3<n;k++)
if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
{
if(Proverka(xy[n-3][0],xy[n-3][1],xy[n-2][0],xy[n-2][1],xy[n-1][0],xy[n-1][1],xy[0][0],xy[0][1],x,y)==1)
for(i=0;i+1<n;i++)
{
S1=S1+((xy[i][0]-xy[i+1][0])*(xy[i][1]+xy[i+1][1]));
}
S2=S1+(xy[n-1][0]-xy[0][0])*(xy[n-1][1]+xy[0][1]);
S=0.5*abs(S2);
printf("S mnogougolnika = %5.2f",S);
}
else printf("Oshibka v vode koordinats");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 02:19     Программа должна находить площадь произвольного многоугольника
Посмотрите здесь:

C++ Найти площадь вогнутого многоугольника
Площадь многоугольника C++
Площадь многоугольника C++
C++ Кол - во точек с целочисленными координатами внутри (не включая границ) произвольного многоугольника
C++ Пользователь вводит 10 чисел программа должна выдать 2 максимальных(берём от 1 до 10,если выпадает 2 10,то программа должна выдать 2 10,а не 10,9)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.01.2014, 05:27     Программа должна находить площадь произвольного многоугольника #2
1>d:\my c++projects\lab\main.cpp(276): warning C4700: использована неинициализированная локальная переменная "y"
1>d:\my c++projects\lab\main.cpp(276): warning C4700: использована неинициализированная локальная переменная "x"
1>d:\my c++projects\lab\main.cpp(276): warning C4700: использована неинициализированная локальная переменная "xy"
...
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
14.01.2014, 11:10  [ТС]     Программа должна находить площадь произвольного многоугольника #3
alsav22, А не подскажите, где именно они неинициализированы? Я просмотрела программу, и в каждой подпрограмме в скобках написано, что они float, кроме подпрограмм Line и Provrka, там нет про xy, т.к. я там использую просто x1,y1 и т.д.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.01.2014, 11:21     Программа должна находить площадь произвольного многоугольника #4
C++
float x1;      // неинициализированная переменная
float x2 = 3.14; // инициализированная переменная
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 11:28     Программа должна находить площадь произвольного многоугольника #5
Цитата Сообщение от -Arabella- Посмотреть сообщение
А не подскажите, где именно они неинициализированы?
Вот здесь они неинициализированны (просто объявлены):
C++
1
2
3
4
5
6
7
8
...
void main()
{
float **xy; // !!!
int n,k,i;
float S,x,y,S2; // !!!
float S1=0;
...
А здесь они начинают использоваться, неинициализированными:
C++
1
2
3
4
...
for(k=0;k+3<n;k++)
if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
{...
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
14.01.2014, 11:29     Программа должна находить площадь произвольного многоугольника #6
У вас в main есть такая штука:
C++
1
float **xy;
Вот дальше по тексту вы ее используете, а вот где инициализируете не видно. Вы даже память не выделяете под это, и не присваиваете к ней другой динамический двумерный массив.
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
16.01.2014, 13:25  [ТС]     Программа должна находить площадь произвольного многоугольника #7
alsav22, Я инициализировала переменные x,y. Я ведь правильно понимаю, что им можно присваивать любые значения и они все равно поменяются в ходе программы?
C++ (Qt)
1
float S,x=1,y=1,S2;
А как мне инициализировать xy? Это же динамический массив и просто присваевать цифру не получается, у меня выскакивает ошибка
ShadowFirst,
Цитата Сообщение от ShadowFirst Посмотреть сообщение
Вы даже память не выделяете под это, и не присваиваете к ней другой динамический двумерный массив.
Я делаю его динамическим массивом в самом начале, и там я выделяю память
Цитата Сообщение от -Arabella- Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
float** create_xy(int n)
{
float** xy=new float*[n];
for(int i=0;i<n;i++)
xy[i]=new float[2];
return xy;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 13:43     Программа должна находить площадь произвольного многоугольника #8
Цитата Сообщение от -Arabella- Посмотреть сообщение
Я делаю его динамическим массивом в самом начале, и там я выделяю память
Указатель, который возвращается из функции create_xy(), присваивается, у вас в коде, указателю points (вот он, таким образом, инициализируется), а не указателю xy.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
16.01.2014, 14:54     Программа должна находить площадь произвольного многоугольника #9
Цитата Сообщение от -Arabella- Посмотреть сообщение
alsav22, Я инициализировала переменные x,y. Я ведь правильно понимаю, что им можно присваивать любые значения и они все равно поменяются в ходе программы?
C++ (Qt)
1
float S,x=1,y=1,S2;
А как мне инициализировать xy? Это же динамический массив и просто присваевать цифру не получается, у меня выскакивает ошибка
ShadowFirst,

Я делаю его динамическим массивом в самом начале, и там я выделяю память
Я вам говорил про:
C++
1
float **xy;
который находится в main
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
21.01.2014, 09:53  [ТС]     Программа должна находить площадь произвольного многоугольника #10
alsav22, ShadowFirst,
Я правильно инициализировала? Наверное, нет, программа все еще не считает площадь, если 4 стороны, то всегда выводит, что ошибка в воде, а если больше, то заканчивается на вводе координат
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
 
int n,k,i;
float S,x,y,S2;
float S1=0;
 
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
 
float** xy;
xy=create_xy(n);
massive(xy,n);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.01.2014, 14:52     Программа должна находить площадь произвольного многоугольника #11
Цитата Сообщение от -Arabella- Посмотреть сообщение
Я правильно инициализировала?
xy - правильно, а дальше не видно. Остался вопрос по инициализации x, y (передаются в Proverka() последними параметрами).
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
22.01.2014, 11:14  [ТС]     Программа должна находить площадь произвольного многоугольника #12
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
последними параметрами
Это как?)) Типо, то что я написала в программе x=1 y=1 и передаются эти значения? X и Y у меня должны вычисляться в подпрограмме Line и я их передаю по адресу
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.01.2014, 15:46     Программа должна находить площадь произвольного многоугольника #13
Цитата Сообщение от -Arabella- Посмотреть сообщение
Это как?)) Типо, то что я написала в программе x=1 y=1 и передаются эти значения?
Где здесь это?
Цитата Сообщение от -Arabella- Посмотреть сообщение
alsav22, ShadowFirst,
Я правильно инициализировала? Наверное, нет, программа все еще не считает площадь, если 4 стороны, то всегда выводит, что ошибка в воде, а если больше, то заканчивается на вводе координат
C++
1
2
3
4
5
6
7
8
9
10
void main()
{
int n,k,i;
float S,x,y,S2;
float S1=0;
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
float** xy;
xy=create_xy(n);
massive(xy,n);
Добавлено через 1 минуту
Ясновидящих тут нет, если что меняете, то выкладывайте код с изменениями, а потом вопросы задавайте.
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
22.01.2014, 21:39  [ТС]     Программа должна находить площадь произвольного многоугольника #14
alsav22, Извините, забыла)
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void main()
{
int n,k,i;
float S,x=1,y=1,S2;  \\ Вот здесь изменила, инициализировала x,y
float S1=0;
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
float** xy;
xy=create_xy(n);
massive(xy,n);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.01.2014, 23:32     Программа должна находить площадь произвольного многоугольника #15
Цитата Сообщение от -Arabella- Посмотреть сообщение
Типо, то что я написала в программе x=1 y=1 и передаются эти значения?
Если передаёте, то и передаются. Вот ваша функция Proverka():
C++
1
int Proverka(float x,float y,float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
Вот её первый вызов:
C++
1
2
3
4
for(k=0;k+3<n;k++)
if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
{
...
Два последних параметра - это x и y, которые вы инициализировали, перед этим, единицами.
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
24.01.2014, 00:52  [ТС]     Программа должна находить площадь произвольного многоугольника #16
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Два последних параметра - это x и y, которые вы инициализировали, перед этим, единицами.
Т.е. и передаются единицы?А мне не нужно, что бы единицы передавались, мне нужно, чтобы передавались найденные значения..
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 00:58     Программа должна находить площадь произвольного многоугольника #17
Цитата Сообщение от -Arabella- Посмотреть сообщение
мне нужно, чтобы передавались найденные значения..
Значит сначала находите значения, а потом вызывайте функцию Proverka().
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
24.01.2014, 12:30  [ТС]     Программа должна находить площадь произвольного многоугольника #18
alsav22, Но значения находятся в функции Line
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void Line(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4,float *x,float *y)
{
float A1,A2,B1,B2,C1,C2;
A1=y3-y1;A2=y4-y2;
B1=x1-x3;B2=x2-x4;
C1=x3*y1-x1*y3;
C2=x4*y2-x2*y4;
*x=(B1*C2-B2*C1)/(A1*B2-A2*B1); // вот здесь я их нахожу и передаю по значению, с указателем
*y=(C1*A2-C2*A1)/(A1*B2-A2*B1);
}
Вот я еще изменила, переставила x и y в Proverka в конец, как в ее вызове
C++ (Qt)
1
2
3
4
5
int Proverka(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4,float x,float y)
 
...
for(k=0;k+3<n;k++)
if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
И убрала присваивание 1 здесь
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void main()
{
int n,k,i;
float S,x,y,S2; *\\ Вот здесь изменила, инициализировала x,y
float S1=0;
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
float** xy;
xy=create_xy(n);
massive(xy,n);
Мне нужно как то инициализировать x и y в Void main? Они ведь были инициализированы в Line
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 18:31     Программа должна находить площадь произвольного многоугольника #19
Цитата Сообщение от -Arabella- Посмотреть сообщение
Они ведь были инициализированы в Line
Где у вас вызов Line()?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 20:16     Программа должна находить площадь произвольного многоугольника
Еще ссылки по теме:

найти площадь многоугольника C++
C++ Вычислить площадь простого многоугольника
Площадь выпуклого многоугольника методом триангуляции C++

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

Или воспользуйтесь поиском по форуму:
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
24.01.2014, 20:16  [ТС]     Программа должна находить площадь произвольного многоугольника #20
alsav22, Нигде.. я думала достаточно передачи по значению параметров. А где мне ее вызывать? В Proverka, там используются x и y или в Voin main? Или и там и там? А ее вызов должен так выглядеть?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
int n,k,i;
float S,x,y,S2; 
float S1=0;
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
float** xy;
xy=create_xy(n);
massive(xy,n);
Line(x,y);  Вызов Line
.....
Yandex
Объявления
24.01.2014, 20:16     Программа должна находить площадь произвольного многоугольника
Ответ Создать тему
Опции темы

Текущее время: 09:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru