Статически и динамически подключаемые библиотеки. 


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



ЗНАЕТЕ ЛИ ВЫ?

Статически и динамически подключаемые библиотеки.



 

Цель работы: отработка умений и навыков создания и правильного подключения статических и динамических библиотек при проектировании программ на С/С++:

ü создание модулей библиотек с использованием классов (2 часа);

ü статическое и динамическое подключение библиотек (2 часа).

Теория:

Множественные заголовочные файлы. Файлы как модули.

Стиль разбиения программы с одним заголовочным файлом наиболее пригоден в тех случаях, когда программа невелика и ее части не предполагается использовать отдельно. В случае объемной программы имеет смысл для каждой ее логической части создать свой заголовочный файл, в котором определяются предоставляемые этой частью средства. Тогда каждый логически законченный файл.cрр будет имеет соответствующий ему заголовочный файл.h.

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

В рассматриваемых программах файл.h обычно служит интерфейсом для других ее частей, а файл.cрр – задает его реализацию. Такой объект часто называют модулем. Доступными делаются только те имена, которые необходимо знать пользователю, остальные скрыты. Это качество часто называют скрытием данных, хотя данные - лишь часть того, что может быть скрыто. Модули такого вида обеспечивают большую гибкость. Например, реализация может состоять из одного или более.c файлов, а в виде.h файлов может быть предоставлено несколько интерфейсов. Информация, которую пользователю знать не обязательно, искусно скрыта в *.c файлах.

Области действия данных

Заголовочные файлы позволяют программисту определить явный интерфейс для обеспечения согласованного использования типов данных в программе. В отсутствие заголовочного файла идентификация переменных и функций определяется с помощью четырех спецификаций класса памяти: auto, register, extern и static (см. лекцию).

Как создать библиотеку

В качестве примера рассмотрим случай, когда необходимо задать (обычным способом) набор математических функций для некоторого неопределенного множества пользователей. Заголовочный файл мог бы выглядеть примерно так:

extern double sqr(double); // подмножество

extern double sin(double);

extern double cos(double);

extern double exp(double);

extern double log(double);

а определения этих функций хранились бы соответственно в файлах sqrt.c, sin.c, cos.c, exp.c и log.c.

Можно создать библиотеку с именем mat.h (см. лекцию biblio.pdf):

 

Задание.

1. В "Практическом руководстве по методам вычислений с приложением программ для ПК" Ракитин В.И., Первушин В.Е. –М.: Высш.шк., 1998. -383с.; даны примеры решений задач вычислительной математики численными методами. Приложение с программами на разных языках программирования находятся в папке с лабораторной работой (Rakitin_Pervushin.pdf);

2. Необходимо переписать программы (2-3 шт. см. вариант) с применением объектно-ориентированного программирования, создав один или несколько классов, отделяя интерфейс от реализации (лаб.4);

3. Объединить созданные программы в библиотеку (статическую и динамическую);

4. Написать программу, реализующую использование одной программы из созданной библиотеки. Библиотеку подключить статически и динамически. Определить размер запускаемого файла.

 

Варианты заданий.

  1. Решение систем линейных алгебраических уравнений

ü методом Гаусса

ü методом итераций

  1. Решение уравнения f(x) = 0

ü методом половинного деления

ü методом итераций

  1. Вычисление производной

ü по ее определению

ü с одинаковым порядком аппроксимации по шагу h

  1. Решение задачи Коши для дифференциального уравнения

ü первого порядка методами Эйлера, Эйлера-Коши и Рунге-Кутта

ü системы дифференциальных уравнений методом Рунге-Кутта

  1. Вычисление определенного интеграла

ü по квадратурным формулам прямоугольников, трапеций и Симпсона

ü методом двойного пересчета по формуле Симпсона

  1. Поиск минимума функции одной переменной

ü методом половинного деления

ü методом золотого сечения

ü методом сканирования

  1. Поиск минимума функции двух переменных

ü методом покоординатного спуска

ü методом скорейшего спуска

 

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

 

  1. Чем определяется количество заголовочных файлов в проекте?
  2. Когда используются модули? Что они представляют?
  3. Каково назначение подключаемых библиотек? Перечислить их виды и охарактеризовать.
  4. Преимущества и недостатки использования библиотек.
  5. Какие особенности объектно-ориентированного программирования использованы в данной работе?
  6. В чем заключается преимущество применения ООП в данной работе?
  7. В командной строке была введена следующая команда:

%gcc –o app –L. ltest app.o

компоновщик выдал ошибку

app.o: In function 'main';

app.o(.text+0x4): undefined reference to 'f'

collect2: ld returned 1 exit status

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

 

Лабораторная работа 6

Наследование и полиморфизм

Цель работы: отработка умений и навыков работы с механизмом наследования классов.

Задания

В лабораторной работе 2 вы создали и отладили работу некоторого класса. Неотъемлемыми принципами объектно-ориентированного программирования являются наследование и полиморфизм. В данной работе вам предложено создать класс – наследник, и, где это необходимо, перегрузить методы класса – родителя, предав новому классу новую функциональность.

см. лекцию lek4-6.pdf

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

  1. Разработать класс ChangeInteger – изменение массива, наследованный от класса IntegerSet. Напишите функцию-элемент insertElement, которая вставляет новое целое k в множество (устанавливает элемент а[k] равным 1). Напишите функцию-элемент deleteElement, которая удаляет из множества целое m (устанавливает элемент а[m] равным 0). Напишите функцию-элемент isEqualTo, которая определяет, равны ли друг другу два множества.
  2. Разработать класс NormVector – вектор единичной длины, наследованный от класса Vector.

Замечание: нормирование необходимо производить после любого изменения составляющих вектора. Соответственно необходимо перегрузить метод доступа к компонентам вектора.

  1. Разработать класс NormMatrix (матрица с единичным определителем), наследованный от класса Matrix.

