Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
met_OOP_4s_2010.doc
Скачиваний:
1
Добавлен:
10.11.2019
Размер:
894.46 Кб
Скачать

16

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

Лабораторная работа №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

Упражнения:

  1. выпишите сообщение, которое выдает компилятор при попытке доступа к закрытым членам класса;

  2. примените к классу операцию sizeof и объясните результат.

Задания:

Первый вариант:

  1. Доработать конструктор таким образом, чтобы он выполнял проверку на правильность задания координат: x1 должно быть меньше x2, а y1 – меньше y2.

  2. Разработать класс CIRCLE (Круг). Конструктор должен инициализировать координаты концов радиуса круга. Класс должен иметь методы вычисления площади и длины круга.

Второй вариант:

  1. Создать для класса RECTANGLE метод, вычисляющий диагональ прямоугольника, в главной функции продемонстрировать его работу.

  2. Разработать класс "Прямоугольный треугольник" 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

Упражнения:

  1. показать использование указателя pMatr для доступа к элементам вектора Vec;

  2. реализуйте деструктор вне описания класса;

  3. разработайте метод класса, позволяющий вводить элементы матрицы с клавиатуры.

Задания:

Первый вариант:

  1. Разработать метод класса для вычисления произведения всех элементов матрицы.

  2. *Разработать метод класса для вычисления максимального элемента матрицы.

Второй вариант:

  1. Разработать метод класса для вычисления суммы всех элементов матрицы.

  2. *Разработать метод класса для определения номера столбца матрицы, сумма абсолютных значений элементов которого максимальна.

*Программа 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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]