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

Вычислить площадь выпуклого четырёхугольника ABCD - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
RT_BERSERKER
0 / 0 / 0
Регистрация: 07.09.2014
Сообщений: 13
07.09.2014, 10:07     Вычислить площадь выпуклого четырёхугольника ABCD #1
Задача на С++ (Не могу разобраться)

Нужно вычислить площадь выпуклого четырёхугольника ABCD, заданного длинами своих сторон a, b, c, d и одной из диагоналей e.
Нужно составить блок схему и саму программу,помогите с программой,и желательно бы объяснить,очень надеюсь на помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2014, 10:07     Вычислить площадь выпуклого четырёхугольника ABCD
Посмотрите здесь:

Площадь выпуклого многогранника методом триангуации по формуле Герона C++
Два треугольника заданы координатами своих вершин A,B,C. Вычислить площадь треугольника и определить какой треугольник имеет большую площадь C++
C++ Вычислить площадь круга
Вычислить площадь C++
Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Melg
416 / 152 / 62
Регистрация: 23.09.2013
Сообщений: 306
07.09.2014, 10:19     Вычислить площадь выпуклого четырёхугольника ABCD #2
Приветствую, для того чтобы я Вам помог разобраться - нужно выяснить, что же у Вас не получается и какими знаниями Вы обладаете на данный момент.
1) Пробовали ли Вы самостоятельно решить данную задачу хотябы на уровне алгоритма действий?
2) Какую формулу для вычисления площади четырехугольника Вы собираетесь использовать ? (я за неимением знаний в области полез в вики, и нашел https://upload.wikimedia.org/math/5/...d15fbe7895.png но там для вычисления площади предлагается формула использующая 4 стороны, плюс 2 диагонали - а в Вашей задаче указана только одна.
3) Вы действительно хотите разобраться или Вам нужно просто готовое решение для сдачи куда-нибудь.
RT_BERSERKER
0 / 0 / 0
Регистрация: 07.09.2014
Сообщений: 13
07.09.2014, 10:24  [ТС]     Вычислить площадь выпуклого четырёхугольника ABCD #3
Спасибо что откликнулись,
Там где я учусь,я посетил только первое занятие по программированию C++ и нам сразу дали такую задачу,а так как я не имею опыта,решить я ее сам не могу.
Какую формулу использовать - я не знаю,нам этого не сказали.Наверное любую,которая подойдет.
Мне нужно готовое решение и хочу знать как решать такие задачи,но если пояснить ход решения задачи не получается,то я был бы рад и просто готовому решению.
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 241
07.09.2014, 10:46     Вычислить площадь выпуклого четырёхугольника ABCD #4
Четырехугольник раскладывается на 2 треугольника, а площади треугольников находятся по формуле Герона.
Melg
416 / 152 / 62
Регистрация: 23.09.2013
Сообщений: 306
07.09.2014, 11:01     Вычислить площадь выпуклого четырёхугольника ABCD #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
#include <iostream>  //Директива препроцессора, нужна для использования std::cout, std::cin, std::endl;
#include <math.h> //Директива препроцессора, нужна для использования std::pow, std::sqrt;
 
using namespace std; //Строка, позволяющая не указывать явно std:: - пространство имен функций стандартной  библиотеки
 
