Динамическое выделение памяти для хранения данных. Верстка веб-страниц сайта. Расчет функции, вычисляющей определитель квадратной матрицы произвольного размера с целочисленными элементами. Этапы алгоритма перехода от индексных выражений к указателям.
Аннотация к работе
1.1 Указатели 1.3 Верстка веб страниц 2.2 Алгоритм перехода от индексов к указателямПодобно тому, как переменная типа CHAR имеет в качестве значения символ, а переменная типа INTEGER - целочисленное значение, переменная типа указателя имеет в качестве значения адрес ячейки оперативной памяти. Фактически указатель любого типа может ссылаться на любое место в памяти, но выполняемые над указателем операции существенно зависят от его типа. Далее сформулируем основные этапы алгоритма перехода от индексов к указателям, использовавшегося на сайте В. З. · Все массивы, входящие в список аргументов функции, заменить указателями, указывающими на переменную того же типа, что и элементы массива. Массивы row и cols типа Index будут использоваться для того, чтобы указать, на персечении каких строк и столбцов матрицы расположены элементы вычисляемого минора.Проделана методическая работа на тему программирования с использованием технологий адресации (указателей). Написана итоговая программа, демонстрирующая работу модифицированной функции, составлена система тестов, для нее. На основе проделанной работы составлен учебно-методический текст, подробно описывающий алгоритм перехода от массивов к указателям, на нетривиальном примере.
План
Содержание
Введение
1. Теоретическая часть
Вывод
Проделана методическая работа на тему программирования с использованием технологий адресации (указателей). Написана итоговая программа, демонстрирующая работу модифицированной функции, составлена система тестов, для нее.
На основе проделанной работы составлен учебно-методический текст, подробно описывающий алгоритм перехода от массивов к указателям, на нетривиальном примере. В частности, рекурсивный алгоритм вычисления определителя матрицы разложением по элементам строки был приведен к безразмерному виду. В силу достаточной сложности задачи, удалось затронуть заявленные специфические аспекты использования указателей, динамической памяти, рекурсии.
На основе учебно-методического текста была разработана веб-страница в формате html для возможного размещения на сайте [1]. Текст был переработан, добавлены ссылки для скачивания промежуточных версий программы, для создания скриншотов кода на языке Pascal, формул и других изображений использовались бесплатные версии программ Free Pascal 2.6.0, Gimp 2.8.0, OPENOFFICE 3.4.0. Html-верстка составлена с соблюдением CSS-стилей и DOM структуры страниц вышеуказанного сайта.
В приложении имеются листинги всех промежуточных версий программы, документация на итоговую функцию, тестирующая программа, разработанная веб-страница и текст дипломной работы.
Список литературы
функция определитель матрица алгоритм
Введение
Данная дипломная работа посвящена наглядному изучению методов работы с указателями и динамической памятью. В практической части для конкретной задачи поэтапно описывается процесс написания программы, использующей указатели. В качестве языка программирования был выбран Pascal.
Целью работы является составление учебно-методического текста по теме «Указатели». В частности, планируется: 1) на нетривиальном примере продемонстрировать метод перехода от массивов к указателям, изложенный на сайте В.З. Цалюка [1];
2) на основе разработанного учебно-методического текста сверстать html версию, приемлемую для использования на вышеуказанном сайте.
Теоретическая часть курсовой работы написана на основе лекций и материалов, расположенных сайте В.З. Цалюка [1]. Также использовались материалы сайта Санкт-Петербургского государственного университета телекоммуникаций [2] и свободные интернет материалы [3].
Правильное понимание и использование указателей особенно необходимо для составления хороших программ по следующим причинам: · указатели позволяют повысить эффективность программирования (к примеру, в некоторых ситуациях с помощью указателей можно существенно повысить скорость прохода массива);
· указатели обеспечивают поддержку динамических структур данных (таких как связанные списки и динамические массивы);
· при помощи указателей выполняется динамическое распределение памяти.
Однако написание программ с использованием указателей требует значительного напряжения и предельного внимания. Указатель может вызвать ряд затруднений, например, если указатель содержит неправильное значение, программа может быть неработоспособной. Можно легко ошибиться при использовании указателей; к тому же ошибки, связанные с неправильными значениями указателей, найти очень трудно. Но преимущества программирования с использованием указателей компенсируют все сложности.
Часто возникают ситуации, когда заранее не известно, сколько объектов - чисел, элементов массива, строк текста и прочих данных будет использовать программа. В этом случае используется динамическое выделение памяти, когда память занимается и освобождается в процессе исполнения программы. Управление памятью происходит посредством указателей.
Ярким примером подобной ситуации может послужить потребность в процедуре, которая должна работать с массивами различной длины. Приведем банальный пример: ввод элементов массива. Иногда для решения такой задачи достаточно объявить тип массива с константой в определении, например: CONST NN = 3;
TYPE
Vec = ARRAY[1..NN] OF REAL;
PROCEDURE WRITEVEC(v: Vec);
VAR i: WORD;
BEGIN
FOR i := 1 TO NN DO
READLN(v[i]);
END
Этот способ работает, но имеет серьезные ограничения. Чтобы функция работала с вектором другого размера, нужно изменить константу и перекомпилировать программу. Этот метод не подходит, если программа должна работать одновременно с несколькими массивами разной длины, особенно если длина массивов не известна до компиляции.
Нередко в подобной ситуации неопытный программист поступает следующим образом. Он задает достаточно большую константу, а размер вектора передает процедуре среди параметров.
CONST NN = 15;
TYPE
Vec = ARRAY[1..NN] OF REAL;
PROCEDURE WRITEVEC(v: Vec; k: WORD);
VAR i: WORD;
BEGIN
FOR i := 1 TO k DO
READLN(v[i]);
END;
Несмотря на то, что этот вариант может справляться со своей задачей, он, так же как и предыдущий пример имеет ограничения (такая процедура не будет работать с массивами, длина которых больше NN). Но, что важнее, данное решение является расточительным и вредным для обучения. Для любого массива программе приходится выделять размер максимально возможного массива, расходуя ограниченные ресурсы стека. Ситуация усугубляется, если какие-либо процедуры для своих целей должны копировать массив в стек (например, если исходный массив не должен измениться после работы процедуры).
Для данной дипломной работы не случайно была выбрана задача, использующая рекурсию, а именно: вычисление определителя матрицы разложением по элементам строки. Методы, использующие рекурсивные процедуры, значительно расходуют ограниченное пространство стека, что рождает потребность в точном использовании динамической памяти. Использование ресурсоемкой рекурсии оправдывается удобством программирования. А в заявленном методе, в отличие от более эффективных с точки зрения скорости и ресурсоемкости, но менее точных методов, появляется возможность вычисления определителей целочисленных матриц без погрешности.
Помимо этого, предложенный пример является довольно простым с математической точки зрения, и достаточно сложным с точки зрения программирования, что позволяет наглядно объяснить тонкости работы с указателями и динамической памятью, продемонстрировать проблемы, которые можно решить с их помощью и рассказать о типичных ошибках, которые могут возникнуть у программиста, использующего указатели.В.З. Цалюк Этюды по алгоритмизации: Учебные материалы Санкт-Петербургского государственного университета телекоммуникаций им. проф. М.А. Бонч-Бруевича: Студия «Вэл Дизайн». Верстка - определения терминов