Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП 02 Пример Функции-члены класса

.pdf
Скачиваний:
15
Добавлен:
15.02.2015
Размер:
216.66 Кб
Скачать
// предварительное объявление класса // ИНТЕРФЕЙС КЛАССА ТОЧКИ
// класс точки
Файл DotVec.h
// ПОДКЛЮЧЕНИЕ БИБЛИОТЕК // содержит функции ввода-вывода
// содержит функцию CharToOem
// содержит математические функции
Dot :: Scalar ( Vec & ) Dot :: Modul ( )
Для каждого действия объявляем соответствующую функцию-член в классах Dot и Vec.
#include<iostream.h> #include<windows.h> #include <math.h>
class Vec ;
вычисление модуля вектора
вычисление скалярного произведение двух векторов
вводим координаты точек A и B с клавиатуры
вычисляем вектор AB по координатам его концов поворачиваем вектор AB на 60º и определяем вектор AC прибавляем вектор AC к точке A и получаем точку C выводим на экран координаты точки C
длины сторон вычисляем по теореме Пифагора вычисляем площадь треугольника по координатам его вершин Проверка правильности работы программы:
вычисляем длины всех сторон треугольника вычисляем значения всех углов треугольника При вычислении угла используются функции:

Пример № 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:

// открытые члены класса

 

 

 

Выжол Ю.А.

Объектно-ориентированное программирование

Выжол Ю.А.
Объектно-ориентированное программирование
}
// объявляет и вычисляет длину полупериметра // вычисляет по формуле Герона площадь // треугольника и возвращает её значение
// функция-член класса Dot возвращает значение угла в градусах с вершиной в текущей точке
// объявляет и вычисляет // длины сторон треугольника
double a = this->Dist ( B ) ; double b = this->Dist ( A ) ; double c = A.Dist ( B ) ; double p = ( a + b + c ) / 2.0 ;
return sqrt ( p*(p - a)*(p - b)*(p - c) ) ;
}
// возвращает значение площади треугольника, образованного текущей точкой и двумя заданными double Dot :: Area ( Dot & A , Dot & B )
{
// объявляет и инициализирует // катеты прямоугольного треугольника
// возвращает значение гипотенузы прямоугольного треугольника
double Dot :: Dist ( Dot & D )
{
double X = D.x – x ; double Y = D.y – y ; return sqrt ( X*X + Y*Y ) ;
}
// функция-член класса Dot вычисляет координаты конца вектора и передаёт их в текущую точку void Dot :: EndVec ( Dot & N , // ссылка на начало вектора
Vec & V ) // ссылка на вектор
{
x = N.x + V.GetX ( ) ;
y = N.y + V.GetY ( ) ;
}
// функция-член класса Dot возвращает расстояние между текущей и заданной точками

Пример № 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)

 

 

 

Выжол Ю.А.

Объектно-ориентированное программирование