- •Задание к программе 1.1
- •Задание к программе 1.2
- •*Задание к программе 1.3
- •*Задание к программе 1.4
- •2. Контрольные вопросы к лабораторной работе №1
- •Объектно-ориентированное программирование Лабораторная работа №2 Дружественные функции, перегрузка операций
- •1. Задание к лабораторной работе
- •Задание к программе 2.2
- •Задание к программе 2.3
- •*Задание к программе 2.4
- •2. Контрольные вопросы к лабораторной работе №2
- •Объектно-ориентированное программирование Лабораторная работа №3 Наследование
- •1. Задание к лабораторной работе
- •Задание к программе 3.1
- •2. Контрольные вопросы к лабораторной работе №3
Объектно-ориентированное программирование
Лабораторная работа №1
Введение в классы
Цель работы – изучить структурированный производный тип языка С++ – классы, способы обеспечения доступности компонентов класса и определения компонентных функций класса, понятия конструктора, деструктора и статического члена класса.
1. Задание к лабораторной работе
Программа 1.1. Создан класс RECTANGLE (Прямоугольник), закрытыми элементами которого являются координаты прямоугольника. Класс имеет конструктор и функции-члены для вычисления длин сторон, площади и периметра. В главной функции main() созданы два экземпляра класса (объекты) и указатель. Показаны методы доступа к членам класса.
#include <iostream.h>
class RECTANGLE{
int x1,x2; //Закрытые члены
int y1,y2; //класса
public:
int LT,LL; //Открытые члены класса
int S;
int P;
RECTANGLE(int leftX,int topY,int rightX,int downY) //Конструктор
{x1=leftX; y1=topY; x2=rightX; y2=downY;}
void len(); //Методы класса
void area();
void perim();
};
void RECTANGLE::len() //Реализация методов
{
LT=x2-x1;
LL=y2-y1;
}
void RECTANGLE::area()
{
S=LT*LL;
}
void RECTANGLE::perim()
{
P=2*LT+2*LL;
}
int main()
{
RECTANGLE r1(2,3,10,11); //Первый экземпляр класса
RECTANGLE r2(2,3,7,12); //Второй экземпляр
RECTANGLE *ptr=&r2; //Указатель на экземпляр класса
r1.len(); //Вызов методов класса
r1.area();
r1.perim();
//Доступ к членам класса
cout<<"LT="<<r1.LT<<" LL="<<r1.LL<<endl;
cout<<"S="<<r1.S<<endl;
cout<<"P="<<r1.P<<endl;
ptr->len(); //Доступ к методам через указатель
(*ptr).area();
ptr->perim();
cout<<"LT_r2="<<r2.LT<<" LL="<<r2.LL<<endl;
cout<<"S_r2="<<ptr->S<<endl;
cout<<"P_r2="<<(*ptr).P<<endl;
return 0;
}
Задание к программе 1.1
Упражнения:
выпишите сообщение, которое выдает компилятор при попытке доступа к закрытым членам класса;
примените к классу операцию sizeof и объясните результат.
Задания:
Первый вариант:
Доработать конструктор таким образом, чтобы он выполнял проверку на правильность задания координат: x1 должно быть меньше x2, а y1 – меньше y2.
Разработать класс CIRCLE (Круг). Конструктор должен инициализировать координаты концов радиуса круга. Класс должен иметь методы вычисления площади и длины круга.
Второй вариант:
Создать для класса RECTANGLE метод, вычисляющий диагональ прямоугольника, в главной функции продемонстрировать его работу.
Разработать класс "Прямоугольный треугольник" TRIANGLE. Конструктор должен инициализировать координаты трех вершин треугольника, причем, координаты второй вершины должны соответствовать вершине с прямым углом. Класс должен иметь закрытый метод вычисления сторон треугольника и открытые методы вычисления площади и периметра треугольника.
Программа 1.2. В программе демонстрируется пример класса для создания матриц в динамической памяти. Используется конструктор и деструктор для создания экземпляров класса и указателя на них. Конструктор выполнен как функция с умалчиваемыми значениями параметров. Матрица моделируется с помощью одномерного массива.
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
#define size unsigned char
class Matrix{
size m,n; //Размеры матрицы
double *matr;
public:
Matrix(size, size=1); //Прототип конструктора
~Matrix() //Деструктор
{delete [] matr;}
void display(); //Прототип метода
};
Matrix::Matrix(size M, size N)
{
randomize();
m=M; n=N;
if((matr=new double[n*m])==NULL)
exit(1);
for(int i=0,j;i<m;i++)
for(j=0;j<n;j++)
*(matr+i*n+j)=random(1000)*0.01;
}
void Matrix::display()
{
for(int i=0,j;i<m;i++)
{
for(j=0;j<n;j++)
{
cout.width(7);
cout<< *(matr+i*n+j);
}
cout<<"\n";
}
cout<<"\n";
cout<<"Press any key...\n";
getch();
}
int main()
{
clrscr();
Matrix A(2,2),B(4,5),*pMatr=&B;
Matrix Vec(5);
cout<<"The matrix A:\n";
A.display();
cout<<"The matrix B:\n";
pMatr->display(); //Доступ через указатель
cout<<"The vector Vec:\n";
Vec.display();
return 0;
}
Задание к программе 1.2
Упражнения:
показать использование указателя pMatr для доступа к элементам вектора Vec;
реализуйте деструктор вне описания класса;
разработайте метод класса, позволяющий вводить элементы матрицы с клавиатуры.
Задания:
Первый вариант:
Разработать метод класса для вычисления произведения всех элементов матрицы.
*Разработать метод класса для вычисления максимального элемента матрицы.
Второй вариант:
Разработать метод класса для вычисления суммы всех элементов матрицы.
*Разработать метод класса для определения номера столбца матрицы, сумма абсолютных значений элементов которого максимальна.
*Программа 1.3. В программе демонстрируется создание массива экземпляров класса Worker (Работник) с использованием конструктора с параметрами и правила применения статического члена класса MoneyOfFirm (Капитал фирмы). Метод класса work() увеличивает количество денег у работника и капитал фирмы в зависимости от продолжительности работы (period).
#include <iostream.h>
#include <conio.h>
class Worker{
float MoneyOfWorker;
static float MoneyOfFirm; //Статический член класса
public:
Worker(float m) {MoneyOfWorker=m;}
void work(float);
void display() {cout<<MoneyOfWorker<<endl;}
void displayMoneyOfFirm() {cout<<MoneyOfFirm<<endl;}
};
void Worker::work(float period)
{
MoneyOfWorker+=2*period;
MoneyOfFirm+=10*period;
}
float Worker::MoneyOfFirm=1000; //Инициализация статического компонента
int main()
{
clrscr();
const n=5;
Worker M[n]={50,28,35,45,49}; //Создание массива экземпляров //класса и их инициализация
cout<<"Начальное количество денег у работников:\n";
for(int i=0;i<n;i++)
M[i].display();
cout<<"Начальный капитал фирмы:\n";
M[0].displayMoneyOfFirm();
cout<<"Конечное количество денег у работников:\n";
for(i=0;i<n;i++)
{
M[i].work(2);
M[i].display();
}
cout<<"Конечный капитал фирмы:\n";
M[0].displayMoneyOfFirm();
getch();
return 0;
}