Вычислить периметр, площадь и гипотенузу треугольника, если задан катет и противолежащий угол - C (СИ)
Формулировка задачи:
здравствуйте.
есть одна из задач, безусловно, легкая, но я совершенно забыл за несколько лет даже основы алгебры и геометрии. суть такова - нужно написать универсальную программу, просчитывающую возможность вычислений и вычисляющую
периметр, площадь и гипотенузу треугольника
, при условии, что известны только катет и противолежащий к нему угол. Катет - 2,8 м, угол 68°20'. угол нужно переводить в радианную меру, проверка на допустимость вычислений может быть реализована как несколькими вложенными операторами ветвления, так и одним оператором ветвления с использованием составного логического высказывания. погуглив я пришел к выводу, что гипотенузу можно найти по формуле c=a/sinA. больше пока идей нет. заранее спасибо, если кто сможет помочьРешение задачи: «Вычислить периметр, площадь и гипотенузу треугольника, если задан катет и противолежащий угол»
textual
Листинг программы
#include <iostream>
#include <fstream> // библиотека для работы с файловыми потоками
#include <math.h> // библиотека для работы с математическими функциями
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
cout << "автор: ***" << endl;
double kat1, kat2, hyp, S, P, rad;
int deg, min;
cout << "введите значение известного катета:"; cin >> kat1; //ввод значения катета треугольника
cout << "Введите значение градусов и минут: "; cin >> deg >> min; //ввод значения градусов угла, при ведении данных с точкой - минуты запрашиваются снова
if (deg = 0 || deg = 90) cout << "данные введены некорректно/ неприменимы для решения этой задачи. введите данные повторно: \n "; && cout << "Введите значение градусов и минут: "; cin >> deg >> min; else cout << "данные применимы к решению этой задачи)";
double deg2 = deg + (min * 1) / 60; // функция переведения значений угла в целые градусы
rad = (deg2*3.141592358) / 180; // переводим градусы в радианы
double rad2 = (90 * 3.141592358) / 180; // перевели в радианы прямоугольный угол
double cor2 = 180 - (deg2 + 90); // находим третий угол
double rad3 = (cor2*3.141592358) / 180; // перевели в радианы третий угол
hyp = kat1 / (sin(rad)); // находим гипотенузу
kat2 = sqrt((hyp*hyp) - (kat1*kat1)); // находим второй катет
S = (kat1*kat2) / 2; // находим площадь треугольника
P = kat1 + kat2 + hyp; // находим периметр треугольника
cout << "в радианной мере известный угол будет равен " << rad << endl;
cout << "в радианной мере прямой угол будет равен " << rad2 << endl;
cout << "и неизвестный угол будет равен " << rad3 << endl;
cout << "гипотенуза треугольника равна " << hyp << endl;
cout << "неизвестный катет треугольника " << kat2 << endl;
cout << "площадь треугольника равна " << S << endl;
cout << "и периметр треугольника равен " << P << endl;
int n;
fstream f("****.txt", ios::out); // двунаправленный файловый поток f,
// файл *filename*.txt открыт на запись, если его не было, он будет создан
// в текущем каталоге – в папке проекта, содержащей исходный код
// Можно указать полный путь к файлу, например: "C:/My_file.txt"
// файл пишется на диск D: ввиду особенностей поведения Windows 8.1 и прав доступа к диску C:
cout << "\n*****************************\n";
cout << "записать в файл? y/n" << endl;
cin >> n;
f << "значение катетов " << kat1 << " ; " << kat2 << endl; // фоном (без отображения для конечного пользователя) пишем в файл значение катетов для проверки вычислений
f << "значение углов " << deg << "," << min << " ; " << cor2 << " ; " << "90" << endl; // фоном (без отображения для конечного пользователя) пишем в файл значение углов для проверки вычислений
f << "значение градусов в радианах " << rad << " ; " << rad2 << " ; " << rad3 << " ; " << endl; // фоном (без отображения для конечного пользователя) пишем в файл значение уголв в радианной мере для проверки вычислений
f << "значение гипотенузы " << hyp << endl; // фоном (без отображения для конечного пользователя) пишем в файл значение гипотенузы
f << "площадь треугольника " << S << endl; // фоном (без отображения для конечного пользователя) пишем в файл значение площади треугольника
f << "периметр треугольника " << P << endl; // фоном (без отображения для конечного пользователя) пишем в файл значение периметра треугольника
f.close(); //закрыли файловый поток f и файл My_file.txt
fstream g("****.txt", ios::in);//двунаправленный файловый поток
// файл с именем *filename*.txt открыт на чтение; он должен находиться
// по указанному пути, в случае отсутствия в переменную n ничего
// не будет записано, там останется или старое значение, или "мусор"
g >> kat1; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> kat2; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> deg; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> deg2; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> deg; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> min; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> cor2; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> rad; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> rad2; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> rad3; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> hyp; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> S; // прочли в поток первый компонент файла и присвоили переменной a новое значение
g >> P; // прочли в поток первый компонент файла и присвоили переменной a новое значение
cout << "\n*****************************\n";
cout << "запись завершена" << endl;
g.close(); //закрыли файловый поток g и файл *filename*.txt
system("pause");
return 0;
Объяснение кода листинга программы
- Ввод известных данных:
- Значение известного катета: kat1
- Значение градусов и минут: deg min
- Перевод значений угла в целые градусы: deg2 = deg + (min * 1) / 60
- Перевод градусов в радианы: rad = (deg2*3.141592358) / 180
- Перевод градусов в радианы для прямого угла: rad2 = (90 * 3.141592358) / 180
- Нахождение третьего угла: cor2 = 180 - (deg2 + 90)
- Нахождение гипотенузы треугольника: hyp = kat1 / (sin(rad))
- Нахождение второго катета: kat2 = sqrt((hyphyp) - (kat1kat1))
- Нахождение площади треугольника: S = (kat1*kat2) / 2
- Нахождение периметра треугольника: P = kat1 + kat2 + hyp
- Запись данных в файл:
- Открытие файла для записи: f(
****.txt, ios::out) - Запись значений катетов в файл: f <<
значение катетов<< kat1 <<;<< kat2 << endl; - Запись значений углов в файл: f <<
значение градусов в радианах<< rad <<;<< rad2 <<;<< rad3 <<;<< endl; - Запись значения гипотенузы в файл: f <<
значение гипотенузы<< hyp << endl; - Запись значения площади треугольника в файл: f <<
площадь треугольника<< S << endl; - Запись значения периметра треугольника в файл: f <<
периметр треугольника<< P << endl;
- Открытие файла для записи: f(
- Чтение данных из файла:
- Открытие файла для чтения: g(
****.txt, ios::in) - Чтение значений из файла:
- Чтение первого значения: g >> kat1;
- Чтение второго значения: g >> kat2;
- Чтение третьего значения: g >> deg;
- Чтение четвертого значения: g >> deg2;
- Чтение пятого значения: g >> min;
- Чтение шестого значения: g >> cor2;
- Чтение седьмого значения: g >> rad;
- Чтение восьмого значения: g >> rad2;
- Чтение девятого значения: g >> rad3;
- Чтение десятого значения: g >> hyp;
- Чтение одиннадцатого значения: g >> S;
- Чтение двенадцатого значения: g >> P;
- Открытие файла для чтения: g(
- Вывод сообщения об успешном завершении записи:
- Вывод сообщения: cout <<
\n*****************************\n; - Вывод сообщения: cout <<
запись завершена<< endl;
- Вывод сообщения: cout <<