int main() { // Функция, являющаяся точкой входа в программу
 
  int a = 0; // Объявление пермененных целого типа, которые нам потребуются для ввода от пользователя
  int b = 0; // Изначально переменные инициализируются значениями 0
  int c = 0;
  int d = 0;
  int e1 = 0;
  int e2 = 0;
 
  cout << "We will calculate the area of ​​a convex quadrilateral" << endl; // Выводит в консоль текст в кавычках,  endl - переводит на новую строку.
 
  cout << "Input a side length: " << endl;
  cin >> a; // Получает значение введенное в консоль и записывает его в переменную
 
 
  cout << "Input b  side length: " << endl;
  cin >> b;
 
  cout << "Input c  side length: " << endl;
  cin >> c;
 
  cout << "Input d  side length: " << endl;
  cin >> d;
 
  cout << "Input e1 diagonal length: " << endl;
  cin >> e1;
 
  cout << "Input e2 diagonal length: " << endl;
  cin >> e2;
 
  double diagonal_part = 4 * pow(e1, 2) * pow(e2, 2); // Объявление переменной diagonal_part которая будет хранить значение промежуточных вычислений. Переменная имеет тип double - значит она хранит представление числа с плавающей точкой двойной точности (аля 1.345)
  double side_part = pow(b, 2) + pow(d, 2) - pow(a, 2) - pow(c, 2); // pow(b, 2) возвращает результат возведения b в степень 2
  double square_s = (diagonal_part - pow(side_part, 2)) / 16;  
  double s = sqrt(square_s); // sqrt(square_s) возвращает корень квадратный от значения хранимого переменной square_s
 
  cout << "s = " << s << endl; // вывод финального значения на экран.
  return 0; // Возврат 0 из функции main в общем случае означает, что программа корректно завершила работу.
}
Тут очень много знаний которые скрыты от Вашего взгляда - я постарался поверхностно описать, что происходит в программе. Она выполняется сверху вниз с первой строки после main() {. Я использовал формулу, которую привел в первом сообщении. Советую Вам задать мне максимум вопросов по тому, что не понятно - для того чтобы Вы смогли самостоятельно изменить программу, если формула понадобится другая. В общем случае - стиль в котором написана данная программа, не приветствуется - но для абсолютного новичка характерен в силу уменьшенной сложности. (Не используются функции, все написано в функции main, повторяющиеся блоки кода)
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
07.09.2014, 11:27     Вычислить площадь выпуклого четырёхугольника ABCD #6
Цитата Сообщение от Melg Посмотреть сообщение
4 * pow(e1, 2) * pow(e2, 2)
ну неужели pow(e1,2) выглядит лучше, чем e1*e1?

И почему у Вас переменные имеют целый тип, а не действительный:
Цитата Сообщение от Melg Посмотреть сообщение
(diagonal_part - pow(side_part, 2)) / 16;
Если (diagonal_part - pow(side_part, 2)) меньше 16, то получится ноль.
Вряд ли это Вам понравится.
Melg
416 / 152 / 62
Регистрация: 23.09.2013
Сообщений: 306
07.09.2014, 11:45     Вычислить площадь выпуклого четырёхугольника ABCD #7

Не по теме:

pow(e1, 2) применен в педагогических целях - сегодня это e1*e1, а завтра это будет

C++
1
some_large_name_because_we_dont_know_std_library*some_large_name_because_we_dont_know_std_library *some_large_name_because_we_dont_know_std_library *some_large_name_because_we_dont_know_std_library



Добавлено через 14 минут
zss, diaglonal_part имеет тип double, pow возвращает тип double, - не вижу проблемы?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main() {
  double diagonal_part = 15.42d;
  int side_part  = 4;
  double square_s = (diagonal_part - pow(side_part, 2)) / 16;
  cout << "square_s = " << square_s << endl;
  return 0;
}
Вывод: square_s = -0.03625
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.09.2014, 11:59     Вычислить площадь выпуклого четырёхугольника ABCD #8
Цитата Сообщение от Melg Посмотреть сообщение
Вывод: square_s = -0.03625
Отрицательная площадь?
Цитата Сообщение от Melg Посмотреть сообщение
double diagonal_part = 15.42d;
Суффикса d нет в Стандарте C++. Это вообще расширение gcc. Для double суффикс не нужен. Вещественная константа по умолчанию имеет тип double.
gru74ik
Модератор
 Аватар для gru74ik
2999 / 1312 / 164
Регистрация: 20.02.2013
Сообщений: 3,742
Записей в блоге: 15
07.09.2014, 12:04     Вычислить площадь выпуклого четырёхугольника ABCD #9
Набросал на скорую руку:
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
#include <iostream>
#include <windows.h>
#include <math.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const int arrSize = 5;
    double x[arrSize];
    std::cout << "Здравствуйте! Вас приветствует программа, считающая площадь\n"
                 "выпуклого четырёхуголника ABCD, заданного длинами своих\n"
                 "сторон a, b, c, d и одной из диагоналей e." << std::endl;
    char side = 'a';
    for (int i=0; i<arrSize; ++i)
    {
        std::cout << "Введите длину " << side << ": ";
        std::cin >> x[i];
        ++side;
    }
    // a = x[0];
    // b = x[1];
    // c = x[2];
    // d = x[3];
    // e = x[4];
    double p1 = (x[0] + x[3] + x[4])/2;     // полупериметр первого треугольника
    double s1 = sqrt(p1*(p1-x[0])*(p1-x[3])*(p1-x[4])); // площадь первого треугольника
 
    double p2 = (x[1] + x[2] + x[4])/2;     // полупериметр второго треугольника
    double s2 = sqrt(p1*(p1-x[1])*(p1-x[2])*(p1-x[4])); // площадь второго треугольника
 
    double q_area = s1 + s2; // площадь четырёхугольника
 
    std::cout << "Площадь Вашего выпуклого четырёхугольника равна: " << q_area << std::endl;
 
    return 0;
}
Tulosba
07.09.2014, 12:08
  #10

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
using namespace std;
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
std::cout << // std:: на всякий пожарный?
:-)

