Дипломная работа на тему Вычисление определителя разложением по элементам строки. Программирование и раздел сайта

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

(ФГБОУ ВПО «КубГУ»)

Кафедра вычислительной математики и информатики

ДИПЛОМНАЯ РАБОТА

Вычисление определителя разложением по элементам строки.

Программирование и раздел сайта

Работу выполнил

Тюлин Никита Владимирович

Факультет математики и компьютерных наук, курс 5, группа 52

специальность 010101.65 Математика

Научный руководитель,

канд. физ.-мат. наук,

доцент

В. З. Цалюк

Краснодар 2013

Содержание

Введение

1. Теоретическая часть

1.1 Указатели

1.2 Динамическая память

1.3 Верстка веб страниц

2. Практическая часть

2.1 Постановка задачи

2.2 Алгоритм перехода от индексов к указателям

2.3 Требования к учебному тексту

2.4 Требования к веб-странице

2.5 Решение поставленной задачи

Заключение

Список литературы

функция определитель матрица алгоритм

Введение

Данная дипломная работа посвящена наглядному изучению методов работы с указателями и динамической памятью. В практической части для конкретной задачи поэтапно описывается процесс написания программы, использующей указатели. В качестве языка программирования был выбран 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). Но, что важнее, данное решение является расточительным и вредным для обучения. Для любого массива программе приходится выделять размер максимально возможного массива, расходуя ограниченные ресурсы стека. Ситуация усугубляется, если какие-либо процедуры для своих целей должны копировать массив в стек (например, если исходный массив не должен измениться после работы процедуры).

Для данной дипломной работы не случайно была выбрана задача, использующая рекурсию, а именно: вычисление определителя матрицы разложением по элементам строки. Методы, использующие рекурсивные процедуры, значительно расходуют ограниченное пространство стека, что рождает потребность в точном использовании динамической памяти. Использование ресурсоемкой рекурсии оправдывается удобством программирования. А в заявленном методе, в отличие от более эффективных с точки зрения скорости и ресурсоемкости, но менее точных методов, появляется возможность вычисления определителей целочисленных матриц без погрешности.

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

1. Теоретическая часть

1.1 Указатели

Указатель — это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера. Подобно тому, как переменная типа CHAR имеет в качестве значения символ, а переменная типа INTEGER — целочисленное значение, переменная типа указателя имеет в качестве значения адрес ячейки оперативной памяти. Допустимые значения для переменной-указателя — множество адресов оперативной памяти компьютера.-

В языке Pascal объявление типа указателя состоит из символа ^ (крышка, циркумфлекс) и имени типа.

Общая форма объявления указателя:

Имя: ^Тип;

Тип указателя определяет тип объекта, на который указатель будет ссылаться, например,

p1: ^REAL;

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

Понятие указателя тесно связано с понятием адреса объекта. В языке Pascal есть специальная операция, позволяющая получить адрес любой переменной:

@p – получение адреса, где p – идентификатор переменной. Результатом операции является адрес переменной p.

Понятие переменной типа указатель также связано с операцией косвенной адресации ^, называемой еще операцией разыменования, которая имеет структуру: р^ — разыменование, где р — идентификатор переменной-указателя. Эта запись означает, что в ячейку с адресом, записанным в переменную р, помещено значение некоторой величины.

Увеличение адреса указателя выполняется с помощью операции инкремента Inc(p). Уменьшение – с помощью операции декремента Dec(p).

1.2 Динамическая память

При использовании динамической памяти (ДП) отпадает необходимость заранее распределять память для хранения данных, используемых программой. Управление динамической памятью — это способность определять размер объекта и выделять для его хранения соответствующую область памяти в процессе исполнения программы.

При динамическом выделении памяти для хранения данных используется специальная область памяти, так называемая «куча» (heap). Объем «кучи» и ее местоположение зависят от модели памяти, которая определяет логическую структуру памяти программы.

Выделить память можно следующим способом:

GetMem(p, s * n);

Здесь p — указатель на начало выделенного под вспомогательный массив участка динамической памяти, s — количество байт, необходимое для размещения одного элемента массива, n — длина массива (размерность вспомогательного вектора).

