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

628_Nechta_I.V._Osnovy_ob`ektno-orientirovannogo_

.pdf
Скачиваний:
8
Добавлен:
12.11.2022
Размер:
333.92 Кб
Скачать

Федеральное агентство связи

Федеральное государственное бюджетное образовательное учреждение высшего образования «Сибирский государственный университет телекоммуникаций и информатики» (СибГУТИ)

И.В. Нечта Е.И. Ситняковская

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

Учебно-методическое пособие

Новосибирск

2016

УДК 004.4(075.8)

Утверждено редакционно-издательским советом СибГУТИ

Рецензент канд. техн. наук, А.В. Ефимов

Нечта И.В., Ситняковская Е.И. Основы объектно-ориентированного программирования: Учебно-методическое пособие / Сибирский государственный университет телекоммуникаций и информатики. – Новосибирск, 2016. – 26 с.

Данное учебно-методическое пособие включает в себя 10 лабораторных работ для изучения курса «Объектно-ориентированного программирования». В рассматриваемом пособии содержатся базовые концепции объектноориентированного программирования, а также представлены задания для лабораторных работ на языке программирования С++.

Пособие предназначено для студентов вузов, обучающихся по направлению подготовки 09.03.01 «Информатика и вычислительная техника». Данный курс базируется на ранее изученных дисциплинах: «Программирование на языке С++» и «Структуры и алгоритмы данных».

В авторской редакции

©Нечта И.В., Ситняковская Е.И.., 2016

©Сибирский государственный университет телекоммуникаций и информатики, 2016

Введение

Существует несколько парадигм разработки программного обеспечения, которые определяют стиль написания программы. Например, процедурное программирование позволяет объединять последовательность операторов языка в большие блоки, называемые подпрограммами. Такие подпрограммы могут многократно использоваться в коде программы, как сокращенная форма записи кода. В основе структурного программирования лежит способ представления программы как иерархической структуры, что позволяет повысить удобочитаемость кода программы. На сегодняшний день наиболее актуальным является объектно-ориентированное подход (ООП). Основным недостатком предыдущих подходов являлось то, что программисту требовалось полностью знать внутреннюю структуру программы для взаимодействия с ее компонентами. Согласно определению одного из основоположников Гради Буча: «ООП – это методология программирования, которая основана на представлении программы, в виде совокупности объектов, каждый из которых является реализацией определённого класса (типа особого вида), а классы, образуют иерархию на принципах наследованности».

Объектно-ориентированный подход позволяет организовать процесс создания программы с большим объемом исходного кода, так чтобы с одной стороны упростить процесс программирования, и с другой стороны обезопасить программистов от потенциальных ошибок. Все это позволяет ускорить процесс разработки и снизить стоимость программного продукта. Рассмотрим базовые понятия объектно-ориентированного программирования. Класс – это более сложный тип данных, чем структура. Класс представляет собой некий «чертеж» или «схему» построения объектов в памяти (говорят экземпляров класса). Как и структура, класс содержит в себе данные, называемые полями, и функции – это методы класса.

К основным принципам ООП относят следующие понятия. Инкапсуляция – это объединение полей данных с методами, которое формирует новый тип данных – класс. Говорят: функция инкапсулирована в описании объекта. К этому же термину добавляют возможность ограничивать область видимости ряда полей и методов класса, с целью поддержания работоспособности программы. По сути, программисту не обязательно полностью знать особенности реализации класса (его внутренние переменные, или архитектуру) для эффективного и безопасного взаимодействия с ним. Наследование – создание иерархии классов для того, чтобы поля данных и методы родительских классов автоматически становились полями данных и методами потомков. Наследование позволяет создавать одни классы на основе других, ранее созданных.

Полиморфизм – допускает использование одного и того же имени метода, для нескольких различных реализациях этого метода класса. При использовании структурного программирования нам потребовалось бы придумывать различные имена функций, для схожих по смыслу действий.

3

Лабораторная работа №1.

Создание и использование динамических массивов

ЦЕЛЬ РАБОТЫ: изучение принципов работы с динамической памятью.

ОСНОВНЫЕ СВЕДЕНИЯ

Любой алгоритм имеет два основных критерия оценки эффективности - трудоемкость и объем необходимой памяти. Считается, что чем меньше эти значения, тем эффективнее используются ресурсы компьютера. Современные компьютеры обладают достаточным объемом оперативной памяти необходимым для выполнения большинства обычных программ. Однако существуют такие программы, которые могут испытывать дефицит памяти. В таком случае, может быть применена динамическая память. Основное отличие динамической памяти от обычной (статической1) заключается в том, что существует возможность создания и удаления объектов из оперативной памяти в ходе выполнения программы. Например, если массив

более не

используется в

программе,

то его можно удалить

из памяти,

а освобожденное

таким образом

место можно использовать

для повторного размещения новой структуры данных. Также динамическая память используется под размещение структур данных с заранее неизвестным размером. Организацией работы динамической памяти занимается операционная система. Программисту достаточно использовать две функции для работы с динамической памятью:

malloc() - выделяет память в свободной области и возвращает указатель типа void (возвращает адрес первого байта выделенной области памяти). Если памяти не хватает, то возвращает нулевой указатель.

free( ) - освобождает память.

Обращение к элементам динамической памяти осуществляется при помощи указателей. Указатель – это переменная, которая содержит адрес другой переменной (это ссылка на некоторый объект).

А переменная, расположенная в динамически распределенной области памяти, на которую указывает указатель, называют динамической переменной.

Рассмотрим работу с динамическими переменными на следующем примере.

1 Память под такую переменную выделяется еще на стадии компиляции.

4

#include <stdlib.h>

//объявим указатель на динамическую переменную типа integer int *p;

void main(){

//выделим память под размещение переменной p=(int*)malloc(sizeof(int));

//теперь можно работать с переменной

*p=5; printf(“%d”, *p);

Функция malloc выделяет участок памяти запрашиваемого размера и возвращает адрес динамической переменной. Для обращения по адресу используется символ “*”. Обращение по указателю без предварительного выделения памяти (вызов функции malloc) ЗАПРЕЩАЕТСЯ.

Работа с массивами происходит аналогичным образом. Обратите внимание, что при обращении к элементу массива символ “*” не ставится.

int *p;

void main(){

//выделим память под размещение 10 элементов типа int p=(int*)malloc(10*sizeof(int));

//теперь можно работать с массивом p[0]=5;

p[1]=2;

printf(“%d”, p[1]+p[0]);

 

Перед

завершением

работы

программы

все

переменные

из

динамической

памяти

следует

удалить

вызовом

функции

free(<указатель на переменную>). Обращение к динамической переменной после ее удаления из памяти ЗАПРЕЩЕНО.

ЗАДАНИЕ

Задание 1. Создать динамический двумерный массив размером 200 200 элементов, заполнить его случайными целыми числами (типа byte). Переписать элементы матрицы во вновь созданный одномерный динамический массив в следующем порядке:

a)по правым диагоналям, начиная с правого верхнего элемента;

b)по левым диагоналям, начиная с левого верхнего элемента;

c)по спирали, начиная с центрального элемента;

d)по спирали, начиная с левого верхнего элемента;

5

Проверить объем доступной оперативной памяти до и после выполнения программы.

Задание 2. Создать двумерный динамический массив с произвольным количеством элементов в каждой сроке. Заполнить его и распечатать построчно. Проверить объем доступной оперативной памяти до и после выполнения программы.

КОНТРОЛЬНЫЕ ВОПРОСЫ

Каким образом происходит создание двумерного динамического массива?

Как проверить была ли выделена память под переменную успешно?

Лабораторная работа №2. Использование динамических структур данных

ЦЕЛЬ РАБОТЫ: Изучить принципы работы со сложными структурами данных.

ОСНОВНЫЕ СВЕДЕНИЯ

Линейный список – последовательность однородных элементов линейно связанных между собой указателями. Существуют частные случаи списка:

Стек – элементы добавляются и удаляются с вершины головы списка

LIFO.

Очередь – элементы добавляются в конец, а удаляются с начала списка

FIFO.

Рассмотрим подробнее процесс работы со стеком. Пусть переменная pHead – указатель головы стека. Указатель Next содержит адрес следующего элемента стека. Ниже на рисунках 1-4 показан процесс добавления и удаления элементов из стека и очереди.

6

 

pHead

Next

 

pHead = New pLE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Data

Null pHead →Next Null

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 2

1) p = New pLE

Next 2) p→Next = pHead

1

3) pHead = p

Рис. 1. Добавление элемента в стек

3

pHead

Next

Data

2

4

p

1

x

Рис. 2. Удаление элемента из стека

1)x = pHead→Data 2)p = pHead

3)pHead = pHead→Next 4)delete ( p )

Просмотр элементов стека осуществляется следующим образом.

p = pHead while (p! = Null){

7

… ;

p = p→Next;

}

Работа с очередью.

1

2

p

Рис. 3. Добавление элемента в очередь

pTail →Next = p; pTail = p;

pHead

Next

Data

2

4

p

1

x

Рис. 4. Удаление элемента из очереди

8

x = pHead→Data p = pHead

pHead = pHead→Next delete ( p )

ЗАДАНИЕ

Задание 1. Написать процедуры и функции для работы со списком:

a)Добавление элемента после к-ого элемента списка

b)Удаление из списка к-ого элемента

c)Подсчет числа элементов в списке

d)Перемещение р-ого элемента списка после к-ого элемента

Спомощью этих процедур и функций создать список следующим образом. Включать в список полные квадраты из одномерного массива целых чисел (типа byte). Удалить повторяющиеся элементы списка. Определить длину полученного списка.

Задание 2. Написать программу, которая визуально демонстрирует работу стека и очереди. Длина стека и очереди ограничена 10 элементами.

КОНТРОЛЬНЫЕ ВОПРОСЫ

Приведите примеры программ, в которых рационально использовать стек и очередь?

Какую структуру данных лучше использовать для организации поиска данных массив или список? Обоснуйте свой ответ.

Лабораторная работа №3.

Принцип инкапсуляции. Описание объектного типа

ЦЕЛЬ РАБОТЫ: Изучить принцип инкапсуляции и возможностей его применения.

ОСНОВНЫЕ СВЕДЕНИЯ

Одним из важнейших механизмов объектно-ориентированного программирования является инкапсуляция - языковая конструкция, способствующая объединению данных с методами (или другими функциями), обрабатывающими эти данные. Также к инкапсуляции относится механизм

9

ограничения доступа к определённым компонентам объекта. Рассмотрим следующий пример.

class Animal

{

public:

//данные и методы этого раздела будут открыты для всех int coords[2];

void run(); private:

//данные и методы этого раздела будут открыты только для

//методов данного класса.

int color; void Kill();

};

В рассмотренном примере класс Animal инкапсулирует свойство color и метод Kill, предоставляя внешний интерфейс run и coords.

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

Модификатор

Область видимости элементов раздела

Из внешних

Из методов

Из методов

доступа

функций

наследуемых классов

самого класса

 

public

Да

Да

Да

protected

Нет

Да

Да

private

Нет

Нет

Да

Табл. 1. Описание свойств модификаторов доступа

ЗАДАНИЕ

Задание 1. Описать класс tpoint, инкапсулирующий основные свойства и методы точки на плоскости. Создать массив из 100 точек. Нарисовать точки случайным образом случайным цветом на экране. Добавить методы движения точек:

a)прямолинейное движение с отражением от стенок экрана;

b)случайное движение с отражением.

Задание 2. Описание класса оформить в отдельном модуле. Ограничить область видимости полей класса (т.е. организовать использование полей через методы класса).

10