Melg
416 / 152 / 62
Регистрация: 23.09.2013
Сообщений: 306
07.09.2014, 12:15     Вычислить площадь выпуклого четырёхугольника ABCD #11
Tulosba,
Отрицательная площадь?
Приведенный пример использовал похожие названия переменных, потому-что zss их употребил в контексте вопроса об округлении
Если (diagonal_part - pow(side_part, 2)) меньше 16, то получится ноль.
Я выбрав такие значения показал, что результат операции содержит необходимую дробную часть. В том числе при отрицательном значении. С формулой вычисления площади это имеет мало общего. Хотя в той формуле, которую я использовал https://upload.wikimedia.org/math/5/...d15fbe7895.png - можно воспроизвести некорректные значения, например при нулевых диагоналях и не нулевых сторонах. Я не стал перегружать свой код множеством дополнительных возможностей - в том числе проверкой корректности вводимых значений.

Суффикса d нет в Стандарте C++. Это вообще расширение gcc.
Не вижу в этом проблемы. Явным образом обозначил свои намерения с использованием расширения gcc - это был ответ на вопрос не касавшийся темы обсуждения на прямую.

Вещественная константа по умолчанию имеет тип double.
Не могли бы Вы привести текст стандарта, подтверждающий это утверждение?
gru74ik
Модератор
 Аватар для gru74ik
2999 / 1312 / 164
Регистрация: 20.02.2013
Сообщений: 3,742
Записей в блоге: 15
07.09.2014, 12:19     Вычислить площадь выпуклого четырёхугольника ABCD #12
Tulosba, с подачи местных гуру приучаю себя всегда писать std::Бла-бла-бла. А проект в Code::Blocks по умолчанию создаётся вот в таком виде:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
Просто забыл удалить строку using namespace std;

