Нахождение площади трапеции. Входные данные: стороны трапеции. Выходные данные: площадь трапеции.
Помогите, пожалуйста, написать программу. Я только начала разбираться в С++ и еще не разбираюсь во всем.
Можно какую-нибудь не особо сложную, и в программе должны быть проверки на отрицательные числа, и еще я думаю, что должна быть проверка на условие существование трапеции (то что каждая сторона меньше суммы трех других ее сторон)
буду очень сильно благодана за помощь)
у меня есть набросок программы, но он работает неккоректно, и там много глупых ошибок (может можно ее отредактировать)
// Площадь трапеции по её сторонам
#include
#include
#include
using namespace std;
int fun()
{
float a;
while (!(cin >> a) || (cin.peek() != '\n') || (a < 0));
{
cin.clear();
cin.ignore(10000, '\n');
cout << "Error!\n";
}
return a;
}
int fun2()
{
float b;
while (!(cin >> b) || (cin.peek() != '\n') || (b < 0));
{
cin.clear();
cin.ignore(10000, '\n');
cout << "Error!\n";
}
return b;
}
int fun3()
{
float c;
while (!(cin >> c) || (cin.peek() != '\n') || (c < 0));
{
cin.clear();
cin.ignore(10000, '\n');
cout << "Error!\n";
}
return c;
}
int fun4()
{
float d;
while (!(cin >> d) || (cin.peek() != '\n') || (d < 0));
{
cin.clear();
cin.ignore(10000, '\n');
cout << "Error!\n";
}
return d;
}
int main()
{
setlocale(LC_ALL, "Rus");
float a, b, c, d, S, dop1, dop2, dop3, dop4, dop5, dop6;
cout << " Введите первое основание трапеции: ";
a = fun();
cout << endl;
cout << " Введите второе основание трапеции: ";
b = fun2();
cout << endl;
cout << " Введите первую строну трапеции: ";
c = fun3();
cout << endl;
cout << " Введите вторую строну трапеции: ";
d = fun4();
cout << endl;
dop1 = (a - b) * (a - b) + c * c - d * d;
dop2 = 2 * (a - b);
dop3 = dop1 / dop2;
dop4 = dop3 * dop3;
dop5 = sqrt(c * c - dop4);
dop6 = (a + b) / 2;
S = dop6 * dop5;
cout << "Площадь трапеции равна: " << S << endl;
cout << endl;
return 0;
}
C/C++
Написать программу в С++ (нахождение площади трапеции)
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <utility>
#include <numeric>
using namespace std;
double length(istream& inp, const char* msg) {
auto value = 0.0;
while (value <= 0.0) {
cout << msg;
inp >> value;
inp.ignore(cin.rdbuf()->in_avail());
}
return value;
}
class Trapezoid {
public:
Trapezoid()
: a(0), b(0), c(0), d(0) {}
Trapezoid(const double a, const double b, const double c, const double d)
: a(a), b(b), c(c), d(d) {}
bool exist()const {
double box[]{ a, b, c, d };
sort(begin(box), end(box));
return accumulate(begin(box), begin(box) + 3, 0.0) > box[3] && height() > 0.0;
}
double height()const {
auto cc = c * c;
auto dd = d * d;
auto ba = b - a;
return cc - 0.25 * pow((cc - dd) / ba + ba, 2);
}
double area()const {
return 0.5 * (a + b) * height();
}
private:
double a, b, c, d;
friend istream& operator>>(istream& inp, Trapezoid& t) {
t.a = length(inp, "Меньшее основание: ");
t.b = length(inp, "Большое основание: ");
t.c = length(inp, "Первая сторона: ");
t.d = length(inp, "Вторая сторона: ");
if (t.c > t.d) swap(t.c, t.d);
return inp;
}
};
int main() {
system("chcp 1251 > nul");
Trapezoid trapezoid;
cin >> trapezoid;
if (trapezoid.exist()) {
auto area = trapezoid.area();
cout << "Площадь трапеции: " << fixed << setprecision(4) << area << '\n';
} else {
puts("Трапеция не существует!");
}
system("pause > nul");
}
#include <iostream>
#include <iomanip>
#include <utility>
#include <numeric>
using namespace std;
double length(istream& inp, const char* msg) {
auto value = 0.0;
while (value <= 0.0) {
cout << msg;
inp >> value;
inp.ignore(cin.rdbuf()->in_avail());
}
return value;
}
class Trapezoid {
public:
Trapezoid()
: a(0), b(0), c(0), d(0) {}
Trapezoid(const double a, const double b, const double c, const double d)
: a(a), b(b), c(c), d(d) {}
bool exist()const {
double box[]{ a, b, c, d };
sort(begin(box), end(box));
return accumulate(begin(box), begin(box) + 3, 0.0) > box[3] && height() > 0.0;
}
double height()const {
auto cc = c * c;
auto dd = d * d;
auto ba = b - a;
return cc - 0.25 * pow((cc - dd) / ba + ba, 2);
}
double area()const {
return 0.5 * (a + b) * height();
}
private:
double a, b, c, d;
friend istream& operator>>(istream& inp, Trapezoid& t) {
t.a = length(inp, "Меньшее основание: ");
t.b = length(inp, "Большое основание: ");
t.c = length(inp, "Первая сторона: ");
t.d = length(inp, "Вторая сторона: ");
if (t.c > t.d) swap(t.c, t.d);
return inp;
}
};
int main() {
system("chcp 1251 > nul");
Trapezoid trapezoid;
cin >> trapezoid;
if (trapezoid.exist()) {
auto area = trapezoid.area();
cout << "Площадь трапеции: " << fixed << setprecision(4) << area << '\n';
} else {
puts("Трапеция не существует!");
}
system("pause > nul");
}
Вадим Черкасов
Вы забыли в функции area() взять корень из значения height()
В чем проблема-то? Неправильно считает площадь?
Александр Иванов
да, проверка тоже неправильна, даже к нормальному числу, он пишет error
#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char **argv)
{
system("chcp 1251 > nul"); // Руссификация сообщений
setlocale(LC_ALL, "Russian");
double a, b, c, d, s;
cout << "a, b, c, d - основание большое и малое, стороны левая и правая" << endl;
cout << "Введите a, b, c, d через пробел = "; cin >> a >> b >> c >> d;
double n1= ((a-b)*(a-b) + c*c - d*d) / 2.0 * (a-b);
s= ((a+b)/2.0) * sqrt( c*c - n1*n1);
cout << "Площадь трапеции = " << s;
system("pause");
return 0;
}
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char **argv)
{
system("chcp 1251 > nul"); // Руссификация сообщений
setlocale(LC_ALL, "Russian");
double a, b, c, d, s;
cout << "a, b, c, d - основание большое и малое, стороны левая и правая" << endl;
cout << "Введите a, b, c, d через пробел = "; cin >> a >> b >> c >> d;
double n1= ((a-b)*(a-b) + c*c - d*d) / 2.0 * (a-b);
s= ((a+b)/2.0) * sqrt( c*c - n1*n1);
cout << "Площадь трапеции = " << s;
system("pause");
return 0;
}
За проверку входных данных отвечает отдельная функция Validate. Состоит из трех этапов:
1. Проверка знаков каждой из сторон
2. Сравнение каждой стороны с тремя другими
3. Две доп. проверки на отличие трапеции от общего случая четырехугольника.
Код написал простым. Но все на латинице, кириллица в коде - зло.
https://pastebin.com/YQnnfdbZ
P. S. 2 пункт можно исключить из функции. Он избыточен. Вариант без него:
https://pastebin.com/gH1xzuUH
1. Проверка знаков каждой из сторон
2. Сравнение каждой стороны с тремя другими
3. Две доп. проверки на отличие трапеции от общего случая четырехугольника.
Код написал простым. Но все на латинице, кириллица в коде - зло.
https://pastebin.com/YQnnfdbZ
P. S. 2 пункт можно исключить из функции. Он избыточен. Вариант без него:
https://pastebin.com/gH1xzuUH
Похожие вопросы
- Написать программу на С++ определения площади пятиугольника с заданными координатами его вершин.
- Написать программу на языке Си
- Написать программы на СИ
- Некорректно работает написанная программа
- Помогите написать программу на С++
- В LINUX OS Написать программу, которая из командной строки получает целое число N и некоторый текст “Text”.
- Помогите написать программу на С
- Помогите написать программу на C++
- Помогите написать программу на с++
- Помогите написать программу на с++