
- •Пример № 3
- •Задача решается по следующему алгоритму:
- •Проверка правильности работы программы:
- •При вычислении угла используются функции:
- •Файл DotVec.H
- •Vec (char* pName ) : X ( 0 ) , y ( 0 ) { strncpy ( name , pName , 3 ) ; }
- •Vec ( char* pName ,doubleX ,doubleY ) : X ( X ) , y ( y ) { strncpy ( name , pName , 3 ) ; }
- •Файл DotVec.Cpp
- •Void Print ( const Dot & d ) // константная ссылка на заданную точку
- •Void Input ( Dot & d ) // ссылка на заданную точку
- •Vec ba ("ba") , bc ("bc") ; // объявляет вектора
- •Vector ( b , a , ba ) ; Vector ( b , c , bc ) ;// вычисляет вектора
- •Void Print ( const Vec & V ) // константная ссылка на заданный вектор
- •Void Rotate ( const Vec & V , // константная ссылка на заданный вектор
- •VoidTitle ( )
- •Результат работы программы
Vec ba ("ba") , bc ("bc") ; // объявляет вектора
Vector ( b , a , ba ) ; Vector ( b , c , bc ) ;// вычисляет вектора
returnacos ( Scalar ( BA , BC ) / ( Modul ( BA ) * Modul ( BC )))*180 / pi ;
} // вычисляет угол между векторами в градусах
//////////////////////////// РЕАЛИЗАЦИЯ функциЙ, дружественных классу Vec //////////////////////////////////
// выводит на экран имя и значения проекций заданного вектора
Void Print ( const Vec & V ) // константная ссылка на заданный вектор
{
char S [ ] ="Проекции вектора "; // объявляет и инициализирует строку заголовка
CharToOem ( S , S ) ; // преобразует символы строки в кириллицу
Cout << S << V.name << " :" ; // выводит на экран заголовок и имя вектора
cout<<"\tx = "<<V.x<<"\ty = "<<V.y<<'\n'; // выводит на экран значения проекций
}
// возвращает длину заданного вектора
double Modul ( const Vec & V ) // константная ссылка на заданный вектор
{
return sqrt ( V.x * V.x + V.y * V.y ) ; // возвращает длину заданного вектора
}
// возвращает скалярное произведение заданных векторов
double Scalar ( const Vec & V , const Vec & W )// константные ссылки на заданные вектора
{
return( V.x * W.x + V.y * W.y ) ;
}
// поворачивает заданный вектор на заданный угол
Void Rotate ( const Vec & V , // константная ссылка на заданный вектор
double f , // угол поворота в градусах
Vec & W ) // ссылка на повёрнутый вектор
{
const double pi = 4 * atan ( 1.0 ) ; // объявляет константу π
f *= pi / 180.0 ; // пересчитывает градусы в радианы
W.x = V.x * cos ( f ) – V.y * sin ( f ) ; // вычисляет проекцию вектора на ось X
W.y = V.x * sin ( f ) + V.y * cos ( f ) ; // вычисляет проекцию вектора на ось Y
}
///////////////////////// РЕАЛИЗАЦИЯ функциЙ, дружественных классАм Vec и Dot ////////////////////////////
// вычисляет вектор по координатам его концов
void Vector ( const Dot & N , // константная ссылка на начало вектора
const Dot & K , // константная ссылка на конец вектора
Vec & V ) // ссылка на вычисляемый вектор
{
V.x = K.x – N.x ; // вычисляет проекцию вектора на ось X
V.y = K.y – N.y ; // вычисляет проекцию вектора на ось Y
}
// вычисляет координаты конца заданного вектора
void EndVec ( const Dot & N , // константная ссылка на начало вектора
const Vec & V , // константная ссылка на заданный вектор
Dot & K ) // ссылка на конец вектора
{
K.x = N.x + V.x ; // вычисляет абсциссу конца вектора
K.y = N.y + V.y ; // вычисляет ординату конца вектора
}
Файл main.cpp
#include "DotVec.h" // подключение заголовочного файла c классами Dot и Vec
///////////////////////////////////// прототипы глобальных функциЙ ////////////////////////////////////////////
bool Repeat ( ) ; // прототип функции диалога с пользователем
void Title ( ) ; // прототип функции вывода на экран заголовка программы
voidmain ( )
{
Title ( ) ; // вывод на экран заголовка программы
do
{
Dot A ( 'A', 2 , 0 ) , B ( 'B', 4 , 0 ) ; // вызываем конструктор Dot ( char , double , double )
Dot C ( 'C' ) ; // вызываем конструктор Dot ( char )
Vec AB ( "AB" ) , AC ( "AC" ) ; // вызываем конструктор Vec ( char* )
Input ( A) ; Input ( B) ; // вводим координаты точек A и B с клавиатуры
Vector ( A , B , AB ) ; // вычисляем вектор AB по координатам его концов
Print ( AB ) ; // выводим проекции вектора AB на экран (отладка)
Rotate ( AB , 60 , AC ) ; // поворачиваем вектор AB на 60º и определяем вектор AC
Print ( AC ) ; // выводим проекции вектора AC на экран (отладка)
EndVec ( A , AC , C ) ; // прибавляем вектор AC к точке A и получаем точку C
Print ( C ) ; // выводим координаты точки C на экран (результат)
double S = Area (A , B , C ) ; // вычисляем площадь треугольника
cout << ”Sabc = ” << S << ’\n’ ; // выводим площадь треугольника на экран (результат)
// ТЕСТИРОВАНИЕ ПРОГРАММЫ
char str [ 30 ] ; // объявляем строку заголовка
const char g = ( char ) 248 ; // объявляем и инициализируем символ градуса
CharToOem ( "Углы треугольника :", str ) ;
cout << str << "\tBAC = " << Angle ( B , A , C ) << g
<< "\tCBA = " << Angle ( C , B , A ) << g
<< "\tACB = " << Angle ( A , C , B ) << g << '\n' ;
CharToOem ( "Стороны треугольника:", str ) ;
cout << str << "\tAB = " << Dist ( A , B )
<< "\t\tAC = " << Dist ( A , C )
<< "\t\tBC = " << Dist ( B , C ) << '\n' ; }
while ( Repeat ( )) ; // запрос о продолжении работы и повтор программы
}
///////////////////////////////////// РЕАЛИЗАЦИЯ глобальных функциЙ ////////////////////////////////////////////
// глобальная функция выводит на экран запрос о продолжении работы и,
// если пользователь нажал клавишу ’Y’, то возвращает true,
// если пользователь нажал любую другую клавишу, то возвращает false
bool Repeat ( ) // реализация функции диалога с пользователем
{
char S [ ] = ”Продолжить ? (Y/N) ” ; // объявляет и инициализирует строку запроса
CharToOem ( S , S ) ; // преобразует символы строки в кириллицу
cout << S ; // выводит на экран запрос о продолжении работы
char C ; // объявляет переменную для ответа пользователя
cin >> C ; // получает значение клавиши, нажатой пользователем
if ( C == ’Y’ || C == ’y’ ) return true ;// если пользователь нажал клавишу ’Y’, то возвращает true
else return false ; // если пользователь нажал любую другую клавишу, то возвращает false
}
// глобальная функция выводит на экран заголовок программы