Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 21:16   #1
Tatiana_91
Пользователь
 
Аватар для Tatiana_91
 
Регистрация: 03.02.2013
Сообщений: 15
Вопрос Вид треугольника!

Доброго времени суток!
У меня есть программа для проверки треугольника (равнобедренный, равносторонний...), а как проверить является ли треугольник остроугольным, прямоугольным или тупоугольным?
Код:
//---------------------------------------------------------------------------
#include <iostream.h>
#include<map.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <clx.h>
#pragma hdrstop

#pragma argsused
//---------------------------------------------------------------------------
// òî÷êà
struct T
{
   double x;
   double y;
};
//-----
int main(int argc, char* argv[])
{
T A, B, C;
double l1, l2, l3;      // äëèíû ñòîðîí òðåóãîëüíèêà
 const double epsilon = 0.0000001;
cout << "Vvedite [x1, y1]:  ";    cin >> A.x >> A.y;
cout << "Vvedite [x2, y2]:  ";    cin >> B.x >> B.y;
cout << "Vvedite [x3, y13]: ";    cin >> C.x >> C.y;

l1 = sqrt(double((B.x-A.x)*(B.x-A.x) + (B.y-A.y)*(B.y-A.y)));
l2 = sqrt(double((C.x-A.x)*(C.x-A.x) + (C.y-A.y)*(C.y-A.y)));
l3 = sqrt(double((C.x-B.x)*(C.x-B.x) + (C.y-B.y)*(C.y-B.y)));
 if (l1<l2+l3 && l2<l1+l3 && l3<l1+l2)   // åñëè òðåóãîëüíèê
    {
    if (fabs(l1-l2) <= epsilon && fabs(l2-l3) <= epsilon) cout << "Ravnostoronnij" << endl;
    else if (fabs(l1-l2) <= epsilon || fabs(l1-l3) <= epsilon || fabs(l2-l3) <= epsilon) cout << "Ravnobedrennij" << endl;
    else cout << "Raznostoronnij" << endl;

    }
    else
        cout << "Ne treugol'nik" << endl;


 getch();
        return 0;
}
Tatiana_91 вне форума Ответить с цитированием
Старый 30.03.2013, 02:55   #2
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Прими стороны за вектора и проверяй скалярное произведение.
БалаШагаЛ вне форума Ответить с цитированием
Старый 30.03.2013, 10:07   #3
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Ну и чё тут сложного, или вы геометрию в школе прогуливали, вот вам тот же код с небольшими изменениями, который делает то что нужно
Код:
//---------------------------------------------------------------------------
#include <iostream>
#include <map>//Без этого оно тоже работает
#include <string>//Чё-то я не видел в данной программе строк
#include <conio.h>
#include <time.h>//Не совсем понятно, нфига здесь это, но раз оно было я его трогать не буду, пусть так и остаётся
#include <stdio.h>//Это наверное тоже на всякий случай подключаем, а вдруг пригодится
#include <math.h>
#include <clx.h>//Да и это если убрать, я думаю хуже не будет
#pragma hdrstop//Можно как бы и это убрать, но вдруг здесь какой-то магический смысл

#pragma argsused//Это нам тоже не пригодится, оставить или нет на ваше усмотрение
using namespace std;
//---------------------------------------------------------------------------
struct T
{
   double x;
   double y;
};
//-----
main()
{
T A, B, C;
double l1, l2, l3; 
 const double PU = 90.0000000, GRAD = M_PI / 180;
cout << "Vvedite [x1, y1]:  ";    cin >> A.x >> A.y;
cout << "Vvedite [x2, y2]:  ";    cin >> B.x >> B.y;
cout << "Vvedite [x3, y3]:  ";    cin >> C.x >> C.y;

l1 = (acos(((B.x - A.x) * (C.x - A.x) + (B.y - A.y) * (C.y - A.y)) / (sqrt(pow(B.x - A.x,2) + pow(B.y - A.y,2)) * sqrt(pow(C.x - A.x,2) + pow(C.y - A.y,2))))) / GRAD;
l2 = (acos(((A.x - B.x) * (C.x - B.x) + (A.y - B.y) * (C.y - B.y)) / (sqrt(pow(A.x - B.x,2) + pow(A.y - B.y,2)) * sqrt(pow(C.x - B.x,2) + pow(C.y - B.y,2))))) / GRAD;
l3 = (acos(((B.x - C.x) * (A.x - C.x) + (B.y - C.y) * (A.y - C.y)) / (sqrt(pow(B.x - C.x,2) + pow(B.y - C.y,2)) * sqrt(pow(A.x - C.x,2) + pow(A.y - C.y,2))))) / GRAD;
    if (l1 + l2 + l3 >= 179 && l1 + l2 + l3 <= 181)//С учётом погрешности в 1 градус
    {
    if (l1 < PU && l2 < PU && l3 < PU) cout << "Ostrougol'nij" << endl;
    else if (l1 == PU || l2 == PU || l3 == PU) cout << "Pryamougol'nij" << endl;
    else cout << "Tupougol'nij" << endl;
    }
    else cout << "Ne treugol'nik" << endl;
 getch();
}
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.

Последний раз редактировалось Че Гевара; 30.03.2013 в 13:17.
Че Гевара вне форума Ответить с цитированием
Старый 01.04.2013, 11:57   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
а как проверить является ли треугольник остроугольным, прямоугольным или тупоугольным?
Если квадрат максимальной стороны равен сумме квадратов двух других сторон, то, как учит нас дедушка Пифагор, треугольник прямоугольный. Если он больше - треугольник тупоугольный, меньше - остроугольный. Можно, конечно, и "в лоб" считать углы, как предлагает Че Гевара.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны декартовы координаты вершин треугольника (в плоскости). Разработать проект, вычисляющий площадь и периметр этого треугольника Яночка190 Общие вопросы Delphi 1 12.01.2013 12:49
Вид Треугольника DENIS26RUS Паскаль, Turbo Pascal, PascalABC.NET 5 29.10.2012 20:12
Дано 3 точки своими координатами х,у. Будет ли они вершинами треугольника. Если да - найти периметр и площадь треугольника Arhi555 Паскаль, Turbo Pascal, PascalABC.NET 2 11.09.2012 17:46
даны три числа. Если они могут быть длинами сторон треугольника, определите его вид и найдите высоты (Паскаль) charming Помощь студентам 8 26.09.2011 20:48
Basic. Определить вид треугольника. Елена lip Помощь студентам 2 23.03.2010 16:16