
- •Часть 2
- •Часть 2
- •Лабораторная работа №1 Тема: “Простейшие классы”
- •Основные понятия
- •Пример 1: Класс, описывающий окружность.
- •Пример 2: Класс, описывающий точку.
- •Пример 3: Класс, описывающий двумерный массив.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №2 Тема: “Конструкторы и деструкторы”
- •Пример 1: Класс, описывающий животное.
- •Пример 2: Класс, описывающий время.
- •Пример 3: Класс, описывающий двумерный массив.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №3 Тема: “Перегрузка операций”
- •Пример 1: Класс, описывающий окружность.
- •Пример 2: Класс, описывающий прямоугольник.
- •Пример 3: Класс, описывающий строку символов
- •Задания для самостоятельного выполнения
- •Лабораторная работа №4 Тема: “Классы динамических структур” Пример 1: Класс, описывающий двунаправленный список
- •Пример 2: Класс, описывающий бинарное дерево
- •Задания для самостоятельного выполнения
- •Лабораторная работа №5 Тема: “Шаблонные классы”
- •Пример : Класс, описывающий множество.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №6 Тема: “Наследование”
- •Пример 1: Классы, описывающие точку, окружность и конус.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №7 Тема: “Полиморфизм и виртуальные функции”
- •Пример : Классы, описывающие точки и окружности.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №8 Тема: “Разреженные массивы” Пример: Класс, описывающий разреженный массив
- •Задания для самостоятельного выполнения
- •Лабораторная работа №9 Тема: “Виртуальные функции в динамических структурах” Пример: Класс, описывающий базовый класс списка и производный класс стека
- •Задания для самостоятельного выполнения
- •Лабораторная работа №10 Тема: “Вычисление выражений, вводимых с клавиатуры”
- •Пример: Шаблонный класс для вычисления значения выражения, вводимого с клавиатуры
- •Пошаговое выполнение программы
- •Задание для самостоятельного выполнения
Пример 3: Класс, описывающий двумерный массив.
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class DArray
{
int** a; // Указатель на двумерный массив(матрицу)
int x,y; // размеры массива
public:
//конструкторы:
DArray(); // по умолчанию
DArray(int**,int,int); // основной
DArray(const DArray&); // копирования
/*деструктор (в этом классе явное описание деструктора обязательно, поскольку он должен освободить память, захваченную конструктором): */
~DArray();
/* функция, которая заполняет массив данными из массива-источника: */
void Set_array(int**, int, int);
// функция, которая возвращает указатель на массив:
int** Get_array();
// функции ввода-вывода:
void input();
void output();
};
// Определение функций:
/* Конструктор по умолчанию (создает массив 2*2, заполненный нулями): */
DArray::DArray()
{
x=2; y=2;
// Выделяем память под массив:
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// заполняем массив нулями:
for (int i=0; i<x; i++)
for (int j=0; j<y; j++)
a[i][j]=0;
}
// Основной конструктор (создает массив, заполненный данными из массива-источника):
DArray::DArray(int** aa,int xx,int yy)
{
/* Конструктор использует функцию Set_array(). Поскольку эта функция освобождает память, ранее выделенную под массив, а при вызове конструктора еще текущий массив не определен, показываем это, задавая размеры, равные 0. */
x = y = 0;
Set_array(aa, xx, yy);
}
// Деструктор:
DArray::~DArray()
{
// Освобождаем память, выделенную под элементы массива:
for (int i=0; i<x; i++)
delete []a[i];
// Освобождаем память, выделенную под указатели:
delete []a;
}
void DArray::Set_array(int** aa, int xx, int yy)
{
// Если объект уже существует, удаляем его:
if (x && y)
this->~DArray();
/* Обратите внимание на то, как можно явно вызвать деструктор (хотя это не рекомендуется) */
// Создаем массив таких же размеров, что и массив-источник:
x=xx; y=yy;
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// Заполняем массив данными из массива-источника:
for (int i=0; i<x; i++)
for (int j=0; j<y; j++)
a[i][j]=aa[i][j];
}
// Конструктор копирования:
DArray::DArray(const DArray& obj)
{
//Создаем копию объекта obj:
x=obj.x; y=obj.y;
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// Заполняем созданную копию данными из массива obj:
for (int i=0; i<x; i++)
for (int j=0; j<y; j++)
a[i][j]=obj.a[i][j];
}
// Функция, возвращающая указатель на массив:
int** DArray::Get_array()
{
return a;
}
// функция ввода:
void DArray::input()
{
// Удаляем ранее созданный объект:
if (x && y)
this->~DArray();
do
{
cout << "Задайте количество строк матрицы: ";
cin >> x;
cout << "Задайте количество столбцов матрицы: ";
cin >> y;
} while(x<0||y<0);
// Размещаем массив в памяти:
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// Считываем элементы с клавиатуры:
for (int i=0; i<x; i++)
{
for (int j=0; j<y; j++)
{
cout << "Задайте значение [" << i << ", " << j <<"] элемента:";
cin >> a[i][j];
}
cout << endl;
}
}
// Функция вывода:
void DArray::output()
{
for (int i=0; i<x; i++)
{
for (int j=0; j<y; j++)
{
cout << setw(4) << a[i][j];
}
cout << endl;
}
}
// Пример программы, использующей класс Darray:
int main()
{
//Настройки шрифтов и региональных стандартов:
if(SetConsoleCP(1251)==0)
//проверка правильности установки кодировки символов для ввода
{
cerr<<"Fialed to set codepage!"<<endl;
}
if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
DArray A, B; //вызывается конструктор по умолчанию (2 раза)
cout<< "Массив по умолчанию: \n";
A.output();
// Создаем массив-источник данных:
int** c;
c = new int* [2];
for (int i=0; i<2; i++)
c[i]=new int[2];
// Инициализируем генератор случайных чисел:
time_t t;
srand((unsigned) time(&t));
/* Заполняем массив случайными целыми числами из диапазона [-100, 100]: */
for (int i=0; i<2; i++)
for (int j=0; j<2; j++)
c[i][j]=-100 + rand() % 201;
B.Set_array(c,2,2);
cout << "Объект, заполненный данными из массива-источника:\n";
B.output();
A.input();
cout << "Массив, введенный с клавиатуры:\n";
A.output();
// пример использования основного конструктора:
DArray C(c, 2, 2);
cout << "Массив, созданный с помощью основного конструктора:\n";
C.output();
//пример использования конструктора копирования:
DArray D(C);
cout << "Массив, созданный с помощью конструктора копирования: \n";
D.output();
// Освобождаем память, выделенную под массив-источник данных:
for (int i=0; i<2; i++)
delete []c[i];
delete []c;
_getch();
return 0;
}