Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП 03 Пример Дружественные функции.doc
Скачиваний:
15
Добавлен:
14.02.2015
Размер:
95.23 Кб
Скачать

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

}

// глобальная функция выводит на экран заголовок программы