Требования к оформлению отчета



Отчет по лабораторной работе должен содержать следующие разделы:

· титульный лист;

· цель работы:

· задание на лабораторную работу;

· ход работы;

· ответы на контрольные вопросы;

1. выводы по проделанной работе.

Задание на работу

· Напишите программу, реализующую алгоритм поиска в ширину.

· Напишите программу, реализующую алгоритм поиска в глубину.

· Напишите программу, реализующую алгоритм Беллмана-Форда.

· Напишите программу, реализующую алгоритм Дейкстры.

Контрольные вопросы

· Какую задачу решает алгоритм Беллмана-Форда?

· Как оценивается время выполнения алгоритма поиска в глубину?

· Какие бывают представления графов?

· Почему алгоритм поиска в ширину имеет такое название?

· Какую задачу решает алгоритм Дейкстры?


·

Лабораторная работа № 10.  
Классы в языке С++

Цели и задачи работы:

ознакомление с основными концепциями объектно-ориентированного программирования; изучение классов языка С++, способов их описания и использования, получение представления о перегрузке операторов и функций; получение навыков применения объектов в прикладных программах.

Теоретические положения.

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

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

Инкапсуляция представляет собой механизм, который связывает вместе код и данные и который хранит их от внешнего воздействия и от неправильного использования. Более того, именно инкапсуляция позволяет создавать объекты. Попросту говоря, объект представляет собой логическое целое, включающее в себя данные и код для работы с этими данными. Мы можем определить часть кода и данных как собственность объекта, которая недоступна извне. На этом пути объект обеспечивает существенную защиту против случайной модификации или некорректного использования таких своих частных (private) членов. Во всех случаях объект представляет собой переменную, тип которой определяется пользователем. На первый взгляд может показаться странным представлять себе объект, который соединяет в себе вместе код и данные, как переменную. Тем не менее, в объектном программировании дело обстоит именно так. Когда создается объект, неявным образом создается новый тип переменной.

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

Наследование представляет собой процесс, благодаря которому один объект может наследовать, приобретать свойства другого объекта. Это свойство поддерживает концепцию классификации, чем и обуславливается его важность. Например, красное яблоко представляет собой часть класса яблоко, который, в свою очередь, представляет собой часть класса фрукт, входящий в больший класс продукты питания. Без использования классификации каждый объект должен был бы определять все свои характеристики явным образом. На основе классификации объект нуждается только в определении таких качеств, которые отличают его от других объектов этого класса. Благодаря механизму наследования объект может характеризоваться в рамках классификации общего и частного.

Механизм объектов реализуется в языке программирования С++ с помощью классов. Общий вид описания класса следующий:

class <имя класса> {

private :

   <частные данные и функции>;

protected :

   <защищенные данные и функции>;

public :

   <публичные данные и функции>;

} <список объектов>;

Класс может содержать как частные (private) и защищенные (protected), так и публичные (public) данные. По умолчанию все члены класса являются частными, т.е. доступ к таким данным и функциям имеют только члены данного класса. Публичные элементы доступны для обращения из других мест программы. Защищенные члены аналогичны частным, отличия касаются только механизмов их наследования, которые будут рассматриваться в следующей лабораторной работе.

Как только определен класс, можно создать объект этого типа, используя имя класса. Фактически имя класса становится спецификатором нового типа данных. Рассмотрим, например, класс, описывающий окружность:

class circle {

Int x ; // координаты центра

   int y ;

Int r ; // значение радиуса

public:

   float get_length(void);

   float get_square(void);

   void set_params(int c_x, int c_y, int c_r);

   friend void func(void);

}

circle one, *two;

// создаем объект окружность one и указатель на объект two

Сравните: int a, * b;

Внутри объявления класса используются прототипы функций. Для написания реального кода функции-члена компилятору необходимо указать, к какому именно классу относится данная функция:

float circle::get_length(void) {   return 2*3.1415*r } float circle:: get_square(void) {   return 3.1415*r*r; } void circle:: set_params(int c_x, int c_y, int c_r) { x = c_x, y = c_y, r = c_r; }

Последовательность символов :: называется оператором области видимости. Он показывает принадлежность функции конкретному классу. В С++ несколько различных классов могут использовать одинаковые имена функций. Компилятор понимает, какая из них принадлежит какому классу благодаря оператору области видимости и имени класса.

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

Перед использовании объекта может потребоваться инициализировать некоторые его данные. Поскольку требования инициализации являются весьма распространенными, то С++ позволяет производить инициализацию объектов во время их создания. Такая автоматическая инициализация выполняется с помощью функции, называемой конструктором класса. Функция конструктор, являющаяся членом класса и имеющая имя, совпадающее с именем класса, представляет собой специальный тип функции. Конструктор объекта вызывается автоматически при создании объекта. При инициализации глобальных или статических объектов конструктор вызывается только один раз, для локальных объектов конструктор вызывается каждый раз, когда встречается объявление объекта. Следует иметь в виду, что в С++ конструкторы не могут возвращать значений. Теперь в классе circle функция set_params() может быть заменена конструктором:

class circle {

Int x ; // координаты центра

   int y ;

Int r ; // значение радиуса

public:

   circle(int c_x, int c_y, int c_r);

   ~circle();

   float get_length(void);

   float get_square(void);

   friend void func(void);

}


Дата добавления: 2019-09-13; просмотров: 213; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!