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

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

Войти
Регистрация
Восстановить пароль
 
nike64n
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 11
#1

Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) - C++

06.07.2012, 18:26. Просмотров 989. Ответов 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
 
int main(int argc, char* argv[])
{
//----------------------------------------------------------
 float A[100][2];
 int n;
 cout << "n="; cin>>n;
 for(int i=0; i<n; i++)
  {for(int j=0; j<2; j++)
   for(int k=0; k<4; k++)
    {cout<<"["<<i<<"]"<<"["<<j<<"]"<<"["<<k<<"]="; cin>>A[i] [j] [k];}
  }
//----------------------------------------------------------
 
  float S=0, So=0, s1, s2, s3, p, p1, p2, p3,  a, b, c, d, l, f;
  int r=(n-3);
  int v=0, w=0, x1, x2, x3, y1, y2, y3;
 
//----------------------------------------------------------
 
  for (int i=0; i<n-2; i++)
   for (int j=i+1; j<n-1; j++)
    for (int k=j+1; k<n; k++)
   {    v=0;
        w=0;
        {
           a=sqrt(pow((A[i][0]-A[j][0]),2)+pow((A[i][1]-A[j][1]),2));
           b=sqrt(pow((A[j][0]-A[k][0]),2)+pow((A[j][1]-A[k][1]),2));
           c=sqrt(pow((A[k][0]-A[i][0]),2)+pow((A[k][1]-A[i][1]),2));
 
           p=((a+b+c)/2);
           S=sqrt(p*(p-a)*(p-b)*(p-c));
 
 
           for (int z=0; z<n; z++)
            {
             if((z!=i)&&(z!=j)&&(z!=k))
             {
 
               d=sqrt(pow((A[i][0]-A[z][0]),2)+pow((A[i][1]-A[z][1]),2));
               l=sqrt(pow((A[j][0]-A[z][0]),2)+pow((A[j][1]-A[z][1]),2));
               f=sqrt(pow((A[k][0]-A[z][0]),2)+pow((A[k][1]-A[z][1]),2));
 
               p1=((a+l+d)/2);
               s1=sqrt(p1*(p1-a)*(p1-l)*(p1-d));
 
               p2=((b+l+f)/2);
               s2=sqrt(p2*(p2-b)*(p2-l)*(p2-f));
 
               p3=((c+d+f)/2);
               s3=sqrt(p3*(p3-c)*(p3-d)*(p3-f));
 
               So=s1+s2+s3;
 
               if(S==So) v++;
               else w++;
 
               }
             }
 
            int h=abs(v-w);
             if(h<r)
              { r=h;
                x1=A[i][0]; y1=A[i][1];
                x2=A[j][0]; y2=A[j][1];
                x3=A[k][0]; y3=A[k][1];
           }
        }
     }
 
   cout<<"A=("<<x1<<" ; "<<y1<<")\n";
   cout<<"B=("<<x2<<" ; "<<y2<<")\n";
   cout<<"C=("<<x3<<" ; "<<y3<<")\n";
   }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 18:26     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...)
Посмотрите здесь:
C++ Из заданного на плоскости множества точек выбрать три различные точки
C++ Из заданного на плоскости множества точек выбрать три различные точки
Из заданного множества точек на плоскости выбрать две различные точки так C++
C++ Из заданного множества точек на плоскости выбрать две различные точки
Из заданного множества точек на плоскости выбрать три разные точки A, B, C C++
C++ Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные точки заданного множества точек на плоскости
C++ Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
22457 / 10862 / 1769
Регистрация: 12.02.2012
Сообщений: 17,990
06.07.2012, 18:58     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #2
Дело может быть вот в этом операторе:

C++
1
2
if(S==So) v++;
               else w++;
При сравнении чисел с плавающей точкой лучше писать вот так:

C++
1
2
if (fabs(S-So) <= 1.0E-8) v++;
   else w++;
Само собой, при этом нужно подключить "math.h"

А вот это что:

