СПМ у зовнішньому фінансовому аналізі


Repeat

Begin

Begin

Repeat

Begin

Begin

Begin

Begin

Repeat

Begin

Begin

Begin

Begin

Begin

Begin

Repeat

Begin

Begin

Repeat

Begin

Begin

Begin

Begin

Begin

Var

Type

TNode = record

name: string[50]; { Имя каталога/файла }

size: LongInt; { Размер файла (байт) }

node_type: Char; { Тип узла (файл - 'f' / каталог-'c') }

up, down: Pointer; { Указатели на предка и список потомков }

last, next: Pointer; { Указатели на соседние узлы }

end;

 

n, i, l, error: Integer;

current_root: Pointer;

pnt, current: ^TNode;

str: string;

 

{ Отображение физического оглавления диска в логическую структуру }

procedure CreateTree(local_root:Pointer);

var s: TSearchRec; local_node, local_r_node, local_last: ^TNode;

{ Создание нового узла в дереве каталогов и файлов }

procedure NewNode;

New(local_node);

local_node^.last:=local_last;

if local_last <> nil then

local_last^.next:=local_node;

local_node^.next:=nil;

local_node^.down:=nil;

local_node^.up:=local_r_node;

if local_r_node^.down = nil then

local_r_node^.down:=local_node;

local_node^.name:=local_r_node^.name+'\'+s.name;

if faDirectory = 0 then

local_node^.node_type:='f' else

local_node^.node_type:='c';

local_node^.size:=s.size;

local_last:=local_node;

end;

{ Собственно процедура }

local_r_node:=local_root;

local_last:=nil;

error:=FindFirst(local_r_node^.name+'\*.*',faAnyFile,s);

if error = 0 then

if (s.name<>'.') and (s.name<>'..') then NewNode;

while error = 0 do

error:=FindNext(s);

if (error = 0) and (s.name<>'.') and (s.name<>'..') then NewNode;

end;

end;

if local_r_node^.down <> nil then

local_node:=local_r_node^.down;

{ Рекурсивный вызов }

if local_node^.node_type = 'c' then CreateTree(local_node);

local_node:=local_node^.next

until local_node = nil;

end;

end;

 

{ Вывод оглавления текущего каталога }

procedure CurrentList;

current:=current_root;

WriteLn('Current directory - ', current^.name);

if current^.node_type = 'c' then

pnt:=current^.down;

i:=1;

{ Проходим каталог в дереве }

WriteLn(i:4,'-',pnt^.name);

pnt:=pnt^.next;

Inc(i);

until pnt = nil;

end;

end;

 

{ Навигация в дереве каталогов. Перемещение на один уровень вниз }

procedure MoveDown;

current:=current_root;

if current^.down <> nil then

current:=current^.down;

WriteLn('Id in list');

Read(l);

i:=1;

while (i < l) and (current^.next <> nil) do

current:=current^.next;

Inc(i);

end;

if (current^.node_type = 'c') and (current^.down <> nil)

then current_root:= current;

end;

end;

 

{ Навигация в дереве каталогов. Перемещение на один уровень вверх }

procedure MoveUp;

current:=current_root;

if current^.up <> nil then

current_root:=current^.up;

end;

 

{ Подсчет числа файлов и подкаталогов иерархической структуры каталога }

procedure Count;

var n_files, n_cats: Integer;

procedure count_in(local_root: Pointer);

var local_node, local_r_node: ^TNode;

local_r_node:=local_root;

if local_r_node^.down <> nil then

local_node:=local_r_node^.down;

if local_node^.node_type = 'f' then

Inc(n_files) else

Inc(n_cats);

count_in(local_node);

end;

local_node:=local_node^.next

until local_node = nil;

end;

end;

{ Собственно процедура }

n_files:=0; n_cats:=0;

count_in(current_root);

WriteLn('files : ',n_files, ' directories: ', n_cats);

end;

 

{ Расчет физического объема иерархической структуры каталога }

procedure CountMem;

var mem: LongInt;

procedure count_m_in(local_root: Pointer);

var local_node, local_r_node: ^TNode;

local_r_node:=local_root;

if local_r_node^.down <> nil then

local_node:=local_r_node^.down;

if local_node^.node_type = 'f' then

mem:=mem+local_node^.size else

count_m_in(local_node);

local_node:=local_node^.next;

until local_node = nil;

end;

end;

{ Собственно процедура }

mem:=0;

count_m_in(current_root);

WriteLn('mem ', mem, ' bytes');

end;

 

New(current);

{ Инициализация корня дерева каталогов и указателей для навигации }

current_root:=current;

WriteLn('Directory ?');

Read(str);

WriteLn(str);

