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

Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
26.10.2010, 21:34     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #1
Даны целые числа x1, y1, x2, y2, ...xn, yn.Выяснить, найдутся ли среди точек с координатами (x1;y1), (x2;y2),...(xn;yn) четыре таких, которые являются вершинами квадрата.Определить подпрограммы вычисления расстояния между 2-мя точками, определения взаимного расположения прямых и другие, необходимые для решения.
Решение на С++ должно быть, не получается.....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2010, 21:34     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата
Посмотрите здесь:

C++ Даны четыре точки А1(x1, y1), А2(x2, y2), А3(x3, y3), А4(x4, y4). Определить будут ли они вершинами параллелограмма.
Даны 6 действительных чисел a,b,c,d,e,f,которые являются координатами R(a,b),S(c,d),T(e,f) трёх точек R,S и T на плоскости. (Блок схема) C++
C++ Диагонали (Четыре точки являются вершинами параллелограмма. Определить длину диагоналей и найти координаты )
C++ Даны натуральное число n, целые числа а(1),…., a(n). Выяснить, имеются ли среди чисел а(1),… a(n) совпадающие.
Даны целые положительные числа аь а2,., а„. Найти среди них те, которые являются квадратами некоторого числа т C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
28.10.2010, 20:28  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #2
Напишите пожалуйста используя синтаксис типа библиотек <stdio.h> и printf и scanf....f то я только начинающий и программирую на версии С++ 3.1

Добавлено через 2 часа 17 минут
Точнее мне нужноименно на чистом СИ...
Sudoki
124 / 64 / 1
Регистрация: 19.04.2010
Сообщений: 196
28.10.2010, 20:53     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #3
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
#include <stdio.h>
#include <math.h>
 
struct POINT
{
    int x, y;
};
 
struct LINE
{
    POINT p1, p2;
};
 
struct QUARE
{
    POINT topLeft, bottomRight;
};
 
//Растояние между точками
float distance( POINT p1, POINT p2)
{
    return sqrt( (p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y) );
};
 
//проверка паралельности прямых
bool parallel(LINE l1, LINE l2)
{
    bool p;
    //A1*B2-A2*B1
    p = (l1.p1.y - l1.p2.y)*(l2.p2.x - l2.p1.x) - (l2.p1.y - l2.p2.y)*(l1.p2.x - l1.p1.x);
    return p?false:true;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    return 0;
}
Это начало
про линии можешь почитать на
http://ru.wikipedia.org/wiki/Прямая

квадрат чет пока не знаю
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
28.10.2010, 21:12  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #4
Спасибо...напиши про квадраты если что еще....
Sudoki
124 / 64 / 1
Регистрация: 19.04.2010
Сообщений: 196
28.10.2010, 21:32     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//проверка квадрата
/*
   tl _____ tr
     |       |
     |____|
   bl         br
*/
bool isquare(POINT tl, POINT bl, POINT br, POINT tr)
{
    if( tl.x!=tr.x && bl.x!=br.x ) return false;
    if( tl.y!=bl.y && tr.y!=br.y ) return false;
    return true;
};
можно так проверить