Значение параметра s зависит от типа элементов массива и может быть вычислено следующим образом:

s := Size(TYPE);

Где TYPE — тип данных элемента массива.

После использования память следует освободить:

FreeMem(p, s * n);

Причем все параметры должны совпадать по значению с теми, которые использовались при выделении.

1.3 Верстка веб-страниц

Веб-страница — гипертекстовый ресурс Всемирной паутины, обычно написанный на языке HTML. Веб-страница может содержать ссылки для быстрого перехода на другие страницы, а также статические и динамические изображения. Программа, демонстрирующая веб-страницу, называется веб-браузер. Несколько веб-страниц, объединенных общей темой и дизайном, а также связанных между собой ссылками, и обычно находящихся на одном веб-сервере, образуют веб-сайт.

HTML (от англ. Hypertext Markup Language — «язык разметки гипертекста») — это стандартный язык разметки документов (страниц сайтов) в Интернет. Все веб-страницы создаются при помощи языка HTML (или XHTML). Язык HTML интерпретируется браузером и отображается в виде документа, удобном для восприятия человеком.

Вёрстка веб-страниц сайта — процесс формирования веб-страниц сайта в текстовом либо WYSIWYG редакторе, а также результат этого процесса, то есть собственно веб-страницы.

CSS (англ. Cascading Style Sheets — каскадные таблицы стилей) — технология описания внешнего вида документа (страницы сайта), написанного языком разметки. Преимущественно используется как средство оформления веб-страниц в формате HTML и XHTML, но может применяться с любыми видами документов в формате XML, включая SVG и XUL.

2. Практическая часть

2.1 Постановка задачи

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

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

где – элемент матрицы , стоящий на пересечении i-той строки с j-тым столбцом матрицы, а – его минор, т.е. определитель n-1-го порядка, составленный из элементов, оставшихся после вычеркивания i-той строки и j-того столбца.

2.2 Алгоритм перехода от индексов к указателям

Далее сформулируем основные этапы алгоритма перехода от индексов к указателям, использовавшегося на сайте В. З. Цалюка [1] для решения более простых примеров. Не сужая общности рассуждений, будем использовать термины языка Pascal.

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

· Все размерности вносятся в раздел CONST. А все числа, зависящие от них, заменяются своими выражениями через эти размерности.

· Размерности вносятся в список аргументов функции.

· Удалить все описания типов из раздела TYPE. Сделать размерности переменными (убрать раздел CONST)

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

· Преобразования внутри тела функции.

Заменить каждое индексное выражение указателями.

· Оптимизация (если возможно).

2.3 Требования к учебному тексту

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

Разделить текст на этапы, соответствующие этапам общего алгоритма перехода от индексов к указателям. Этапы, требующие более детального рассмотрения можно разделить на несколько пунктов.

Каждый этап должен:

* начинаться с короткого тезиса, отражающего назначение соответствующего этапа;

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

* приводить программу к виду, позволяющему легко проверить правильность выполнения инструкций.

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

2.4 Требования к веб-странице

Сформировать веб-страницу на основе имеющегося методического материала, в соответствии с CSS-стилями раздела «Этюды по алгоритмизации» и общей стилистикой сайта [1], организовать соответствующую функциональность, обеспечить аддитивность по отношению к другим разделам сайта.

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

Предполагается для редактирования html-кода использовать обычный текстовый редактор. Для создания скриншотов кода на языке Pascal, формул и других изображений использовать бесплатные версии программ Free Pascal 2.6.0, Gimp 2.8.0, OpenOffice 3.4.0.

2.5 Решение поставленной задачи

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

Этот этап уже был подробно описан на сайте В.З. Цалюка [1]. На прилагающемся диске имеется полный текст функции (см. Приложение 1, файл DET0.PAS). Кратко опишем важные моменты.

В программе объявлена одна константа и два пользовательских типа данных:

CONST NN = 3;

TYPE

Matrix = ARRAY[1..NN,1..NN] OF LongInt;

Index = ARRAY[1..NN] OF BOOLEAN;

Константа NN используется для определения двух типов массивов:

1) Matrix – двумерный массив размерности [1..NN, 1..NN] чисел типа LongInt, который мы будем использовать для хранения элементов матрицы;