current^.name:=str;

current^.last:=nil;

current^.next:=nil;

current^.up:=nil;

current^.down:=nil;

current^.node_type:='c';

{ Создание дерева каталогов }

CreateTree(current);

if current^.down = nil then

current^.node_type:=' ';

WriteLn('1-List');

WriteLn('2-Down');

WriteLn('3-Up');

WriteLn('4-Files');

WriteLn('5-Volume');

Readln(n);

if n = 1 then CurrentList;

if n = 2 then MoveDown;

if n = 3 then MoveUp;

if n = 4 then Count;

if n = 5 then CountMem;

until n = 0;

end.

Задания для самостоятельной работы

1. Работа некоторого устройства кодируется одним байтом. Самый старший разряд байта позволяет определить состояние устройства (1 – включено, 0 – выключено). Остальные разряды задают режим работы. Привести пример подпрограммы, устанавливающей заданный режим работы устройства, если оно включено. Подпрограмма должна быть функцией, возвращающей True при задании режима и False, если устройство выключено. Пример режима xx101x1 (x – прежнее значение разряда).

 

2. Работа 8 различных устройств кодируется одним байтом. Разряд байта с порядковым номером n позволяет определить состояние данного устройства (1 – включено, 0 – выключено). Привести пример подпрограммы, определяющей работу любого числа заданных устройств. Например, определить, включены ли устройства с порядковыми номерами 1,4,7.

 

3. Создать множество из чисел Фибоначчи: F(n)=F(n-1)+F(n-2), F(0)=0, F(1)=1. Множество должно содержать N первых чисел последовательности.

 

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

 

5. Привести пример подпрограммы, выполняющей транспонирование матрицы. Подпрограмма-процедура должна получать матрицу A (параметр-переменная) и ее размерность N.

 

6. Массив объявлен следующим образом:

 

var r: array [10..25] of Real;

 

Определить, сколько занимает в памяти массив, смещение к элементу с порядковым номером 5, адрес элемента с порядковым номером 10.

 

7. В массиве содержится 100 вещественных чисел. Выполнить их сортировку. Обосновать выбор алгоритма сортировки.

 

8. Массив объявлен следующим образом:

 

var w: array [10..15][5..10] of Word;

 

Определить, сколько занимает в памяти массив и смещение к элементу [12,8].

 

9. Массив объявлен следующим образом:

 

var w: array [1..100][1..50] of Word;

 

Привести пример подпрограммы удаления заданного столбца или строки.

 

10. Создать динамический массив, размерностью N вещественных чисел. Инициализировать его случайными числами в диапазоне [0..1]. Вычислить процент чисел (от общего объема), меньших числа, заданного пользователем. Вывести результат и удалить массив из памяти.

 

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

 

12. Информация о студенте включает: ФИО, порядковый номер, название факультета, номер специальности, дату рождения, адрес проживания, телефон. Создать список L класса TList и разработать процедуру добавления в него данных-записей о студентах.

 

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

 

14. В списке L класса TList находятся адреса N объектов. Удалить список L из памяти.

 

15. Использовать следующий прототип функции для выполнения арифметических операций:

 

TOperation = function(x,y,z: Integer): Real;

 

16. Привести пример реализации программного модуля с процедурами, демонстрирующими работу с кольцевой очередью. Работа очереди должна быть построена на структуре данных «вектор» и «связный список».

 

17. Разработать функцию поиска указанной строки в текстовом файле. При обнаружении первого вхождения строки функция должна возвращать True и координаты первого символа, False при отсутствии искомой строки.

 

18. Разработать функцию инвертирования заданной строки.

 

19. Разработать алгоритм доступа к массиву числовых данных используя механизм хеширования. Применить закрытый метод адресации для разрешения коллизий.

 

Литература

1. Ахо А., Холкрофт Д., Ульман Д. Структуры данных и алгоритмы. – Вильямс 2000.

2. Бен-Ари М. Языки программирования. Практический сравнительный анализ. – М.: Мир 2000.

3. Вирт Н. Алгоритмы и структуры данных. – Невский Диалект 2001.

4. Зубов В.С. Структуры и методы обработки данных. Практикум в среде Delphi – Филинъ 2004.

5. Кнут Д. Искусство программирования для ЭВМ. Тома 1-3. – Вильямс 2000.

6. Кубенский А. Создание и обработка структур данных в примерах на Java. – BHV-СПб 2003.

7. Роберт Седжвик. Фундаментальные алгоритмы на С. Части 1-5. – Диасофт 2003.

8. Таланов В.А., Алексеев В.Е. Графы и алгоритмы. Структуры данных. Модели вычислений. – Бином 2006.