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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
RT_BERSERKER
0 / 0 / 0
Регистрация: 07.09.2014
Сообщений: 13
#1

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

07.09.2014, 10:07. Просмотров 2627. Ответов 32
Метки нет (Все метки)

Задача на С++ (Не могу разобраться)

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

Площадь четырёхугольника - C++
Определить площадь четырёхугольника с вершинами A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4). Входные данные В одной строке заданы...

Площадь четырёхугольника - C++
На е-олимпе задача засчиталась на 70%. Чего тут не хватает? #include <iostream> #include <cmath> #include <stdlib.h> #include...

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

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

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

По заданным координатам вершин прямоугольника ABCD найти его площадь и периметр - C++
Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и периметр. Напишите пожалуйста полностью...

32
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
07.09.2014, 10:19 #2
Приветствую, для того чтобы я Вам помог разобраться - нужно выяснить, что же у Вас не получается и какими знаниями Вы обладаете на данный момент.
1) Пробовали ли Вы самостоятельно решить данную задачу хотябы на уровне алгоритма действий?
2) Какую формулу для вычисления площади четырехугольника Вы собираетесь использовать ? (я за неимением знаний в области полез в вики, и нашел https://upload.wikimedia.org/math/5/...d15fbe7895.png но там для вычисления площади предлагается формула использующая 4 стороны, плюс 2 диагонали - а в Вашей задаче указана только одна.
3) Вы действительно хотите разобраться или Вам нужно просто готовое решение для сдачи куда-нибудь.
0
RT_BERSERKER
0 / 0 / 0
Регистрация: 07.09.2014
Сообщений: 13
07.09.2014, 10:24  [ТС] #3
Спасибо что откликнулись,
Там где я учусь,я посетил только первое занятие по программированию C++ и нам сразу дали такую задачу,а так как я не имею опыта,решить я ее сам не могу.
Какую формулу использовать - я не знаю,нам этого не сказали.Наверное любую,которая подойдет.
Мне нужно готовое решение и хочу знать как решать такие задачи,но если пояснить ход решения задачи не получается,то я был бы рад и просто готовому решению.
0
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 267
07.09.2014, 10:46 #4
Четырехугольник раскладывается на 2 треугольника, а площади треугольников находятся по формуле Герона.
1
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
07.09.2014, 11:01 #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, повторяющиеся блоки кода)
0
zss
Модератор
Эксперт С++
6483 / 6046 / 1983
Регистрация: 18.12.2011
Сообщений: 15,676
Завершенные тесты: 1
07.09.2014, 11:27 #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, то получится ноль.
Вряд ли это Вам понравится.
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
07.09.2014, 11:45 #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
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.09.2014, 11:59 #8
Цитата Сообщение от Melg Посмотреть сообщение
Вывод: square_s = -0.03625
Отрицательная площадь?
Цитата Сообщение от Melg Посмотреть сообщение
double diagonal_part = 15.42d;
Суффикса d нет в Стандарте C++. Это вообще расширение gcc. Для double суффикс не нужен. Вещественная константа по умолчанию имеет тип double.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4189 / 1837 / 198
Регистрация: 20.02.2013
Сообщений: 4,976
Записей в блоге: 21
07.09.2014, 12:04 #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;
}
0
Tulosba
07.09.2014, 12:08
  #10

Не по теме:

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

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

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

Вещественная константа по умолчанию имеет тип double.
Не могли бы Вы привести текст стандарта, подтверждающий это утверждение?
0
gru74ik
Модератор
Эксперт CЭксперт С++
4189 / 1837 / 198
Регистрация: 20.02.2013
Сообщений: 4,976
Записей в блоге: 21
07.09.2014, 12:19 #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;
}
0
Миниатюры
Вычислить площадь выпуклого четырёхугольника ABCD  
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.09.2014, 12:26 #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> со всеми вытекающими в виде пространства имен

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2014, 13:24
Привет! Вот еще темы с ответами:

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

Два треугольника заданы координатами своих вершин A,B,C. Вычислить площадь треугольника и определить какой треугольник имеет большую площадь - C++
Два треугольника заданы координатами своих вершин A,B,C. Вычислить площадь треугольника и определить какой треугольник имеет большую...

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга - C++
Напишите код в C++ Пожалуйста :confusion:

Найти длины диагоналей четырёхугольника - C++
4) Известны координаты вершин некоторого четырёхугольника А(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4). Найти длины диагоналей этого...


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

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

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