2) Index – одномерный массив размерности [1..NN], состоящий из элементов логического типа Bool;

Массивы row и cols типа Index будут использоваться для того, чтобы указать, на персечении каких строк и столбцов матрицы расположены элементы вычисляемого минора. Равенство rows[i] = TRUE будет означать, что строка матрицы A с номером i участвует в определении минора, и аналогично в массиве cols будем указывать входящие в минор столбцы матрицы.

Объявим основную функцию:

det(VAR A: Matrix): LongInt;

Функция вычисляет значение определителя матрицы A

Входной параметр:

A: Matrix – массив элементов матрицы, передаваемый по ссылке;

Выходной параметр:

Функция возвращает определитель квадратной матрицы, расположенной в массиве A.

FUNCTION det(VAR A: Matrix): LongInt;

VAR

i: WORD;

BEGIN

FOR i := 1 TO NN DO

BEGIN

rows[i] := TRUE;

cols[i] := TRUE;

END;

det := minor(A, rows, cols, NN);

END;

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

row, cols: Index

и две вспомогательные функции:

1) minor(VAR A: Matrix; VAR rows, cols: Index; n: WORD): LongInt;

2) FindTrue(VAR mas: Index): WORD;

причем minor вызывается рекурсивно.

FUNCTION minor(VAR A: Matrix;

VAR rows, cols: Index; n: WORD): LongInt;

VAR

i, j: WORD;

aa, sum: LongInt;

jo: INTEGER;

BEGIN

i := FindTrue(rows);

IF n = 1 THEN

BEGIN

j := FindTrue(cols);

minor := A[i,j];

END

ELSE

BEGIN

rows[i] := FALSE;

Dec(n);

sum := 0;

jo := 1;

FOR j := 1 TO NN DO

IF cols[j] THEN

BEGIN

cols[j] := FALSE;

aa := A[i, j];

IF aa <> 0 THEN

sum := sum + jo * aa * minor(A, rows, cols, n);

cols[j] := TRUE;

jo := -jo;

END;

minor := sum;

rows[i] := TRUE;

END;

END;

В свою очередь minor использует функцию FindTrue для исследования массивов row, cols:

FUNCTION FindTrue(VAR mas:Index):WORD;

VAR i: WORD;

BEGIN

FOR i := 1 TO NN DO

IF mas[i] THEN

BEGIN

FindTrue := i;

Exit;

END;

FindTrue := 0;

END;

Рассмотрим теперь главную процедуру, где демонстрируется вызов функции Det:

BEGIN

Assign(f, ‘num.txt’);

reset(f);

FOR i := 1 TO NN DO

FOR j := 1 TO NN DO

Read(f, A[i,j]);

Close(f);

d := det(A);

WriteLn(d:5);

END.

Здесь элементы матрицы считываются из текстового файла.

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

Этап 2.

Размерности вносятся в список аргументов функций.

det(VAR A: Matrix; k: WORD): Real;

FindTrue(VAR mas: Index; k: WORD): WORD;

minor(VAR A: Matrix; k: WORD; VAR rows, cols: Index; n: WORD): LongInt;

Так же нужно не забыть в теле каждой функции сменить константу NN на передаваемое значение k.

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

d := det(@A, m);

Теперь наша программа может работать с массивами любой размерности не более NN. Полный текст измененной программы в приложении (файл DETPT01.PAS).

Этап 3.

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

det(pA: LongIntPtr; k: WORD): Real;

FindTrue(mas: BoolPtr; k: WORD): WORD;

minor(A: LongIntPtr; k: WORD; pRow, pCol: BoolPtr; n: WORD): LongInt;

Ключевое слово VAR перед аргументами-указателями в объявлении каждой функции следует убрать, ведь мы и так передаем ссылку. Если же оставить VAR перед указателем, то функция не станет создавать его копию в оперативной памяти, а будет работать с ним непосредственно, следовательно, будет иметь возможность изменить значение указателя.

Очевидно, что предварительно необходимо объявить соответствующие типы данных:

TYPE

LongIntPtr = ^LongInt;

BoolPtr = ^BOOLEAN;