Правильно, конечно, так:
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 <iostream>
#include <windows.h>
#include <math.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const int arrSize = 5;
    double x[arrSize];
    std::cout << "Здравствуйте! Вас приветствует программа, считающая площадь\n"
                 "выпуклого четырёхуголника ABCD, заданного длинами своих\n"
                 "сторон a, b, c, d и одной из диагоналей e." << std::endl;
    char side = 'a';
    for (int i=0; i<arrSize; ++i)
    {
        std::cout << "Введите длину " << side << ": ";
        std::cin >> x[i];
        ++side;
    }
    // a = x[0];
    // b = x[1];
    // c = x[2];
    // d = x[3];
    // e = x[4];
    double p1 = (x[0] + x[3] + x[4])/2;     // полупериметр первого треугольника
    double s1 = sqrt(p1*(p1-x[0])*(p1-x[3])*(p1-x[4])); // площадь первого треугольника
 
    double p2 = (x[1] + x[2] + x[4])/2;     // полупериметр второго треугольника
    double s2 = sqrt(p1*(p1-x[1])*(p1-x[2])*(p1-x[4])); // площадь второго треугольника
 
    double q_area = s1 + s2;
 
    std::cout << "Площадь Вашего выпуклого четырёхугольника равна: " << q_area << std::endl;
 
    return 0;
}
Миниатюры
Вычислить площадь выпуклого четырёхугольника ABCD  
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.09.2014, 12:26     Вычислить площадь выпуклого четырёхугольника ABCD #13
Цитата Сообщение от Melg Посмотреть сообщение
Не могли бы Вы привести текст стандарта, подтверждающий это утверждение?
вот
2.14.4/1 ... The type of a floating literal is double unless explicitly specified by a suffix. ...
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
#include <math.h>
сишный хедер, для плюсов имеет смысл перейти на <cmath> со всеми вытекающими в виде пространства имен

gru74ik
Модератор
 Аватар для gru74ik
2999 / 1312 / 164
Регистрация: 20.02.2013
Сообщений: 3,742
Записей в блоге: 15
07.09.2014, 12:39     Вычислить площадь выпуклого четырёхугольника ABCD #14
И ещё у меня подозрение, что всё можно сделать покрасивше, если после того, как у пользователя запрошены данные, перегруппировать числа в массиве так, чтобы диагональ оказалась в центре массива (т.е. в элементе x[2]), стороны AB (a) и AD (d) в начале массива, а стороны BC (b) и CD (c) в конце массива. Тогда, наверное, можно строки кода 27-31 попробовать свести к одной функции.
AndrSlav
07.09.2014, 13:24
  #15

Не по теме:

Кстати, а не будет ли площадь зависеть от положения диагонали (AC или BD)?

Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,648
07.09.2014, 16:13     Вычислить площадь выпуклого четырёхугольника ABCD #16
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
/////////////////////////////////////////////////////////////////////////////////////////
//Нужно вычислить площадь выпуклого четырёхугольника ABCD, заданного длинами своих сторон 
//a, b, c, d и одной из диагоналей e.
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
const   T_str   COMMA_DELIM     =   ", ";
/////////////////////////////////////////////////////////////////////////////////////////
bool    successfully_for_triangle_with_sides_set_area
    (
        double      a,
        double      b,
        double      c,
        double  &   area
    )
{
    double  p   =   ( a + b + c ) / 2;
 
    area        =       p
                    *   ( p - a )
                    *   ( p - b )
                    *   ( p - c );
 
    bool    bool_res    =   area >= 0;
    area                =   sqrt( area );
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    calculate_area_and_print_results_for_tetragon_with_triangles
    (
        double  a,
        double  b,
        double  c,
 
        double  d,
        double  e,
        double  f
    )
{
    std::cout   <<  "Четырехугольник с треугольниками с длинами сторон ("
                <<  a   <<  COMMA_DELIM     <<  b   <<  COMMA_DELIM     <<  c   <<  ") и ("
                <<  d   <<  COMMA_DELIM     <<  e   <<  COMMA_DELIM     <<  f   <<  ")"
                <<  std::endl;
 
    double  area_abc    =   0;
    double  area_def    =   0;
 
    if  (
                successfully_for_triangle_with_sides_set_area( a, b, c, area_abc )
            &&  successfully_for_triangle_with_sides_set_area( d, e, f, area_def )
        )
    {
        std::cout   <<  " имеет площадь "
                    <<      area_abc
                        +   area_def
 
                    <<  ".";
    }
    else
    {
        std::cout   <<  "невозможен.";
    }
    std::cout   <<  std::endl
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    calculate_area_and_print_results_for_tetragon_with_sides_and_diagonal
    (
        double  a,
        double  b,
        double  c,
        double  d,
 
        double  e
    )
{
    std::cout   <<  "Длины сторон четырехугольника: ("
                <<  a   <<  COMMA_DELIM
                <<  b   <<  COMMA_DELIM
                <<  c   <<  COMMA_DELIM
                <<  d   <<  ")" <<  COMMA_DELIM
 
                <<  " длина диагонали "
                <<  e
                <<  "."
                <<  std::endl
                <<  std::endl;
 
    calculate_area_and_print_results_for_tetragon_with_triangles
        (
            a, b, e,
            c, d, e
        );
 
    calculate_area_and_print_results_for_tetragon_with_triangles
        (
            b, c, e,
            a, d, e
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     get_rand_val_from_segment
    (
        int     min_val,
        int     max_val
    )
{
    return  rand()  %   ( max_val - min_val + 1 ) + min_val;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    srand(unsigned(time(0)));
    const   int     SIDE_LEN_MIN    =   1;
    const   int     SIDE_LEN_MAX    =   5;
 
    calculate_area_and_print_results_for_tetragon_with_sides_and_diagonal
        (
            get_rand_val_from_segment( SIDE_LEN_MIN,    SIDE_LEN_MAX    ),
            get_rand_val_from_segment( SIDE_LEN_MIN,    SIDE_LEN_MAX    ),
            get_rand_val_from_segment( SIDE_LEN_MIN,    SIDE_LEN_MAX    ),
            get_rand_val_from_segment( SIDE_LEN_MIN,    SIDE_LEN_MAX    ),
            get_rand_val_from_segment( SIDE_LEN_MIN,    SIDE_LEN_MAX    )
        );
    std::cout   <<  std::endl;
 
    system("pause");
}
gru74ik
Модератор
 Аватар для gru74ik
2999 / 1312 / 164
Регистрация: 20.02.2013
Сообщений: 3,742
Записей в блоге: 15
08.09.2014, 06:45     Вычислить площадь выпуклого четырёхугольника ABCD #17
Цитата Сообщение от AndrSlav Посмотреть сообщение
Кстати, а не будет ли площадь зависеть от положения диагонали (AC или BD)?
Сам-то как думаешь? Есть разница как считать площадь нашего четырёхугольника: как сумму площадей треугольников ABD и BCD или как сумму треугольников ABC и ACD?
_Ivana
2174 / 1379 / 123
Регистрация: 01.03.2013
Сообщений: 4,116
Записей в блоге: 2
08.09.2014, 11:27     Вычислить площадь выпуклого четырёхугольника ABCD #18
Цитата Сообщение от gru74ik Посмотреть сообщение
Сам-то как думаешь?
А сам как думаешь? Если трудно в общем виде в буквах (хотя это несложное упражнение на уровне 7 класса), давай посчитаем в числах: пусть стороны четырехугольника (по часовой стрелке) равны 11, 11, 15, 15. А диагональ 20. Есть формула Герона, вот ее онлайн калькулятор.
gru74ik
08.09.2014, 13:23
  #19

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
А сам как думаешь?
Как я думаю? О_о

Я никак не думаю, я знаю. Думает AndrSlav, вроде как.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2014, 13:34     Вычислить площадь выпуклого четырёхугольника ABCD
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
_Ivana
08.09.2014, 13:34     Вычислить площадь выпуклого четырёхугольника ABCD
  #20

Не по теме:

Действительно, зачем думать, если знаешь. Эх, Семен Семеныч, чтож вас прошлые грабли ничему не учат!... И думать в том числе....

Yandex
Объявления
08.09.2014, 13:34     Вычислить площадь выпуклого четырёхугольника ABCD
Ответ Создать тему
Опции темы

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