C++
1
2
3
4
for(int i=0; i<n; i++)
  {for(int j=0; j<2; j++)
   for(int k=0; k<4; k++)
    {cout<<"["<<i<<"]"<<"["<<j<<"]"<<"["<<k<<"]="; cin>>A[i] [j] [k];}
Массив A - трехмерный?
nike64n
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 11
07.07.2012, 10:40  [ТС]     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #3
массив А 2 мерный исправил подключил math.h всё равно на 8 и 15 строку ругаеться


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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <math.h>
int main(int argc, char* argv[])
{
//----------------------------------------------------------
 float A[100][2];
 int n;
 cout<<"n="; cin>>n;
 for(int i=0; i<n; i++)
  {for(int j=0; j<2; j++)
    {cout<<"["<<i<<"]"<<"["<<j<<"]="; cin>>A[i][j];}
  }
//----------------------------------------------------------
 
  float S=0, So=0, s1, s2, s3, p, p1, p2, p3, k, a, b, c, d, l, f;
  int r=(n-3);
  int v=0, w=0, x1, x2, x3, y1, y2, y3;
 
//----------------------------------------------------------
 
  for (int i=0; i<n-2; i++)
   for (int j=i+1; j<n-1; j++)
    for (int k=j+1; k<n; k++)
   {    v=0;
        w=0;
        {
           a=sqrt(pow((A[i][0]-A[j][0]),2)+pow((A[i][1]-A[j][1]),2));
           b=sqrt(pow((A[j][0]-A[k][0]),2)+pow((A[j][1]-A[k][1]),2));
           c=sqrt(pow((A[k][0]-A[i][0]),2)+pow((A[k][1]-A[i][1]),2));
 
           p=((a+b+c)/2);
           S=sqrt(p*(p-a)*(p-b)*(p-c));
 
 
           for (int z=0; z<n; z++)
            {
             if((z!=i)&&(z!=j)&&(z!=k))
             {
 
               d=sqrt(pow((A[i][0]-A[z][0]),2)+pow((A[i][1]-A[z][1]),2));
               l=sqrt(pow((A[j][0]-A[z][0]),2)+pow((A[j][1]-A[z][1]),2));
               f=sqrt(pow((A[k][0]-A[z][0]),2)+pow((A[k][1]-A[z][1]),2));
 
               p1=((a+l+d)/2);
               s1=sqrt(p1*(p1-a)*(p1-l)*(p1-d));
 
               p2=((b+l+f)/2);
               s2=sqrt(p2*(p2-b)*(p2-l)*(p2-f));
 
               p3=((c+d+f)/2);
               s3=sqrt(p3*(p3-c)*(p3-d)*(p3-f));
 
               So=s1+s2+s3;
 
               if (fabs(S-So) <= 1.0E-8) v++;
               else w++;
 
               }
             }
 
            int h=fabs(v-w);
             if(h<r)
              { r=h;
                x1=A[i][0]; y1=A[i][1];
                x2=A[j][0]; y2=A[j][1];
                x3=A[k][0]; y3=A[k][1];
           }
        }
     }
 
   cout<<"A=("<<x1<<" ; "<<y1<<")\n";
   cout<<"B=("<<x2<<" ; "<<y2<<")\n";
   cout<<"C=("<<x3<<" ; "<<y3<<")\n";
   }
Добавлено через 14 часов 33 минуты
подключил using namespace std; всё заработало спасибо!
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 12:49     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #4
Цитата Сообщение от nike64n Посмотреть сообщение
всё заработало спасибо!
А у меня не заработало. Не может определить перегрузку функции здесь:
C++
1
int h=fabs(v-w);
Если объявить v и w как float, то только семь раз warning, что "преобразование "float" в "int", возможна потеря данных".
Catstail
Модератор
22457 / 10862 / 1769
Регистрация: 12.02.2012
Сообщений: 17,990
07.07.2012, 19:46     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #5
"int h=fabs(v-w);" - а зачем ты описываешь h как int? Опиши как float или double.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 03:46     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #6
Цитата Сообщение от Catstail Посмотреть сообщение
"int h=fabs(v-w);" - а зачем ты описываешь h как int? Опиши как float или double.
Это не я описываю, а тот у кого "...всё заработало спасибо!" Я и удивляюсь, как это у него зарабало, если так описано.
nike64n
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 11
08.07.2012, 11:22  [ТС]     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #7
исправил спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 12:42     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...)
Еще ссылки по теме:
C++ На плоскости задано множество точек. Выбрать три различные точки так, чтобы проходящая через них окружность делила это множество на группы
Из задоного множества точек на плоскости выбрать две различные точки C++
C++ Из заданного на плоскости множества точек выбрать такие три, которые составляют треугольник наибольшего периметра.
Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные точки заданного множества точук на плоскости C++
C++ Выбрать 3 разные точки заданного на плоскости множества точек,составляющие треугольник наибольшего периметра

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

Или воспользуйтесь поиском по форуму:
ilyashis
-36 / 0 / 1
Регистрация: 08.12.2011
Сообщений: 137
04.12.2012, 12:42     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) #8
обьясните пожалуйста каждуюстрочку этой программы
или хотябы какая переменная находит разницу?
Yandex
Объявления
04.12.2012, 12:42     Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...)
Ответ Создать тему
Опции темы

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