Замечание: для упрощения пусть матрица будет размерностью до 3х3. Нормирование матрицы необходимо производить после любого изменения составляющих. Соответственно необходимо перегрузить метод доступа к ее компонентам.

  1. Разработать класс SortedArrayOfInt – упорядоченный массив целых чисел, наследованный от класса ArrayOfInt. Организовать сортировку по возрастанию и убыванию.

Замечание: сортировку массива необходимо производить после любого изменения его составляющих. Соответственно необходимо перегрузить метод доступа к его компонентам.

  1. Разработать класс EncryptedFile – шифрованный файл, наследованный от файла FileStream. В конструктор данного класса передавать ключ – последовательность из нескольких символов, все операции чтения и записи производить через виртуальную процедуру шифрования. Об алгоритме шифрования читайте в комментариях. Все остальные методы сохраняются аналогично классу FileStream.
  2. Реализовать класс ValidDate (корректная дата), наследованный от класса Date. При каждом изменении даты необходимо производить контроль корректности даты. Реализовать метод вывода печати в различных форматах.
  3. Реализовать класс ValidTime – корректное время, наследованный от класса Time. При каждом изменении времени необходимо производить контроль корректности времени. Реализовать методы форматного вывода этой информации.
  4. Реализовать класс Parallelepiped – параллелепипед, наследованный от класса Rectangular. Класс должен принимать третью величину – высоту (height) и находить объемные характеристики фигуры: площадь поверхности и объем. Организовать вывод новых результатов.
  5. Реализовать класс Sphere – сфера, наследованный от класса Circle. Класс должен находить и выводить объемные характеристики фигуры: площадь поверхности и объем.
  6. Разработать класс PolarComplex (комплексные числа, представленные в полярных координатах), наследованный от класса Complex. Ввод и вывод этих чисел осуществляется в полярных координатах, хранение и все остальные методы оставить родительские.
  7. Разработать класс AlternatingCurrent – переменный ток, наследованный от класса Current. Класс должен находить характеристики переменного электрического тока: активные, реактивные и полные сопротивление и мощность, а так же коэффициент мощности. Организовать вывод новых результатов.
  8. Разработать класс SRational – сокращенная дробь, наследованный от класса Rational. Класс должен сокращать дроби, при вводе данных и дроби полученные в результате действий над ними. Организовать вывод новых результатов.

 

Комментарии

 

Комментарий 1. Четырехкомпонентный вектор является представлением трехмерной точки в памяти компьютера, причем первые три компоненты являются координатами x,y,z точки, а четвертая компонента равна 1:

Матрица 4х4 – матрица преобразования координат точки в пространстве. Любое движение (то есть преобразование пространства, сохраняющее расстояние между точками) в трехмерном пространстве, согласно теореме Шаля, может быть представлено в виде суперпозиции поворота и параллельного переноса, то есть последовательного выполнения поворота и параллельного переноса.

Перенос точки в пространстве осуществляется умножением матрицы на четырехкомпонентный вектор, где dx, dy, dz – расстояние переноса по каждой из осей.

Поворот точки относительно оси OZ на угол alpha осуществляется умножением на матрицу .

Поворот точки относительно оси OX на угол alpha осуществляется умножением на матрицу .

Масштабирование осуществляется умножением на матрицу , где kx, ky, kz – коэффициенты масштабирования по соответствующим осям.

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

Комментарий 2. Для варианта №5. Реализовать функцию шифрования можно очень простую, здесь от вас не требуется создавать мощные криптостойкие алгоритмы, а сделать простенький алгоритм шифрования. Один из вариантов реализации такого алгоритма:

1. начальная инициализация

2. пусть k – строка ключа, n = длина ключа, i=0

3.

4. процедура записи в файл

5. пусть s = входная цепочка, m = длина входной цепочки

6. пусть j=0

7. пока j<m делаем

8. запишем в файл k[i] xor s[j]

9. i++, j++

10. если i==n тогда пусть i=0

11. конец пока

12. конец процедуры

13.

14. процедура чтения из файла

15. пусть s = выходная цепочка, m = длина выходной цепочки

16. пусть j=0

17. пока j<m делаем

18. считаем из файла символ ch

19. s[j] = k[i] xor ch

20. i++, j++

21. если i==n тогда пусть i=0

22. конец пока

23. конец процедуры

 

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

 

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

Заполните пробелы:

1. Если класс Alpha наследует свойства классу Beta, то класс Alpha называется __?__ классом, а класс Beta – __?__ классом.

2. Наследование предполагает возможность __?__, что экономит время разработки и способствует использованию проверенного и высококачественного программного обеспечения.

3. Объект __?__ класса можно рассматривать как объект соответствующего ему __?__ класса.

4. Для преобразования типа указателя базового класса в тип производного класса, должно быть использовано __?__, потому что компилятор считает такую операцию опасной.

5. Существуют три спецификатора доступа к элементу: __?__, __?__ и __?__. Какие функции они выполняют?

6. При порождении класса от базового класса открытым наследованием открытые элементы базового класса становятся __?__ элементами производного класса, а защищенные элементы базового класса становятся __?__ элементами производного класса.

7. При порождении класса от базового класса защищенным наследованием открытые элементы базового класса становятся __?__ элементами производного класса, а защищенные элементы базового класса становятся __?__ элементами производного класса.

8. Отношение между классами "содержит" представляет __?__, а отношение "является" представляет __?__.

9. Использование наследования и полиморфизма помогает исключить логику __?__.

 

 

Лабораторная работа 7

 



Поделиться:


Последнее изменение этой страницы: 2016-08-14; просмотров: 215; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.200.179.138 (0.049 с.)