Удаляем из глобальных переменных более не нужные здесь массивы rows и cols.

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

Этап 4.

Преобразования внутри тела функции.

Нужно заменить каждое индексное выражение указателями и организовать их перемещение между элементами предполагаемых массивов.

FUNCTION FindTrue(mas: BoolPtr; k: WORD): WORD;

VAR i: WORD;

BEGIN

FOR i := 1 TO k DO

IF mas^ THEN

BEGIN

FindTrue := i;

Exit;

END

ELSE

Inc(mas);

FindTrue := 0;

END;

Идентификатор переменной-указателя хранит адрес текущего элемента массива, а оператор “^” позволяет обратиться к значению, расположенному по этому адресу. Таким образом, конструкция mas^ фактически является текущим элементом. Перемещать указатель по массиву можно с помощью операций инкрементирования Inc и декрементирования Dec, например Inc(mas) переместит указатель mas на следующий элемент, а Inc(mas, i-1) переместит на элемент с номером i (если mas перед этим указывал на начало массива, т.е. на первый элемент). На самом деле инкрементация (декрементация) просто увеличивает (уменьшает) адрес указателя на число байт, равное количеству байт, необходимому для хранения переменной типа, соответсвующего типу данного указателя. Поэтому важно следить, чтобы все элементы массива располагались последовательно в памяти компьютера. Элементы двумерных массивов тоже располагаются в памяти последовательно, а именно по строкам. Поэтому если нужно переместить указатель по столбцу, то перемещать нужно ровно на длину строки столько раз, на сколько элементов надо переместиться по столбцу. Таким образом Inc(A, k*(i-1)) переместит указатель на начало строки с номером i.

С помощью оператора “@” можно получить адрес любой переменной. Этим можно воспользоваться при вызове функции Det(@A, m), так как глобальная переменная A все еще имеет тип Matrix.

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

FUNCTION minor(pA: LongIntPtr; k: WORD;

pRow, pCol: BoolPtr; n: WORD): LongInt;

VAR

i, j: WORD;

sum: LongInt;

jo: INTEGER;

A: LongIntPtr;

rows, cols: BoolPtr;

BEGIN

A := pA;

rows := pRow;

cols := pCol;

i := FindTrue(pRow, k);

Inc(A, k*(i-1));

Inc(rows, i-1);

IF n = 1 THEN

BEGIN

j := FindTrue(pCol, k);

Inc(A, j-1);

Inc(cols, j-1);

minor := A^;

END

ELSE

BEGIN

rows^ := FALSE;

Dec(n);

sum := 0;

jo := 1;

FOR j := 1 TO k DO

BEGIN

IF cols^ THEN

BEGIN

cols^ := FALSE;

IF A^ <> 0 THEN

sum := sum + jo * A^ * minor(pA, k, pRow, pCol, n);

cols^ := TRUE;

jo := -jo;

END;

Inc(A);

Inc(cols);

END;

minor := sum;

rows^ := TRUE;

END;

END;

Внутри функции Det указатель A не изменяется, поэтому его копировать не нужно. А вот для бывших глобальных массивов rows и cols в разделе VAR функции необходимо выделить по 2 указателя, так как эти новые массивы теперь будут появляться во время вызова функции Det и исчезать после завершения ее работы.

FUNCTION det(A: LongIntPtr; k: WORD): LongInt;

VAR

i: WORD;

pCol, pRow, rows, cols: BoolPtr;

BEGIN

pRow := rows;

pCol := cols;

FOR i:= 1 TO k DO

BEGIN

pRow^ := TRUE;

pCol^ := TRUE;

Inc(pRow);

Inc(pCol);

END;

det := minor(A, k, rows, cols, k);

END;

Теперь наша программа может вести себя непредсказуемо, так как мы никаким образом не инициализировали массивы, на которые указывают rows и cols.

Этап 5.

Динамическое выделение памяти для вспомогательных массивов.

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

С помощью GetMem(p, n * s) можно выделить участок памяти необходимый для массива, состоящего из n элементов, каждый из которых занимает s байт, и получить адрес начала этого участка в указатель p. Выделенный таким способом участок памяти будет защищен, как минимум, от попыток использовать его повторно, но нужно помнить, что указатели могут перемещаться как по выделенной памяти, так и по свободной, поэтому ничто не спасет “защищенный” участок от ошибок программиста в работе с указателями.

