Российская Федерация
Тюменская область
ХАНТЫ-МАНСИЙСКИЙ АВТОНОМНЫЙ ОКРУГ – ЮГРА
Департамент образования и науки
Сургутский государственный университет
Ханты-Мансийского автономного округа
Инженерно-физический факультет Кафедра автоматики и компьютерных систем |
Отчет
По лабораторной работе № 2
По дисциплине «Структурное программирование»
Выполнил: студент группы 12-11а
Гильмияров Р.Р.
Проверил: ассистент
Щербаков А.М.
Сургут
2012 г.
Задача 14) Заданы координаты вершин треугольника. Определить, является ли этот треугольник равнобедренным, равносторонним, прямоугольным.
1) Для решения данной задачи нам понадобятся исходные данные: координаты xиyвершин треугольника.
Длина стороны находится по формуле:
Проверка на прямоугольность проводится с использованием теоремы Пифагора (если сумма квадратов двух длин сторон равна квадрату длины третьей, то треугольник является прямоугольным).
|
|
Треугольник является равносторонним, если длины всех его сторон равны.
Треугольник является равнобедренным, если длины двух его сторон равны.
2) Блок-схема:
“Треугольник равносторонний” |
Да |
Нет |
AB=BC=CA; |
“Треугольник прямоугольный” |
Нет |
Да |
AB2+BC2=CA2 || AB2+CA2=BC2|| BC2+CA2=AC2|| |
AB=sqrt((bx-ax)2+(by-ay)2); BC=sqrt((cx-bx)2+(cy-by)2); CA=sqrt((ax-cx)2+(ay-cy)2); |
Запрос и получение исходных данных |
Начало |
AB=BC || BC=CA || AB=CA || |
Нет |
Да |
“Треугольник равнобедренный” |
“Треугольник произвольный” |
Конец |
3) Основная часть программы на языке C++:
#include "stdafx.h"
#include "math.h"
int _tmain(int argc, _TCHAR* argv[])
{
float ax,ay,bx,by,cx,cy,AB,BC,CA;
bool b=false;
printf("Koordinata A x: ");
scanf("%f",&ax);
printf("Koordinata A y: ");
scanf("%f",&ay);
printf("Koordinata B x: ");
scanf("%f",&bx);
printf("Koordinata B y: ");
scanf("%f",&by);
printf("Koordinata C x: ");
scanf("%f",&cx);
printf("Koordinata C y: ");
scanf("%f",&cy);
AB=sqrt((bx-ax)*(bx-ax)+(by-ay)*(by-ay));
BC=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
CA=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy));
if (((ax==bx)&&(ay==by))||((bx==cx)&&(by==cy))||((cx==ax)&&(cy==ay)))
{
printf("\nTakogo treugol'nika ne suschestvuet\n");
return 0;
}
if (((AB*AB+BC*BC-CA*CA)<0.001) || ((AB*AB+CA*CA-BC*BC)<0.001) || ((BC*BC+CA*CA-AB*AB)<0.001))
{
printf("\nTreugol'nik priamougol'niy");
b=true;
}
if ((abs(AB-BC)<0.001) && (abs(BC-CA)<0.001))
{
printf("\nTreugol'nik ravnostoronniy\n");
return 0;
}
if ((abs(AB-BC)<0.001) || (abs(AB-CA)<0.001) || (abs(BC-CA)<0.001))
{
printf("\nTreugol'nik ravnobedrenniy\n");
b=true;
}
if (b==false)
{
printf("\nTreugol'nik proizvol'niy");
}
return 0;
}
4) Обоснование выбора условных операторов:
Конструкция для проверки на совпадение точек:
if (((ax==bx)&&(ay==by))||((bx==cx)&&(by==cy))||((cx==ax)&&(cy==ay)))
Если обе координаты двух точек совпадают, то треугольник «трансформируется» в отрезок. Для предотвращения данной ситуации используется проверка условия:
|
|
Если координаты (xи y) точек Aи B попарносовпадают (аналогично с точками Bи C, Aи C), это означает, что точки накладываются друг на друга.
Конструкция для проверки на прямой угол:
if (((AB*AB+BC*BC-CA*CA)<0.001) || ((AB*AB+CA*CA-BC*BC)<0.001) || ((BC*BC+CA*CA-AB*AB)<0.001))
Если AB2+BC2-AC2=0илиAB2+ AC2-BC2 =0 илиAC2+BC2-AB2=0, то треугольник прямоугольный. Так как при работе с переменными типа double(и производными) может возникнуть погрешность, выражение сравнивалось с числом, превышающем данную погрешность, но достаточно малой для данной задачи.
Конструкция для проверка, является ли треугольник равносторонним:
if ((abs(AB-BC)<0.001) && (abs(BC-CA)<0.001))
Если равны (AB иBC) и(BC иCA), то треугольник равносторонний.
Конструкция для проверки на равнобедренность:
if ((abs(AB-BC)<0.001) || (abs(AB-CA)<0.001) || (abs(BC-CA)<0.001))
Если равны AB и BC или AB и CA, или BC и CA, то треугольник равнобедренный.