ООП 02 Пример Функции-члены класса
.pdfПример № 2 |
Функции-члены класса |
1 |
|
|
ПРИМЕР ПРОГРАММЫ № 2 |
|
|
ТЕМА : |
ФУНКЦИИ-ЧЛЕНЫ КЛАССА |
C |
|
В приведённом примере решена следующая задача: |
|
|
|
Заданы координаты двух вершин правильного треугольника. Определить ко- |
|
|
|
ординаты третьей вершины и его площадь. |
|
|
|
|
A |
|
B |
|
|
||
Задача решается в соответствии со следующим алгоритмом: |
|
|
Dot :: Input ( )
Vec :: Vector ( Dot & , Dot & )
Vec :: Rotate ( Vec & , double )
Dot :: EndVec ( Dot & ,Vec & )
Dot :: Print ( )
Dot :: Dist ( Dot & D )
Dot :: Area ( Dot & A , Dot & B )
Dot :: Dist ( Dot & D )
Dot :: Angle ( Dot & , Dot & )
class Dot
{// закрытые члены класса
double x , y ; |
|
// координаты точки |
|||
char name ; |
|
// имя точки |
|
||
public: // открытые члены класса |
|
|
|
||
// конструкторы класса |
|
|
|
||
Dot ( char Name) : name ( Name ) , x ( 0 ) , y ( 0 ) { } |
// использует список инициализации |
||||
Dot ( char Name , double X , double Y ) |
{ name = Name ; x = X ; y = Y ; } |
||||
// функции-члены класса |
|
|
|
||
inline double GetX ( ) const { return x ;} |
// возвращает координату x |
||||
inline double GetY ( ) const { return y ;} |
// возвращает координату y |
||||
void Print ( ) const ; |
|
// выводит на экран имя и координаты текущей точки |
|||
void Input ( ) ; |
|
// вводит значения координат точки с клавиатуры |
|||
double Dist ( Dot & D ) ; |
// возвращает расстояние между текущей и заданной точками |
||||
void EndVec ( Dot & N , Vec & V ) ; |
// вычисляет координаты конца вектора |
||||
double Area ( Dot & A , Dot & B ) ; |
|
// возвращает значение площади треугольника |
|||
double Angle (Dot & B , Dot & C ) ; |
|
// возвращает значение угла с вершиной в текущей точке |
|||
} ; |
// ИНТЕРФЕЙС КЛАССА ВЕКТОРА |
||||
class Vec |
|||||
|
|
// класс вектора |
|||
{ |
// закрытые члены класса |
|
|
|
|
double x , y ; |
|
// проекции вектора |
|||
char name [ 3 ] ; |
|
// имя вектора |
|
||
public: |
// открытые члены класса |
|
|
|
Выжол Ю.А. |
Объектно-ориентированное программирование |
Пример № 2 |
Функции-члены класса |
2 |
// конструкторы
Vec ( char* pName ) : x ( 0 ) , y ( 0 ) { strncpy ( name , pName , 3 ) ; }
Vec ( char* pName , double X , double Y ) : x ( X ) , y ( Y ) { strncpy ( name , pName , 3 ) ; }
Vec ( char* pName , Dot * A , Dot * B ) : // конструирует вектор по координатам его концов x ( B->GetX ( ) – A->GetX ( )) , y ( B->GetY ( ) – A->GetY ( )) { strncpy ( name , pName , 3 ) ; }
// функции-члены класса |
|
|
inline double GetX ( ) const |
{ return x ; } |
// возвращает проекцию x |
inline double GetY ( ) const |
{ return y ; } |
// возвращает проекцию y |
void Print ( ) const ; |
|
// выводит на экран имя и проекции текущего вектора |
void Input ( ) ; |
|
// вводит значения проекций вектора с клавиатуры |
void Vector ( Dot & A , Dot & B ) ; |
// вычисляет вектор по координатам его концов |
|
void Rotate ( Vec & A , double f ) ; |
// поворачивает вектор на заданный угол |
double Modul ( ) { return sqrt ( x*x + y*y ) ; } // возвращает длину вектора
// возвращает скалярное произведение текущего и заданного векторов double Scalar ( Vec & V ) { return ( x*V.x + y*V.y ) ; }
} ;
Файл DotVec.cpp
#include "DotVec.h"
//ФУНКЦИИ-ЧЛЕНЫ КЛАССА DOT
//функция-член класса Dot выводит на экран имя и значения координат текущей точки void Dot :: Print ( ) const
{
char S [ ] = ”Координаты точки ” ; |
// объявляет и инициализирует строку заголовка |
CharToOem ( S , S ) ; |
// преобразует символы строки в кириллицу |
cout << S << name <<” :”; |
// выводит на экран заголовок и имя точки |
cout <<"\tx = "<< x <<"\ty = "<< y << '\n'; |
// выводит на экран значения координат |
}
// функция-член класса Dot вводит значения координат с клавиатуры void Dot :: Input ( )
{
char S [ ] =”Введите координаты точки ”; // объявляет и инициализирует строку приглашения
CharToOem ( S , S ) ; |
// преобразует символы строки в кириллицу |
cout<<S<<name<<'\n'; |
// выводит на экран приглашение и имя точки |
cout <<"\tx="; cin >> x ; // выводит на экран приглашение “x=” и вводит значения x с клавиатуры cout <<"\ty="; cin >> y ; // выводит на экран приглашение “y=” и вводит значения y с клавиатуры
Пример № 2 |
Функции-члены класса |
3 |
double Dot :: Angle ( Dot & B , Dot & C ) |
|
|
{ |
|
|
const double pi = 4 * atan ( 1 ) ; |
// объявляет константу π |
|
//объявляет вектора, которые начинаются в текущей точке
Vec AB ("AB", this , &B ) , AC ("AC", this , &C ) ;
//вычисляет угол между векторами в градусах
return acos ( AB.Scalar ( AC ) / ( AB.Modul ( )*AC.Modul ( )))*180 / pi ;
}
//ФУНКЦИИ-ЧЛЕНЫ КЛАССА VEC
//функция-член класса Vec выводит на экран имя и значения проекций текущего вектора void Vec :: Print ( ) const
{
char S [ ] = ”Проекции вектора ” ; |
// объявляет и инициализирует строку заголовка |
CharToOem ( S , S ) ; |
// преобразует символы строки в кириллицу |
cout << S << name <<” :”; |
// выводит на экран заголовок и имя вектора |
cout <<"\tx = "<< x <<"\ty = "<< y << '\n'; |
// выводит на экран значения проекций |
} |
|
// функция-член класса Vec вычисляет проекции текущего вектора по координатам его концов
void Vec :: Vector ( Dot & N , |
// ссылка на начало вектора |
Dot & K ) |
// ссылка на конец вектора |
{ |
|
x = K.GetX ( ) – N.GetX ( ) ; |
|
y = K.GetY ( ) – N.GetY ( ) ; |
|
}
// функция-член класса Vec поворачивает вектор на заданный угол в градусах
void Vec :: Rotate ( Vec & V , |
// ссылка на заданный вектор |
double f ) |
// угол поворота в градусах |
{ |
|
const double pi = 4 * atan ( 1 ) ; |
// объявляет константу π |
f *= pi / 180.0 ; |
// пересчитывает градусы в радианы |
x = V.x*cos ( f ) – V.y*sin ( f ) ; |
|
y = V.x*sin ( f ) + V.y*cos ( f ) ; |
|
} |
|
#include "DotVec.h" |
Файл main.cpp |
// подключение заголовочного файла c классами Dot и Vec |
|
bool Repeat ( ) ; |
// прототип функции диалога с пользователем |
void main ( ) |
|
{ |
|
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* ) |
A.Input ( ) ; B.Input ( ) ; |
// вводим координаты точек A и B с клавиатуры |
AB.Vector ( A , B ) ; |
// вычисляем вектор AB по координатам его концов |
AB.Print ( ) ; |
// выводим проекции вектора AB на экран (отладка) |
AC.Rotate ( AB , 60 ) ; |
// поворачиваем вектор AB на 60º и определяем вектор AC |
AC.Print ( ) ; |
// выводим проекции вектора AC на экран (отладка) |
C.EndVec ( A , AC ) ; |
// прибавляем вектор AC к точке A и получаем точку C |
C.Print ( ) ; |
// выводим координаты точки C на экран (результат) |
double S = A.Area ( B , C ) ; |
// вычисляем площадь треугольника |
cout << ”Sabc = ” << S << ’\n’ ; |
// выводим площадь треугольника на экран |
} |
|
while ( Repeat ( )) ; |
// запрос о продолжении работы и повтор программы |
} |
|
//функция выводит на экран запрос о продолжении работы и
//если пользователь нажал клавишу ’Y’, то возвращает true
//если пользователь нажал любую другую клавишу, то возвращает false
bool Repeat ( ) |
// реализация функции диалога с пользователем |
{ |
|
Выжол Ю.А. |
Объектно-ориентированное программирование |
Пример № 2 |
|
Функции-члены класса |
4 |
char S [ ] = ”Продолжить ? (Y/N) ” ; // объявляет и инициализирует строку запроса |
|
||
CharToOem ( S , S ) ; |
|
// преобразует символы строки в кириллицу |
|
cout << S ; |
|
// выводит на экран запрос о продолжении работы |
|
char C ; |
|
// объявляет переменную для ответа пользователя |
|
cin >> C ; |
|
// переменная получает значение клавиши, нажатой пользователем |
|
if ( C == ’Y’ || C == ’y’ ) |
return true ; |
|
|
else |
return false ; |
|
|
} |
|
|
|
|
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ |
|
|
Введите координаты точки A |
|
|
|
x=0 |
|
|
|
y=0 |
|
|
|
Введите координаты точки B |
|
|
|
x=2 |
|
|
|
y=0 |
|
|
|
Проекции вектора AB : |
x = 2 |
y = 0 |
|
Проекции вектора AC : |
x = 1 |
y = 1.73205 |
|
Координаты точки C : |
x = 1 |
y = 1.73205 |
|
Sabc = 1.73205 |
|
|
|
Углы треугольника : |
BAC = 60° |
CBA = 60° |
ACB = 60° |
Стороны треугольника: |
AB = 2 |
AC = 2 |
BC = 2 |
Продолжить ? (Y/N) |
|
|
|
Выжол Ю.А. |
Объектно-ориентированное программирование |