Количество байт нужное для определенной переменной можно узнать с помощью функции sizeOf. Она может принимать как конкретную переменную, так и название типа. Например sizeOf(BOOLEAN) вернет единицу, так как размер переменной типа BOOLEAN равен одному байту.

FreeMem(p, n * s) позволяет освободить выделенную память. Все параметры должны совпадать по значениям с теми, которые использовались при выделении памяти.

FUNCTION det(A: LongIntPtr; k: WORD): LongInt;

VAR

i: WORD;

pCol, pRow, rows, cols: BoolPtr;

BEGIN

GetMem(rows, k{*sizeof(rows^)});

GetMem(cols, k{*sizeof(cols^)});

pRow := rows;

pCol := cols;

FOR i:= 1 TO k DO

BEGIN

pRow^ := TRUE;

pCol^ := TRUE;

Inc(pRow);

Inc(pCol);

END;

det := minor(A, k, rows, cols, k);

FreeMem(rows, k{*sizeof(rows^)});

FreeMem(cols, k{*sizeof(cols^)});

END;

Теперь в главной процедуре не стоит использовать матрицу типа Matrix, потому что элементы матрицы, передаваемой функции Det, должны последовательно располагаться в памяти, а для массивов данного типа это выполнено только для матриц размера NN x NN. Но теперь мы сами можем создать массив любого нужного нам размера:

BEGIN

Assign(f, ‘num0.txt’);

reset(f);

Read(f, m);

GetMem(pA, m*m*4{sizeof(pA^)});

A := pA;

FOR i := 1 TO m DO

FOR j := 1 TO m DO

BEGIN

Read(f, A^);

Inc(A);

END;

Close(f);

d := det(pA, m);

FreeMem(pA, m*m*4{sizeof(pA^)});

WriteLn(d:5);

END.

Функция полностью готова. В приложении можно найти итоговый листинг программы (см. Приложение 1, файл DETPT03.PAS).

Тесты.

Программа успешно прошла следующий набор тестов:

1)

2)

3)

4)

5)

6)

Заключение

Проделана методическая работа на тему программирования с использованием технологий адресации (указателей). Написана итоговая программа, демонстрирующая работу модифицированной функции, составлена система тестов, для нее.

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

На основе учебно-методического текста была разработана веб-страница в формате html для возможного размещения на сайте [1]. Текст был переработан, добавлены ссылки для скачивания промежуточных версий программы, для создания скриншотов кода на языке Pascal, формул и других изображений использовались бесплатные версии программ Free Pascal 2.6.0, Gimp 2.8.0, OpenOffice 3.4.0. Html-верстка составлена с соблюдением CSS-стилей и DOM структуры страниц вышеуказанного сайта.

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

Список литературы

В.З. Цалюк Этюды по алгоритмизации:

http://vts.math.kubsu.ru/pascal/pascal.htm

Учебные материалы Санкт-Петербургского государственного университета телекоммуникаций им. проф. М.А. Бонч-Бруевича:

http://www.sut.ru/

Студия «Вэл Дизайн». Верстка — определения терминов http://welldesign.ru/studio/process/markup/markup-definitions

Поделиться статьёй
Поделиться в telegram
Поделиться в whatsapp
Поделиться в vk
Поделиться в facebook
Поделиться в twitter
Леонид Федотов
Леонид Федотов
Окончил НИУ ВШЭ факультет компьютерных наук. Сам являюсь кандидатом наук. По специальности работаю 13 лет, за это время создал 8 научных статей и 2 диссертации. В компании подрабатываю в свободное от работы время уже более 5 лет. Нравится помогать школьникам и студентам в решении контрольных работ и написании курсовых проектов. Люблю свою профессию за то, что это направление с каждым годом становится все более востребованным и актуальным.

Ещё статьи

Нет времени делать работу? Закажите!
Вид работы
Тема
Email

Отправляя форму, вы соглашаетесь с политикой конфиденциальности и обработкой ваших персональных данных.