Добавлено через 4 минуты
на растояния надо проверить стороны между собой.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
bool isquare(POINT tl, POINT bl, POINT br, POINT tr)
{
        if( tl.x!=tr.x && bl.x!=br.x ) return false;
        if( tl.y!=bl.y && tr.y!=br.y ) return false;
        if( distance(tl, tr)!=distance(tl, bl) ) return false;
        return true;
};
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
30.10.2010, 00:25  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #6
int _tmain(int argc, _TCHAR* argv[]) а что это значит?Я про структуры понял и программа впринципе понятна, только на досе она выдает синтаксические ошибкки и в выше указанной строке тоже, и что она значит...?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2010, 00:57     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #7
Berens, int argc - колличество аргументов коммандной строки
argv - сами аргументы
_TCHAR - использует unicode, если он включен или просто char если выключен
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
30.10.2010, 01:07  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #8
В данном контексте не понимаю как он используется....
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2010, 02:29     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #9
Berens, Никак. Абсолютно. Вообще это используется, чтобы вводить аргументы с коммандной строки.
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
30.10.2010, 07:38  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #10
А здесь его не нужно заменить или просто выкинуть можно?
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
30.10.2010, 14:16     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #11
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
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//////////////////////////////////////////////////////////////////////////////////////
//Даны целые числа x1, y1, x2, y2, ...xn, yn.Выяснить, найдутся ли среди точек 
//с координатами (x1;y1), (x2;y2),...(xn;yn) четыре таких, которые являются 
//вершинами квадрата.Определить подпрограммы вычисления расстояния между 2-мя точками, 
//определения взаимного расположения прямых и другие, необходимые для решения.
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <iterator>
#include <set>
//////////////////////////////////////////////////////////////////////////////////////
struct  T_int_point
{
    int X_;
    int Y_;
    //--------------------------------------------------------------------------------
    T_int_point(int X, int Y) : X_(X), Y_(Y)
    {}
    //--------------------------------------------------------------------------------
    T_int_point  operator+(T_int_point  p) const
    {
        int  X_res = X_ + p.X_;
        int  Y_res = Y_ + p.Y_;
        return  T_int_point(X_res, Y_res);
    }
    //--------------------------------------------------------------------------------
    T_int_point  operator-(T_int_point  p) const
    {
        int  X_res = X_ - p.X_;
        int  Y_res = Y_ - p.Y_;
        return  T_int_point(X_res, Y_res);
    }
    //--------------------------------------------------------------------------------
    void  print() const
    {
        std::cout << "("
                  << X_
                  << ", "
                  << Y_
                  << ")";
    }
    //--------------------------------------------------------------------------------
    bool  operator< (T_int_point  p) const
    {
        return  X_ == p.X_ ? Y_ < p.Y_ : X_ < p.X_;
    }
};
//////////////////////////////////////////////////////////////////////////////////////
typedef  std::set<T_int_point>   T_int_points;
typedef  std::set<T_int_points>  T_squares;
//////////////////////////////////////////////////////////////////////////////////////
T_int_point  vect(const T_int_point  A, const T_int_point  B)
{
    return  B - A;
}
//////////////////////////////////////////////////////////////////////////////////////
int dist_a_square(const T_int_point  A, const T_int_point  B)
{
    T_int_point  vect_AB = vect(A, B);
    return  vect_AB.X_ * vect_AB.X_ + vect_AB.Y_ * vect_AB.Y_;
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_points_forming_squares(const T_int_points&  int_points)
{ 
    T_squares  squares;
    //Перебираем все сочетания по две точки в поисках гипотенузы 
    //прямоугольного треугольника:
    for(T_int_points::const_iterator  A_hip_it = int_points.begin(); 
        A_hip_it != int_points.end(); ++A_hip_it)
    {
        for(T_int_points::const_iterator  B_hip_it = A_hip_it; 
            B_hip_it != int_points.end(); ++B_hip_it)
        {
            if(B_hip_it == A_hip_it)
            {
                continue;
            }
            //Перебираем все точки множества в поисках вершины
            //для предполагаемой гипотенузы прямоугольного треугольника.
            for(T_int_points::const_iterator  C_it = int_points.begin();  
                C_it != int_points.end(); ++C_it)
            {
                if(    C_it == A_hip_it
                    || C_it == B_hip_it)
                {
                    continue;
                }
                //Проверяем, образуют ли точки равнобедренный 
                //прямоугольный треугольник с гипотенузой AB.
                int AB_hip_len2 = dist_a_square(*A_hip_it, *B_hip_it);
                int AC_cat_len2 = dist_a_square(*A_hip_it, *C_it);
                int BC_cat_len2 = dist_a_square(*B_hip_it, *C_it);
 
                if(AC_cat_len2 == BC_cat_len2
                   && AB_hip_len2 == AC_cat_len2 + BC_cat_len2)
                {
                    T_int_point  D = *C_it + vect(*C_it, *B_hip_it) + vect(*C_it, *A_hip_it);                    
                    //Если точка, дополняющая прямоугольный 
                    //треугольник до квадрата существует:
                    if(int_points.find(D) != int_points.end())
                    {
                        T_int_points  square;
                        square.insert(*A_hip_it);                        
                        square.insert(*B_hip_it);
                        square.insert(*C_it);
                        square.insert(D);
 
                        squares.insert(square);
                    }
                }
            }
        }
    }
 
    std::cout << (squares.empty() 
                      ? "Нет вершин квадратов."
                      : "В данном множестве точек являются вершинами квадратов:")
              << std::endl;
 
    //Печатаем все квадраты из squares:   
    for(T_squares::iterator  square_it = squares.begin(); 
        square_it != squares.end(); ++square_it)
    {
        std::cout << "квадрат № "                  
                  << std::distance(squares.begin(), square_it) + 1
                  << "\t\t";
        for(T_int_points::const_iterator  vertice_it = square_it->begin(); 
            vertice_it != square_it->end(); ++vertice_it)
        {
            
            vertice_it->print();
            std::cout << "    ";
        }
        std::cout << std::endl
                  << std::endl
                  << std::endl;
    }    
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int  POINTS_IN_SQUARE = 4;
    int  n;
    do
    {
        std::cout << "Введите количество точек >= "
                  << POINTS_IN_SQUARE
                  << ": ";
        std::cin >> n;
    }while(n < POINTS_IN_SQUARE);
    
    std::cout << "Введите целые координаты "
              << n
              << " различных точек: "
              << std::endl;
 
    T_int_points  int_points;
    do
    {
        std::cout << "X" 
                  << int_points.size() + 1 
                  << " = ";
        int x = 0;
        std::cin >> x;
 
        std::cout << "Y"
                  << int_points.size() + 1 
                  << " = ";
        int y = 0;
        std::cin >> y;
        std::cout << std::endl;
        int_points.insert(T_int_point(x, y));
    }while(static_cast<int>(int_points.size()) < n);
 
    print_points_forming_squares(int_points);
}
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
30.10.2010, 21:07  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #12
Спасибо но я ж уточнил поом что на чистом СИ мне надо
Berens
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 27
01.11.2010, 08:41  [ТС]     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #13
И если не трудно, можно составить блок схему, но по решению на СИ а не на СИ++....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 13:01     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата
Еще ссылки по теме:

C++ Даны целые числа a1, a2, ., an. Получить те положительные числа из этой последовательности, которые являются полными квадратами
C++ Даны четыре разных числа. Найти среди них два наибольших
Даны действительные числа a1, ., an. (n>=2 и заранее неизвестно). Выяснить, имеются ли среди чисел a1, ., C++

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

Или воспользуйтесь поиском по форуму:
Leer
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 8
11.11.2011, 13:01     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата #14
Мне нужно решить подобную задачу на прологе: Даны целые числа х1,у1, х2,у2, ... хn,уn. Выяснить, найдуться ли среди точек с координатами (х1,у1)...(хn,уn) четыре таких, которые являются вершинами квадрата. помогите пожалуйста!!!!!
Yandex
Объявления
11.11.2011, 13:01     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата
Ответ Создать тему
Опции темы

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