Создание справочника Парфюмерный магазин при помощи программы Turbo Pascal

Содержание

	

			Введение

			Содержательная постановка и описание задачи

			Атрибуты объекта и предоставление данных в программ

			Описание программы создания набора данных

			Описание программы формирование выходного документа

			Описание программы формирование списковой структуры

			Технология обработки данных

			Заключение

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

		Приложение 1 - Графическое описание данных	

		Приложение 2 - Представление данных в памяти ЭВМ

		Приложение Рисунок списковой структуры

		Приложение 4 – Формат выходного документа	

		Приложение 5 – Схема последовательности обработки данных

		Приложение 6 Листинг программы

		

		

		Введение

	

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

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

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

		

		

				Содержательная постановка и описание задачи

			

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

			Программа должна обладать следующими функциями:

			Удобная справочная система и система подсказок;

			Возможность добавление в БД нового товара;

			Возможность поиска по выбранным критериям;

			Возможность удобной сортировки товаров;

			Возможность создания отчетности;

			Возможность удаления ненужного товара.

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

			Сортировки товаров в любой БД необходимо уделять особое внимание. Связано это в первую очередь с необходимостью оперативного доступа к требуемой информации из БД.

			

			

			Атрибуты объекта и предоставление данных в программе

		

			Определим необходимый набор атрибутов. Условно их можно разделить на 3 части:

			Сортировка – деление на разделы и подразделы;

			Интерфейс – создание удобного и функционального интерфейса;

			Функции программы – добавление и удаления товара, поиск и отчетность.

		

		3.1 Сортировка.

		

			Наиболее сложной задачей при создании программы – справочника «Парфюмерный магазин» является создание сортировки товаров. 

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

			Условно все товары парфюмерного (косметического) магазина, можно разделить на 9 разделов:

			Уход за лицом;

			Уход за кожей;

			Детские товары;

			Маникюр;

			Парфюмерия;

			Уход за телом;

			Товары для мужчин;

			Уход за волосами;

			Другие товары.

			

			3.1.1 Уход за лицом;

			В данном разделе представляются товары, предназначенные непосредственно для ухода за лицом. Условно данный раздел можно разделить на 13 подразделов:

			Гель;

			Лосьоны и пена;

			Молочко;

			Бальзам;

			Крем;

			Масло;

			Маска, скраб;

			Подводка, карандаш;

			Румяна, тушь

			Тени пудра;

			Помада, маска;

			Блеск;

			Другие товары.

			

			3.1.2 Уход за кожей;

			В данном разделе представляются товары, предназначенные непосредственно для ухода за кожей. Условно данный раздел можно разделить на 8 подразделов:

			Гель;

			Лосьоны и пена;

			Молочко;

			Бальзам;

			Крем;

			Масло;

			Другие товары.

			

			3.1.3 Детские товары;

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

			Ароматы;

			Крема и мази;

			Другие товары.

			

			3.1.4 Маникюр;

			В данном разделе представляются товары, предназначенные непосредственно для ухода за ногтями. Условно данный раздел можно разделить на 4 подраздела:

			Крем;

			Лак;

			Масло;

			Другие товары.

			

			3.1.5 Парфюмерия;

			В данном разделе представляются парфюмерные товары: 

			Туалетная вода;

			Духи;

			Дезодорант;

			Одеколон;

			Другие товары.

			

			3.1.6 Уход за телом;

			В данном разделе представляются товары, предназначенные непосредственно для ухода за телом. Условно данный раздел можно разделить на 8 подразделов:

			Гель;

			Лосьоны и пена;

			Молочко;

			Мыло;

			Бальзам;

			Крем;

			Масло;

			Другие товары

			

			3.1.7 Товары для мужчин;

			В данном разделе представляются товары, предназначенные непосредственно для мужчин. Условно данный раздел можно разделить на 8 подразделов:

			Дезодорант;

			Одеколон;

			Гель;

			Лосьоны и пена;

			Шампунь;

			Бальзам;

			Крем;

			Другие товары.

			

			3.1.8 Уход за волосами;

			В данном разделе представляются товары, предназначенные непосредственно для ухода за волосами. Условно данный раздел можно разделить на 9 подразделов:

			Гель;

			Мыло;

			Шампунь;

			Кондиционер;

			Бальзам;

			Спрей;

			Лак;

			Блеск;

			Другие товары.

			

			3.1.9 Другие товары.

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

			Бижутерия;

			Технические средства;

			Другие товары.

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

			В итоге сортировка предусматривает деление на разделы и подразделы. Каждый товар должен находиться только в одном определенном разделе и соответственно подразделе. Когда пользователю появится необходимость найти нужный ему товар не обязательно прибегать к поиску, т.к. условия поиска не всегда удобно записать, достаточно определится к какому разделу, относится товар, который необходимо найти. Очень важную роль при этом необходимо отвести к заполнению БД. Товары должны быть грамотно занесены в БД и тогда проблем при поиске нужного товара, недолжно возникать.

		

		

		3.2 Интерфейс

		

		При создании вышеуказанной сортировки необходимо создать интерфейс пользователя, обладающий следующими свойствами:

		Удобство;

		Простота;

		Интуитивно понятная навигация;

		Отсутствие «захламленности».

			Поставленную задачу можно решить следующим образом:

		Создание разметки экрана – линии, которые должны разделять экран, для его целесообразного размещения;

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

		Создание меню разделов и подразделов, при чем так чтоб пользователь при помощи курсора мог осуществить навигацию по разделам и подразделам, а не нажимать цифры меню;

		Создание справочной системы и системы подсказок;

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

		

		3.3 Функции программы

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

			Добавление нового товара в БД;

			Поиск нужного товара по заданным критериям;

			Создание отчетности по заданным критериям;

			Удаление ненужного товара;

		

		

		3.4 Поля объекта

		

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

		Как показало изучение предметной области, критерии товаров должны быть следующими:

		Код товара – целое число, которое должно быть уникальное для каждого товара, т.е. не повторятся;

		Раздел – целое число, которое свидетельствует о принадлежности к определенному разделу, каждое из которых имеет свой уникальный номер;

		Подраздел - целое число, которое свидетельствует о принадлежности к определенному подразделу, каждое из которых имеет свой уникальный номер;

		Название – строковое данное, характеризует общее название товара;

		Серия – это строковое данное, характеризует принадлежность товара к определенной серии;

		Производитель - строковое данное, описывает название производителя;

		Описание - строковое данное, которое описывает товар более подробно;

		Цена товара – это строковое данное указывает цену товара. Цена товара будет именно строковым данным, сделано это для того, чтоб не указывать валюту (рубли, У.Е., евро, доллар США и т.д.) и деление на рубли и копейки.

		

		

			Описание программы создания набора данных

		

		В данной программе записью будет являться товар, а полями записи будет информация о товаре. Поля товаров описаны в п. 3.4.

		

		4.1 Программная организация записи

		

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

		Baza:record

			FKod:integer;

			FRazdel;

			FPodRazdel;

			FName:string;

			FSeria:string;

			FProizvod:string;

			FOpisan:string;

			FMany:string;

			FSim:string; - символ разделитель в БД

		End;

		

		4.2 Файлы данных

		

		Файлов данных работающих с программой можно разделить на основные и вспомогательные.

		К основным относятся:

		bd.dat;

		Razdel.dat.

		

		К вспомогательным относятся:

		Kod.dat;

		help.dat;

		BDVR.DAT.

		

		4.2.1 bd.dat – это основной файл БД. В данном файле хранится информация о товарах. Каждая позиция товаров хранится в отдельной строке, и товары разделены символом «*». 

		Пример хранение информации о товаре:

		1 – код товара;

		1 – раздел «Уход за лицом»;

		1 – подраздел «Гель»;

		Гель для лица – название товара;

		Власть над временем – Серия товара;

		Oriflame – производитель;

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

		200.25 – цена товара;

		* - символ разделитель.

		

		4.2.2 Razdel.dat – это файл, хранящий разделы и подразделы. В первой строке стоит код раздела и подраздела, а за ней стоит название раздела и подраздела и т.д.

		Пример:

		7

		Дезодорант

		Это запись означает, что в седьмом разделе есть подраздел «Дезодорант»

		

		4.2.3 Kod.dat – это файл, хранящий коды товара. При создании нового товара программа считывает последний код, увеличивает на единицу и сохраняет в файле. Таким образом, код каждого товара уникален. 

		4.2.4 help.dat – файл справки.

		

		4.2.5 BDVR.DAT – это файл временной БД. Этот файл необходим при удалении товара, когда товары переносятся во временный файл. За исключением удаленного товара, а затем основной файл БД перезаписывается.

		

		

			Описание программы формирование выходного документа

		

		К выходным документам относятся:

		Вывод информации на экран; 

		Вывод информации в файл.

		

		5.1 Вывод информации на экран

		

		Пример формирования выходного документа на экран см. в приложении 4 рис. 2

		Экран в данной программе состоит из пяти частей:

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

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

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

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

			Помощь F1; 

				Новый F2; 

				Поиск F3; 

				Отчет F4; 

				Удалить F5; 

				Назад PageUp; 

				Далее PageDown; 

				Выход F10.

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

		

		5.2 Вывод информации в файл

		

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

		По текущему товару;

		По текущему подразделу.

		Данная опция доступна только при условии, что пользователь находится в режиме работы с товарами. Т.е. пользователь выбрал требуемый подраздел и нажал ввод. 

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

		Пример формирования выходного документа в файл см. в приложении 4 рис. 7.

		

		

		6 Описание программы формирование списковой структуры

		

		6.1 Область применения списковой структуры

		

		Списковая структура применяется для передвижения по товарам внутри подраздела. Когда пользователь входит в подраздел формируется запрос, результатом которого будут товары, найденные в БД, каждый из которых, будет соответствовать выбранным пользователем раздела и подраздела. Причиной необходимости использования динамической структуры явилось то, что при программировании не известно какое количество товаров будет в выбранном разделе и подразделе. По этому, когда находится очередной товар, удовлетворяющий выбранному пользователем разделом и подразделом, код этого товара просто добавляется в список. А на экран выводится  товар, код которого последний в списке.

		

		6.2 Принцип работы

		

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

		Когда пользователь выбирает нужный ему подраздел, программа ищет в файле БД первый товар, если таковой вообще существует, который удовлетворяет выбранному пользователем разделу и подразделу и код этого товара добавляется в динамический список – стек. 

		Далее программа выводит на экран информацию о товаре, код которого находится в вершине стека.

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

		Если нажата клавиша  PageUp, то код товара, который является вершиной стека, просто удаляется и вершиной стека становится, уже предыдущий код товара, если, конечно же, это был не первый товар. А далее, как и в случае с PageDown выводится товар, код которого находится в вершине стека.

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

		

		6.3 Процедуры, используемые при работе со списком.

		

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

		При работе со списком используются следующие функции:

		Чтение элемента из списка;

		Добавление элемента в список;

		Поиск элемента в списке;

		Удаление элемент из списка.

		

		6.3.1 Описание списка

		Type

			Integ=^integer;

			Int:integer; {код товара}

			Next:integ; {ссылка на следующий элемент}

		end;

		

		6.3.2 Чтение элемента из списка

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

		

		6.3.3 Добавление элемента в список

		Добавление кода товара в список происходит в процедуре AddSpisok, алгоритм которой заключается в следующем (Приложение 5, схема 12):

		Создается новый элемент;

		Записывается код товара из файла в список;

		Устанавливается указатель для поддержания целостности списка;

		

		6.3.4 Поиск элемента в списке

		Поиск осуществляется в процедуре PoiskFPR. Алгоритм поиска заключается в следующем:

		Переход на последний элемент списка – вершину стека;

		До тех пор пока не конец стека делать;

		Если текущий код товара из файла БД равен коду товара из списка, то условие выполнено, если нет, то считывается следующий элемент из списка и т.д.

		

		6.3.5 Удаление элемента из списка.

		Удаления кода товара из списка происходит в процедуре DelSpisok, в данной процедуре удаляется только последний элемент, который являлся вершиной стека, алгоритм данной процедуры  заключается в следующем:

		Переход на последний элемент списка – вершина стека;

		Создание связи, со следующим элементом;

		Удаление элемента;

		Присваивание нового последнего элемента.

		

		7 Технология обработки данных

		

			Последовательность операций с данными заключается в следующем (приложение 5 схема 1):

		Создания разметки экрана (Приложение 4, рисунок 1);

		Создания и управление разделами и подразделами;

		Выбор режима работы;

		Вывод на экран товаров соответствующих разделу и подразделу;

		Операции над товарами;

		

		7.1 Разметка экрана.

		

		Разметка экрана реализуется при помощи процедуры Shapka. В данной процедуре реализуется следующее (приложение 5, схема 2):

		Создаются линии, которые разделяют экран;

		Создаются копки управления – кнопки управления с доступными функциями. Если на определенном этапе работы кнопка имеет серый цвет, то данная функция недоступна;

		Создается заголовок – раздел экрана, в котором выводится название раздела, в котором пользователь работает в настоящий момент;

		Создаются окно подсказки – в данном окне выводятся подсказки для пользователя, необходимые для работы в определенный момент.

		

		7.2 Управление разделами и подразделами.

		

		Управление разделами и подразделами реализовано в процедуре Perem, следующим образом:

		Вывод на экран разделов или подразделов;

		Перемещение внутри раздела или подраздела;

		Выбор режима работы.

		7.2.1 Вывод на экран разделов или подразделов.

		Данный раздел осуществляется при помощи процедуры PodRazdel. Реализация в данной процедуре происходит следующим образом (приложение 5, схема 3):

		Открытие файла razdel.dat для чтения. В данном файле содержится название всех разделов и подразделов и специальные коды для распознавания (структуру файла см. п. 4.2.2).  Например, если стоит код 0, то данная позиция относится к разделу, и будет выводиться только, в случае отображение разделов. Если стоит единица, то это означает, что данный подраздел соответствует первому разделу и т.д.

		Программа, считывает доступные разделы и подразделы из файла, который находится в корневой папке с программой и добавляет их в массив PodRaz. Если программа только запущенна, то выводятся разделы из файла имеющие код 0, если, к примеру, выбран раздел «детские товары», то из файла разделов считываются подразделы, которым соответствует код 3.

		Закрытие файла.

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

		

		7.2.2 Перемещение внутри раздела или подраздела.

		Операции по перемещению заключаются в следующем (приложение 5, схема 4):

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

		Пользователю предлагается ввести при помощи курсора направления перемещения. 

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

		При работе с разделами и подразделами  у пользователя есть еще три допустимых операций: помощь, поиск и вход (см. п. 7.3).

		

		7.3 Выбор режима работы.

		

		Во время перемещения по позициям меню пользователю доступны три операции (Приложение 5, схема 5): 

		Помощь;

		Поиск;

		Вход.

		

		7.3.1 Помощь. 

		Вход в режим справки осуществляется по нажатию клавиши F1 (Приложение 4, рисунок 3).

		Данная операция реализована в процедуре Help, следующим образом (приложение 5, схема 8):

		Открывается файл help.dat для чтения. Данный файл содержит справочную информацию о работе с программой.

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

		По завершению работы с файлом справки, он закрывается и на экран выводится разметка,  разделы или подразделы, для дальнейшего выбора пользователем.

		

			Поиск.

		В ход в режим поиска осуществляется по нажатию клавиши F3 (Приложение 4, рисунок 5).

		Данная операция реализована в процедуре Poisk, следующим образом (приложение 5, схема 7):

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

		Далее пользователю предлагается ввести текст для поиска.

		После ввода текста поиска, программа открывает файл BD.dat для чтения.

		Далее происходит считывание каждой позиции из БД и сравнение с введенным текстом.

		Если очередная позиция товара соответствует условию поиска, то алгоритм приостанавливается и данный товар выводится на экран при помощи процедуры Tablo (см. п. 7.4.4), и поиск дальнейших товаров продолжается лишь, после того как будет нажата клавиша Page Down (Далее);

		После завершения поиска файл БД закрывается и на экран выводится сообщение, что больше совпадений не найдено.

		Далее на экран выводится разметка и элементы меню для дальнейшей работы.

			

			7.3.3 Вход.

		Вход в данный режим осуществляется, после того как пользователь перешел на нужный раздел и подраздел и нажал клавишу Enter. 

		Обработка действий при нажатии клавиши Enter, осуществляется в процедуре Vhod. Алгоритм данной процедуры заключается в следующем (приложение 5, схема 6):

		Проверяется, если открыт подраздел, а не раздел, то выводится на экран товары данного подраздела. Данный пункт осуществляется при помощи процедуры Vivod (см. п. 7.4);

		Если открыт, радел, то программа считывает, какой раздел был выбран и в зависимости от выбора раздела программа определяет подразделы, которые соответствуют выбранному пользователем разделу. Реализуется данная операция при помощи процедуры Podrazdel (п. 7.2.1);

		Если открыт режим подразделов и нажата клавиша Backspace, то на экран выводятся разделы.

		

		7.4 Вывод на экран товаров соответствующих разделу и подразделу.

		

		Вывод товаров на экран осуществляется, после того как пользователь нажмет клавишу Enter на нужном подразделе (Приложение 4, рисунок 2). Данная операция реализована в процедуре Viviod, алгоритм которой заключается в следующем (приложение 5, схема 9):

		Считывается количество товаров в данном подразделе. Данная операция осуществляется в процедуре Schet (см. п. 7.4.1);

		Считывается первый товар из подраздела и код первого товара добавляется в список (см. в п. 6.3.3). Данная операция реализована в процедуре PR (см. п. 7.4.2);

		Вывод на экран товара соответствующего последнему, коду товара из списка, реализуется данная операция в процедуре WriteSpisok (см. в п. 7.4.4). Таким образом, на экране выводится первый товар из БД, соответствующий разделу и подразделу.

		Далее пользователю предлагается выбрать дальнейшие действия, которые можно разделить на передвижение и операции. Об операциях над товарами более подробно будет описано в п. 7.5, а передвижение, в случае, если товаров более одного, осуществляется при помощи клавиш Page Up (назад), Page Down (вперед);

		Если нажата клавиша Page Down, то программа ищет в БД следующий товар, который соответствует, разделу и подразделу (если они вообще существуют), но с условием, что ранее показанные товары отображаться не будут, т.е. те товары, коды которых находятся в списке. Данная операция реализована в процедуре PoiskFPR (см. п. 7.4.3, поиск в списке см. п. 6.3.4);

		После того как найден очередной товар, соответствующий разделу и подразделу и он ранее не был отображен, то код этого товара добавляется в список. Реализовано данная операция в процедуре AddSpisok (см. в п. 6.3.3);

		Далее на экран выводится товар с кодом товара, записанным последним в список. Реализована данная операция при помощи процедуры WriteSpisok (см. п. 7.4.4); 

		Если нажата клавиша PageUp, то проверяется, не первый ли это товар, в данном разделе и подразделе.  Если нет, то удаляется последний элемент из списка  (процедура DelSpisok, см. в п. 6.3.5) и выводится товар, с кодом товара, который теперь уже стал первым (процедура WriteSpisok, см. п. 7.4.4);

		По мимо передвижения доступны и другие функции, которые будут описаны в п. 7.5.

		

		7.4.1 Процедура Schet.

		Данная процедура выводит общее количество товаров в выбранном пользователем разделе и подразделе. Реализована данная процедура следующим образом (приложение 5, схема 10):

		Обнуляется счетчик;

		Открываем файл БД для чтения;

		Считывается очередной товар;

		Если раздел и подраздел очередного товара, соответствуют выбранному пользователем разделу и подразделу, то счетчик увеличивается на единицу;

		Закрываем файл БД

		

		7.4.2 Процедура PR.

		Данная процедура добавляет код первого товара в список. Реализовывается данная процедура следующим образом (приложение 5, схема 11):

		Открывается файл для чтения;

		Считывается очередной товар;

		Если раздел и подраздел очередного товара, соответствуют выбранному пользователем разделу и подразделу, то добавляем код товара в список, используя процедуру AddSpisok (см. в п. 6.3.3). 

		

		7.4.3 Процедура PoiskFPR.

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

		Открывается файл БД;

		Считывается очередной товар;

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

		Если код текущего товара из БД отсутствует в списке, то процедура прерывается. И затем код этого товара добавляется в список (процедура AddSpisok п. 6.3.3).

		

		7.4.4 Процедура WriteSpisok.

		Данная процедура выводит товар на экран. Реализована она следующим образом (приложение 5, схема 9):

		Выводит в верхнюю часть экрана общее количество товаров в подразделе;

		Открывается файл БД для чтения;

		Считывается последний код товара из списка;

		Поиск в БД и вывод на экран, товара с кодом из списка.  Вывод на экран осуществляется при помощи процедуры Tablo. В данной процедуре отсутствуют, какие либо циклы или условия, там лишь вывод в необходимую координату экрана текста из БД, по этому останавливаться на данной процедуре нет смысла.

		Закрытие файла БД.

		

		7.5 Операции над товарами.

		

		При работе с товарами доступны следующие операции:

		Новый товар в текущий раздел и подраздел;

		Отчет;

		Удалить товар.

		

		7.5.1 Новый товар в текущий раздел и подраздел.

		Данная операция вносит информацию о новом товаре в текущий раздел и подраздел (Приложение 4, рисунок 4). Реализована данная операция при помощи процедуры NewTovar, алгоритм которой заключается в следующем (приложение 5, схема 4):

		На экране появляется форма для заполнения информации о товаре;

		После ввода информации у пользователя спрашивают, сохранить или нет.

		Если нажата, кнопка сохранить, то открывается файл для чтения kod.dat. 

		Из выше указанного файла считывается последний внесенный код товара.

		Файл kod.dat, находящийся в режиме чтения, закрывается;

		Файл kod.dat открывается в режиме добавления;

		Последний считанный код товара увеличивается на единицу и последний сохраняется в файл;

		Файл kod.dat закрывается;

		Открывается файл БД в режиме добавления и в конец файла добавляется новый товар;

		Закрывается файл БД;

		На экран выводится разметка и подразделы.

		

		7.5.2 Отчет.

		Описание создание отчетов описано в п. 5.2. Реализована  функция создания отчетов в процедуре PrintF, алгоритм которой заключается в следующем (приложение 5, схема 16):

		Выбор критерий отчета: по текущему товару или по текущему подразделу (Приложение 4, рисунок 6);

		Пользователю предлагается ввести имя файла, в который будет сохранен отчет (Файл будет сохранен в корневой каталог с программой, и будет иметь расширение txt);

		Создание файла с вышеуказанным именем и расширением;

		Если выбрана по текущему подразделу, то все товары того подраздела, в котором пользователь находится в настоящий момент, будут сохранены в файл отчета, если текущий товар, то в файл отчета будет сохранен только товар, открытый в настоящий момент;

		По окончании выводится последний, просматриваемый товар.

		

		7.5.3 Удалить товар.

		Реализована  функция удаления товара в процедуре Del, алгоритм которой заключается в следующем (приложение 5, схема 15):

		У пользователя уточняется, действительно ли он хочет удалить товар;

		Если да то открывается файл БД для чтения и открывается временный файл в режиме перезаписи;

		Каждый элемент из БД копируется во временный файл, за исключением того которого, хотят удалить, т.е. того код, которого находится в вершине списка;

		Закрываются оба файла;

		Открытие файла БД в режиме перезаписи и временного файла в режиме чтения;

		Вся информация из временного файла, целиком копируется в файл БД;

		Файлы закрываются;

		Выводится сообщение, что запись удалена;

		Обновление информации на экране.

		

		

		Заключение

		

		Подведем итог того, что все-таки удалось в данном курсовом проекте:

		Удалось создать неплохую сортировку, что облегчает работу с товарами, на мой взгляд, эта основа любой БД;

		Удалось создать достаточно простой и интуитивно понятный интерфейс, без каких либо излишеств;

		В программе реализованы основные функции работы с БД – удаление, добавление, отчетность, поиск;

		Показано когда, какая функция доступна;

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

		Существует справочная система и система подсказок. Хотя над справкой можно было еще поработать;

		Достаточно простое управление товарами;

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

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

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

		

		

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

			

				9.1 Учебное пособие. «Структуры и алгоритмы обработки данных в ЭВМ», А. Н. Горитов, г. Томск

				9.2 Самоучитель. «Программирование в Turbo Pascal», Н. Культин.

		9.3 Открытие Интернет источники.

		

		

			Приложение 1 - Графическое описание данных

			

			

									  Разделы

			

			

			

			

			

			

			

			

			

			

			

						

			

			

			

			

			Подразделы у каждого раздела
   

			

					 Товара у каждого подраздела

			

			

			

			Схема 1 – Общая схема описания хранения данных

			

			

			Каждый раздел имеет иерархическою структуру представленную на схеме 2

			

			

			

Раздел	

			

			

			

			

Подаздел

Подаздел

Подаздел

Подаздел

Подаздел

			

			

			

Товар

Товар

Товар

Товар

Товар

Товар

Товар

Товар

Товар

Товар

			

			

			

			

			

			

			Схема 2 – структура раздела

			

			

			Приложение 2 - Представление данных в памяти ЭВМ

			

			nomer:integer; - 2 байта;

			i:integer; - 2 байта;

			ch:char; - 1 байт;

			Rozd:string; - 2 байта;

			nabor:integer; - 2 байта;

			men:array[1..16] of integer; - 2х16 - 32 байта;

			strok:integer; - 2 байта;

			lom:integer; - 2 байта;

			vof:boolean; - 1 байт;

			Razdel:integer; - 2 байта;

			PodRazd:integer; - 2 байта;

			MRazdel:integer; - 2 байта;

			ScetRP:integer; - 2 байта;

			hod:integer; - 2 байта;

			kolvo:integer; - 2 байта;

			Text1:string[19]; - 2 байта;

			Text2:string[19]; - 2 байта;

			Text3:string[19]; - 2 байта;

			Text4:string[19]; - 2 байта;

			f1:integer; - 2 байта;

			f2:integer; - 2 байта;

			f3:integer; - 2 байта;

			f4:integer; - 2 байта;

			f8:integer; - 2 байта;

			pd:integer; - 2 байта;

			pu:integer; - 2 байта;

			f10:integer; - 2 байта;

			Prin:boolean; - 1 байт;

			Fsim:string; - 2 байта;

			FKod:integer; - 2 байта;

			FRazdel:integer; - 2 байта;

			FPodRazdel:integer; - 2 байта;

			FName:String; - 2 байта;

			FSeria:string; - 2 байта;

			FProizvod:string; - 2 байта;

			FOpisan:string; - 2 байта;

			FMany:string; - 2 байта;

			MainName:string; - 2 байта;

			PodRaz:array[1..16] of string; - 2 х 16 – 32 байта; 

			z:integer; - 2 байта;

			d:string; - 2 байта;

			opis1:string; - 2 байта;

			opis2:string; - 2 байта;

			opis3:string; - 2 байта;

			Good,Nal:boolean; - 1 байт;

			zed:integer; - 2 байта;

			fname1:string; - 2 байта;

			fname2:string; - 2 байта;

			fname3:string; - 2 байта;

			kod:integer; - 2 байта;

			hod:integer; - 2 байта;

			punkt:integer; - 2 байта;

			NSP:string; - 2 байта;

			fol:integer; - 2 байта;

			k:string; - 2 байта;

			n:integer; - 2 байта;

			

			В итоге 168 байт.

			

			

			Приложение 3 - Рисунок списковой структуры

			

			

			Рисунок – 1 -  схема списковой структуры - стек

			

			

			Приложение 4 – Формат выходного документа.

			

			

			

			Рисунок 1 – Разметка экрана

			

			

			

			Рисунок 2 – Просмотр товаров

			

			

			

			

			Рисунок 3 – Помощь

			

			

			Рисунок 4 – Добавление товара

			

			

			Рисунок 5 – Критерии поиска

			

			

			

			Рисунок 6 – Отчет

			

			

			

			Рисунок 7 – Выходной документ в файл

			

			Приложение 5 – Схема последовательности обработки данных.

			

			

Начало

			

			

			

			

Вывод на экран разметки, схема 100

			

			

			

			

			

Вывод на экран разделов и подразделов схема 100

			

			

			

			

			

Выбор режима работы, схема 1000

			

			

			

			

			

			

Операции над товарами, схема 1000

			

			

			

			

Конец

			

			

			

			

			Схема 1 – Общая схема

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

Начало

			

			

			

Вывод линий разметки

			

			

			

			

Вывод кнопок управления

			

			

			

			

Вывод заголовка

			

			

			

			

Вывод подсказок

			

			

			

Конец

			

			

			

			Схема 2 – Разметка экрана

			

			

Начало

			

			

			

Открытие файла для чтения

			

			

			

Считывание доступных разделов и подразделов

			

			

			

Закрытие файла

			

			

			

Операции над товарами

			

			

			

			

Вывод элементов меню

			

			

			

Конец

			

			

			

			Схема 3 – вывод разделов и подразделов

			

Начало

			

			

			

Вывод разделов и подразделов схема 10000

			

			

			

			

Сохранение текущей строки

			

			

			

			

Выбор направления

			

			

							Вверх

			

			

			

						                   Вниз

			

			

Окраска пунктов соответствуя нажатию клавиши вниз

			

Окраска пунктов соответствуя нажатию клавиши вниз

			

			

			

			

			

			

			

Конец

			

			

			

			Схема 4 – Перемещение по меню

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

Начало

			

			

			

Выбор режима работы

			

							Enter	F1

			

			

			

			

			     F3

			

			

События по нажатию Enter схема 10000



Помощь схема 10000



Поиск схема 10000

			

			

			

			

			

			

Конец

			

			

			Схема 5 – Выбор режима работы

			

			

Начало

			

			

			

Открытый ли раздел

			

			     нет

			

			

							Да	

			

			

Вывод на экран товаров схема 100

Вывод подразделов

			

			

			

			

Выбор операции

			

			

			

			Вход

			

							Вниз	

			

			

Конец

			

			

			Схема 6 - События по нажатию Enter

			

Начало

			

			

Выбор критерий поиска

			

								1		3

			

								

								2

			

Ввод условия поиска

						

			

			

			

Поиск в БД

			

			

Есть совпад.

						нет

			

			

						Да

			

			

Вывод на экран товаров схема 100

						

			

			

Искать далее

						Да

						

			

							нет

			

			

Конец

			

			

						Схема 7 - Поиск

			

			

Начало

			

			

Вывод части файла справки на экран

			

			

			

			

Далее

			

						Да

			

			

						Нет

			

Конец

			

			Схема 8 - Помощь

			

			

Начало

			

			

Вывод общего кол-ва товаров схема 1000

			

			

			

			

Считать первый товар схема 1000

			

			

			

Добавить код товара в список схема 1000

			

			

			

Считать последний товар из списка схема 1000

			

			

			

			

			

Вывод на экран информации о товаре, схема 1000

			

			

			

					

 Поиск следующего товара, схема 1000			

					

								Операции 

				

Выбор операции			  с товарами

			

 Добавить товар схема, 100

Удалить товар схема 100

Отчет по товарам, схема 10



			

						

						     Передвижение

			

			

			

 Удаление товара, схема 1000



Направление

			

							

					

							PageDown	PageUp

			

			

						ESC

			

			

Конец

			

			

			

			

			Схема 9 – Вывод товара на экран

			

			

			

Начало

			

			

			

			

Открывается файл БД для чтения

			

			

			

Поиск товара соответствующих разделу и подразделу

			

			

			

			

Подсчет количества товаров в подразделе

			

			

			

			

Конец

			

			

			

			Схема 10 – Вывод общего количества товаров

			

			

Начало

			

			

			

Поиск товара соответствующих разделу и подразделу

Открывается файл БД для чтения

Открывается файл БД для чтения

			

			

			

Поиск товара соответствующих разделу и подразделу

			

			

			

			

			

Добавление кода товара в список

			

			

			

Вывод на экран информации о товаре, схема 1000

			

						

			

			

			

Конец

			

			

			Схема 11 – Найти первый товар

			

			

			

			

			

			

Начало

			

			

			

Выделения памяти для нового элемента

			

			

			

Занесение кода товара в список

			

			

			

Установка указателя для поддержки целостности списка

			

			

			

			

Конец

			

			

			Схема 12 – Добавить код товара в список

			

			

Начало

			

			

Открывается файл БД для чтения

			

			

			

Поиск товара соответствующих разделу и подразделу

			

			

			

			

Является ли код найденного товара в списке

			

			

			

			

			

						Да

						 

			

			       нет

			

			

Добавляется код товара в список, схема 100

			

			

			

			

Вывод на экран информации о товаре, схема 1000

			

			

			

			

Конец

			

			Схема 13 – Поиск следующего товара

			

Начало

			

			

			

Вывод на экран формы для заполнения информации о товаре

			

			

			

			

			

			

Ввод информации о товаре

			

			

			

			

			

Считывается последний сохраненный код товара

			

			

			

			

			

Увеличивается на 1 и добавляется в файл кодов товара

			

			

			

			

			

Сохранить товар

			

						Нет

			

			

						Да

			

			

			

Открытие БД в режиме добавления

			

			

			

Ввод в БД информации о товаре

			

			

			

			

Конец

			

			

			

			Схема 14 – Добавление нового товара

			

			

			

			

			

			

			

Начало

			

			

Удалить товар

			

						Нет

			

			

						Да

			

			

			

Открыть БД в режиме чтение и открытие временной БД в режиме перезаписи

			

			

			

			

			

Скопировать все элементы БД во временную БД, кроме удаленного

			

			

			

			

			

Закрыть оба файла

			

			

			

Открыть БД в режиме перезаписи и открытие временной БД в режиме чтения

			

			

			

			

			

Скопировать все элементы из временной БД в постоянную БД

			

			

			

			

			

Закрыть оба файла

			

			

			

			

Обновить информацию на экране

			

			

			

			

Конец

			

			

			Схема 15 – Удаление товара

			

			

			

			

Начало

			

			

			

Выбор критерий отчета

			

						По товару						По подразделу

			

			

			

			

			

			

			

Ввод имени файла

			

			

			

			

			

Создание файла отчета

			

			

			

Ввод данных по товарам в файл

			

			

			

			

			

			

Конец

			

			

			

			Схема 16 – Отчет по товарам

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			Приложение 6 Листинг программы

			

			program parfum;

			uses crt;

			  type       {Список в котором содержатся код товаров}

			  integ=^int;

			  int=record

			      nomer:integer; {Код товара}

			      next:integ;    {Ссылка на следующий элемент}

			    end;

			

			var Nach:integ; {Начало списка}

			    tek:integ; {Текущий элемент списка}

			    d:integ;   {Переменная для работы со списком}

			    i:integer; {Счетчик}

			    ch:char; {Ввод с клавиатуры}

			    Rozd:string; {Выбранный раздел}

			    nabor:integer; {Счетчик числа элементов меню}

			    men:array[1..16] of integer;{Массив вывода элементы Главного меню}

			    strok, stolb:integer;{Пункты меню}

			    lom:integer; {Переменная для работы с Главным меню}

			    vof:boolean; {Переменная указывает что массив цветов уже заполнен}

			    Razdel:integer;{Переменная которая указывает открытую главу}

			    PodRazd:integer; {Переменная которая указывает открыт подраздел}

			    MRazdel:integer; {Переменная которая указывает открыт раздел}

			    stek:text;{Файл в который добавляется код товара}

			    {KodStek:integer;}

			    ScetRP:integer; {Счетчик позиций в указанном разделе и подразделе}

			    hod:integer; {Ходы вверх вниз в списке}

			    kolvo:integer; {Количество элементов в списке}

			    Text1,Text2,Text3,Text4:string[19]; {Комментарии}

			    f:text; {Файловая переменная}

			    f1,f2,f3,f4,f8,pd,pu,f10:integer; {Цвета пунктов внизу экрана}

			    Prin:boolean;{логическая переменная для печать текущей позиции}

			

			

			 Baza:record                 {Переменные для работы с файлами}

			       Fsim:string;          {Символ-разделитель}

			       FKod:integer;         {Код товара}

			       FRazdel:integer;      {Раздел}

			       FPodRazdel:integer;   {Подраздел}

			       FName:String;         {Название}

			       FSeria:string;        {Серия}

			       FProizvod:string;     {Производитель}

			       FOpisan:string;       {Описание товара}

			       FMany:string;         {Цена}

			 end;

			

			procedure shapka;  {Выводит разметку на экран, а именно горизонтальные и

			                   вертикальные линии и кнопки управления внизу экрана,

			                   а так же заголовок раздела и подраздела}

			var MainName:string; {Название подраздела}

			begin

			GoToXY(30,1); Textcolor(14);

			GoToXY(1,2);  Textcolor(11); For i:=1 to 80 do write('-');

			   for i:=3 to 21 do

			   begin

			       GoToXY(20,i);  Textcolor(11); writeln('|');

			   end;

			   GoToXY(1,22); For i:=1 to 80 do write('-');

			   GoToXY(1,23); Textcolor(F1); writeln('Помощь F1|');

			   GoToXY(11,23); Textcolor(F2); writeln('Новый F2|');

			   GoToXY(20,23); Textcolor(f3); writeln('Поиск F3|');

			   GoToXY(29,23); Textcolor(f4); writeln('Отчет F4|');

			   GoToXY(38,23); Textcolor(f8); writeln('Удалить F8|');

			   GoToXY(49,23); Textcolor(pu); writeln('Назад PUp|');

			   GoToXY(59,23); Textcolor(pd); writeln('Далее PDown|');

			   GoToXY(71,23); Textcolor(f10); writeln('Выход F10');

			   GoToXY(1,24); For i:=1 to 80 do write('-');

			   GoToXY(1,17);  Textcolor(11); writeln('-------------------');

			   if rozd='0'Then MainName:='ПАРФЮМЕРНЫЙ МАГАЗИН';

			   if rozd='1'Then MainName:='УХОД ЗА ЛИЦОМ';

			   if rozd='2'Then MainName:='УХОД ЗА КОЖЕЙ';

			   if rozd='3'Then MainName:='ДЕТСКИЕ ТОВАРЫ';

			   if rozd='4'Then MainName:='МАНИКЮР';

			   if rozd='5'Then MainName:='ПАРФЮМЕРИЯ';

			   if rozd='6'Then MainName:='УХОД ЗА ТЕЛОМ';

			   if rozd='7'Then MainName:='ТОВАРЫ ДЛЯ МУЖЧИН';

			   if rozd='8'Then MainName:='УХОД ЗА ВОЛОСАМИ';

			   if rozd='9'Then MainName:='ДРУГИЕ ТОВАРЫ';

			   GoToXY(30,1);  Textcolor(13);writeln(MainName);

			   GoToXY(1,18);   Textcolor(12); writeln(Text1);

			   GoToXY(1,19);  Textcolor(12); writeln(Text2);

			   GoToXY(1,20);  Textcolor(12); writeln(Text3);

			   GoToXY(1,21);  Textcolor(12); writeln(Text4);

			end;

			

			procedure podRazdel;  {Считывает из файла разделы и подразделы в

			                      зависимости от выбранного и выводит на экран}

			var PodRaz:array[1..16] of string;{Массив разделов и под разделов}

			    z:integer; {Строка с которой начинается вывод пунктов меню}

			    f:text;    {Файловая переменная}

			    d:string;  {Переменная которой присваивается очередное считанное значение из файла}

			

			begin

			assign (f,'e:\prog\razdel.dat'); {Файл который содержит разделы и подразделы}

			reset(f);

			nabor:=0;

			       while not Eof(f) do

			       {До тех пор пока не конец файла делать

			       если очередная строка файла соответствует выбранному разделу то

			       записать ее в массив}

			       begin

			            Readln(f,d);

			            if d=rozd then

			            begin

			                 nabor:=nabor+1;

			                 Readln(f,d);

			                 PodRaz[nabor]:=d;

			            end

			            else Readln(f,d);

			       end;

			close(f);

			   {Вывод на экран пунктов и подпунктов меню из массива, закрашенных цветами

			   из массива цветов}

			   z:=3;

			   for i:=1 to nabor do

			   begin

			        Textcolor(men[i]);

			        GoToXY(2,z);

			        writeln(PodRaz[i]);

			        z:=z+1

			   end;

			

			end;

			

			procedure ADDSpisok;{Добавляет в динамический список код товара, для

			                               дальнейшего перемещения}

			begin

			      new(tek); {создаем новый элемент}

			      tek^.nomer:=Baza.FKod;{записываем данное}

			      tek^.next:=nach;{устанавливаем указатели}

			      nach:=tek;   {для поддержания целостности списка}

			      kolvo:=kolvo+1; {Увеличиваем количество добавленных элементов}

			end;

			

			procedure Tablo;

			{Процедура выводит позиции товаров на экран}

			var  opis1,opis2,opis3:string; {Разбивает строку на три части т.к. не влезает}

			begin

			          GoToXY(22,3);Textcolor(10);writeln('Kод товара ');

			          GoToXY(33,3);Textcolor(11);writeln(Baza.FKod);

			          GoToXY(43,3);Textcolor(10);writeln('Раздел ');

			          GoToXY(50,3);Textcolor(11);writeln(Baza.FRazdel);

			          GoToXY(60,3);Textcolor(10);writeln('Подраздел ');

			          GoToXY(70,3);Textcolor(11);writeln(Baza.FPodRazdel);

			          GoToXY(22,5);Textcolor(10);writeln('Название: ');

			          opis1:=copy(Baza.FName,1,58);

			          opis2:=copy(Baza.FName,59,117);

			          opis3:=copy(Baza.FName,118,126);

			          GoToXY(22,6);Textcolor(11);writeln(Opis1);

			          GoToXY(22,7);Textcolor(11);writeln(Opis2);

			          GoToXY(22,8);Textcolor(11);writeln(Opis3);

			          GoToXY(22,10);Textcolor(10);writeln('Серия:');

			          GoToXY(30,10);Textcolor(11);writeln(Baza.FSeria);

			          GoToXY(22,12);Textcolor(10);writeln('Производитель:');

			          GoToXY(22,13);Textcolor(11);writeln(Baza.FProizvod);

			          opis1:=copy(Baza.FOpisan,1,58);

			          opis2:=copy(Baza.FOpisan,59,117);

			          opis3:=copy(Baza.FOpisan,118,126);

			          GoToXY(22,15);Textcolor(10);writeln('Описание:');

			          GoToXY(22,16);Textcolor(11);writeln(Opis1);

			          GoToXY(22,17);Textcolor(11);writeln(Opis2);

			          GoToXY(22,18);Textcolor(11);writeln(Opis3);

			          GoToXY(22,20);Textcolor(10);writeln('Стоимость');

			          GoToXY(35,20);Textcolor(11);writeln(Baza.FMany);

			end;

			

			procedure writeSpisok;  {Процедура вывода позиций товара чей код

			                       последним записан в список}

			var f:text;

			begin

			if  ScetRP<>0 then

			begin

			  tek:=nach;{Считать первый элемент списка и найти в файле товар с

			                     таким кодом}

			  assign(f,'e:\prog\bd.dat');

			  reset(f);

			    while not Eof(f) do   {Считываем из файла бд}

			    begin

			     readln(f,Baza.FKod);

			     readln(f,Baza.FRazdel);

			     readln(f,Baza.FPodRazdel);

			     readln(f,Baza.FName);

			     readln(f,Baza.FSeria);

			     readln(f,Baza.FProizvod);

			     readln(f,Baza.FOpisan);

			     readln(f,Baza.FMany);

			     readln(f,Baza.FSim);

			     if Baza.FKod=tek^.nomer Then  {Если код товара из списка = коду товара

			                             из файла значит вывести на экран позиции товара}

			     begin

			        clrscr;

			          shapka; podRazdel;

			          GoToXY(1,1); {write ('MRazdel=',MRazdel,'  Podrazd=',lom);}

			          GoToXY(60,1); Write('Всего позиций: ',ScetRP);

			          Tablo;

			     end;

			    end;

			close(f);

			end

			else

			 begin

			      GoToXY(22,11);Textcolor(10);writeln('Товаров нет, для выхода из данной категории нажмите ESC');

			      f1:=7;f2:=11;f3:=7;f4:=7;f8:=7;pu:=7;pd:=7;f10:=7; {Цвета нижних кнопок}

			       Text1:='Двигайтесь кнопками';

			       Text2:='PageDown,PageUp    ';       {Подсказки}

			       Text3:='Для выхода нажмите ';

			       Text4:='ESC                ';

			      shapka;podrazdel;

			

			      {writeln('Enter');

			      readln;}

			 end;

			end;

			

			procedure DelSpisok; {Удаляет последний элемент списка}

			begin

			  tek:=nach;   {Переходим в начало}

			  nach:=tek^.next; {Связываем}

			  dispose(tek);    {Удаляем}

			  tek:=nach;

			  kolvo:=kolvo-1;  {Уменьшаем количество элементов в списке на 1}

			end;

			

			procedure RP; {Считывает из файла первый товар соответствующий разделу

			              и подразделу}

			{var lon:boolean;

			{    f:text;}

			begin

			{lon:=false;{}

			assign (f,'e:\prog\bd.dat');

			reset(f);

			while (not Eof(f)) do

			  begin

			     readln(f,Baza.FKod);

			     readln(f,Baza.FRazdel);

			     readln(f,Baza.FPodRazdel);

			     readln(f,Baza.FName);

			     readln(f,Baza.FSeria);

			     readln(f,Baza.FProizvod);

			     readln(f,Baza.FOpisan);

			     readln(f,Baza.FMany);

			     readln(f,Baza.FSim);

			     {Если раздел из файла = выбранному разделу и подраздел

			     из файла=выбранному подразделу}

			     If (Baza.FRazdel=MRazdel) and (Baza.FPodRazdel=Podrazd) then

			     begin

			         addspisok; {Добавляем в список}

			         break;

			     end;

			  end;

			end;

			

			procedure PoiskFPR; {Поиск элемента соответствующей разделу и

			                    подразделу в списке и в файле}

			var {f:text;}

			    Good,Nal:boolean;

			    zed:integer;

			begin

			assign (f,'e:\prog\bd.dat');

			reset(f);

			nal:=false;

			  while (not Eof(f)) or (nal=false) do {Считывает данные из файла бд}

			  begin

			     readln(f,Baza.FKod);

			     readln(f,Baza.FRazdel);

			     readln(f,Baza.FPodRazdel);

			     readln(f,Baza.FName);

			     readln(f,Baza.FSeria);

			     readln(f,Baza.FProizvod);

			     readln(f,Baza.FOpisan);

			     readln(f,Baza.FMany);

			     readln(f,Baza.FSim);

			     If ((Baza.FRazdel=MRazdel) and (Baza.FPodRazdel=Podrazd)) then

			     begin         {Если очередной товар в бд соответствует разделу и

			                   подразделу тогда проверяется есть ли очередной код товара

			                   в списке, если есть то ищет в бд следующий товар, если

			                   нет то добавляет в список}

			          zed:=0;

			          Good:=false;

			          d:=nil;

			          tek:=nach;

			          while (tek<>NIL) or (Good=false) do

			          begin

			               if tek^.nomer = Baza.FKod then Good:=true;

			               d:=tek;

			               tek:=tek^.next;

			               zed:=zed+1;

			               if zed=kolvo then break;

			          end;

			          if Good<>true  then

			          begin

			               nal:=true;

			               break;

			          end;

			     end;

			  end;

			close(f);

			end;

			

			procedure schet; {Процедура выводит количество позиций в выбранном разделе

			                 и подразделе}

			{var f:text;{}

			begin

			ScetRP:=0;

			  assign(f,'e:\prog\bd.dat');

			  reset(f);

			    while not Eof(f) do

			    begin

			          readln(f,Baza.FKod);

			          readln(f,Baza.FRazdel);

			          readln(f,Baza.FPodRazdel);

			          readln(f,Baza.FName);

			          readln(f,Baza.FSeria);

			          readln(f,Baza.FProizvod);

			          readln(f,Baza.FOpisan);

			          readln(f,Baza.FMany);

			          readln(f,Baza.FSim);

			          if (Baza.FRazdel=MRazdel) and (Baza.FPodRazdel=Podrazd) then

			          ScetRP:=ScetRP+1;

			    end;

			close(f);

			end;

			

			Procedure Del; {Процедура удаление товара}

			var FDel:text;{Временный файл для не удаленных товаров}

			begin

			GoToXY(27,21);Textcolor(21);

			writeln('Вы действительно хотите удалить файл Y/N');

			ch:=readkey;

			if (ord(ch)=121) or  (ord(ch)=173) then

			begin

			assign(f,'e:\prog\bd.dat');

			assign(fDel,'e:\prog\bdvr.dat');

			reset(f);

			rewrite(fdel);

			

			while not Eof(f) do {Считывается очередной товар из бд}

			         begin

			         readln(f,Baza.FKod);

			         readln(f,Baza.FRazdel);

			         readln(f,Baza.FPodRazdel);

			         readln(f,Baza.FName);

			         readln(f,Baza.FSeria);

			         readln(f,Baza.FProizvod);

			         readln(f,Baza.FOpisan);

			         readln(f,Baza.FMany);

			         readln(f,Baza.FSim);

			            If Baza.FKod<>tek^.nomer then  {Если текущая позиция в списке не

			            равно текущему коду товара то все позиции товара переносятся

			            во временный файл bddvr}

			            begin

			                 writeln(fdel,Baza.FKod);

			                 writeln(fdel,Baza.FRazdel);

			                 writeln(fdel,Baza.FPodrazdel);

			                 writeln(fdel,Baza.FName);

			                 writeln(fdel,Baza.FSeria);

			                 writeln(fdel,Baza.FProizvod);

			                 writeln(fdel,Baza.FOpisan);

			                 writeln(fdel,Baza.FMany);

			                 writeln(fdel,Baza.FSim);

			            end

			         end;

			close(f);

			close(fDel);

			reset(fDel);

			rewrite(f);

			while not Eof(fDel) do {После переноса во временный файл, но уже без

			          удаленного элемента происходит перезапись файла бд из временного}

			         begin

			                 readln(fDel,Baza.FKod);        writeln(f,Baza.FKod);

			                 readln(fDel,Baza.FRazdel);     writeln(f,Baza.FRazdel);

			                 readln(fDel,Baza.FPodRazdel);  writeln(f,Baza.FPodrazdel);

			                 readln(fDel,Baza.FName);       writeln(f,Baza.FName);

			                 readln(fDel,Baza.FSeria);      writeln(f,Baza.FSeria);

			                 readln(fDel,Baza.FProizvod);   writeln(f,Baza.FProizvod);

			                 readln(fDel,Baza.FOpisan);     writeln(f,Baza.FOpisan);

			                 readln(fDel,Baza.FMany);       writeln(f,Baza.FMany);

			                 readln(fDel,Baza.FSim);        writeln(f,Baza.FSim);

			         end;

			close(fdel);

			close(f);

			

			

			GoToXY(27,21);Textcolor(21); writeln('Запись удалена для продолжения работы нажмите ESC');

			end;

			if ord(ch)=110 then begin

			GoToXY(27,21);Textcolor(21); writeln('Удаление отменено для продолжения работы нажмите ESC');

			end;

			end;

			

			Procedure PrintF; {Процедура Печать в файл}

			var fname1,fname2,fname3:string;  {Переменные указывающие путь к файлу}

			    fotchet:text; {переменная файла отчета}

			begin

			clrscr;

			GoToXY(10,10); Textcolor(11);writeln('Для печати всех позиций текущего подраздела нажмите F3');

			GoToXY(10,12);writeln('Для печати текущей позиций нажмите F5');

			GoToXY(10,14);writeln('Для выхода нажмите Backspace');

			repeat

			ch:=readkey;

			            if (ord(ch)=61) or (ord(ch)=63) then {Вводится имя будущего

			                               файла и создается шапка в файле отчета}

			            begin

			              fname1:='e:\prog\';

			              fname3:='.txt';

			              GoToXY(10,16);writeln('Введите имя файла в который необходимо сохранить отчет');

			              GoToXY(10,17);writeln('и нажмите ввод. Файл отчета находится в корневой папке');

			              GoToXY(10,19);readln(fname2);

			              assign(fotchet,fname1+fname2+fname3);

			              assign(f,'e:\prog\bd.dat');

			              reset(f);

			              rewrite(fotchet);

			            end;

			

			    if ord(ch)=61 then      {Если нажата F3 то создается отчет состоящий из

			                            товаров текущего подраздела}

			    begin

			        writeln(fotchet,'Отчет по подразделу  ');

			        writeln;

			        writeln(fotchet,'---------------------------------------------------------');

			        while not Eof(f) do

			        begin

			         readln(f,Baza.FKod);

			         readln(f,Baza.FRazdel);

			         readln(f,Baza.FPodRazdel);

			         readln(f,Baza.FName);

			         readln(f,Baza.FSeria);

			         readln(f,Baza.FProizvod);

			         readln(f,Baza.FOpisan);

			         readln(f,Baza.FMany);

			         readln(f,Baza.FSim);

			         if (Baza.FRazdel=MRazdel) and (Baza.FPodRazdel=Podrazd) then

			         begin

			              write (fotchet,'Код товара    '); writeln(fotchet,Baza.FKod);

			              write (fotchet,'Название      ');writeln(fotchet,Baza.FName);

			              write (fotchet,'Серия         ');writeln(fotchet,Baza.FSeria);

			              write (fotchet,'Производитель ');writeln(fotchet,Baza.FProizvod);

			              write (fotchet,'Описание      ');writeln(fotchet,Baza.FOpisan);

			              write (fotchet,'Цена          ');writeln(fotchet,Baza.FMany);

			              writeln(fotchet,'-----------------------------------------');

			         end;

			        end;

			   close(fotchet);

			   close(f);

			   end;

			   if ord(ch)=63 then {Если нажата F5 то в файл отчета добавляется только

			                      текущая позиция}

			   begin

			        tek:=nach;

			        writeln(fotchet,'Отчет по текущему товару');

			        writeln;

			        writeln(fotchet,'---------------------------------------------------------');

			        while not Eof(f) do

			        begin

			         readln(f,Baza.FKod);

			         readln(f,Baza.FRazdel);

			         readln(f,Baza.FPodRazdel);

			         readln(f,Baza.FName);

			         readln(f,Baza.FSeria);

			         readln(f,Baza.FProizvod);

			         readln(f,Baza.FOpisan);

			         readln(f,Baza.FMany);

			         readln(f,Baza.FSim);

			         if (Baza.FKod=tek^.nomer) then

			         begin

			              write (fotchet,'Код товара    '); writeln(fotchet,Baza.FKod);

			              write (fotchet,'Название      ');writeln(fotchet,Baza.FName);

			              write (fotchet,'Серия         ');writeln(fotchet,Baza.FSeria);

			              write (fotchet,'Производитель ');writeln(fotchet,Baza.FProizvod);

			              write (fotchet,'Описание      ');writeln(fotchet,Baza.FOpisan);

			              write (fotchet,'Цена          ');writeln(fotchet,Baza.FMany);

			              writeln(fotchet,'-----------------------------------------');

			         end;

			        end;

			   close(fotchet);

			   close(f);

			   end;

			

			until (ord(ch)=8) or (ord(ch)=61) or (ord(ch)=63);

			{Закрыте файлов и вывод на прежнее место}

			        clrscr;

			        shapka;

			        writespisok;

			end;

			

			procedure NewTovar; {Процедура добавления нового товара}

			var f1,f2,f3:text; {Файловые переменные}

			    kod:integer;   {Переменная которой присваивается новый код товара}

			begin

			clrscr;

			Baza.FRazdel:=MRazdel; Baza.FPodRazdel:=PodRazd;

			{Форма заполнения данных о новом товаре}

			GoToXY(10,1); Textcolor(10); Writeln('Заполните форму. После заполнение очередного пункта нажмите ввод');

			GoToXY(3,4); writeln('Раздел ',Baza.FRazdel);

			GoToXY(3,5); writeln('Подраздел ',Baza.FPodRazdel);

			GoToXY(3,6);  Writeln('Опешите назначение товара');

			GoToXY(3,8);  Writeln('Введите серию товара, если нет то введите символ "-" ');

			GoToXY(3,10); Writeln('Введите производителя');

			GoToXY(3,12); Writeln('Опешите товар подробнее');

			GoToXY(3,22); Writeln('Цена товара');

			GoToXY(3,5); Textcolor(11);

			GoToXY(3,7);readln(Baza.FName);

			GoToXY(3,9);readln(Baza.FSeria);

			GoToXY(3,11);readln(Baza.FProizvod);

			GoToXY(3,13);readln(Baza.FOpisan);

			GoToXY(20,22);readln(Baza.FMany);

			GoToXY(10,23);Textcolor(10); Writeln('Сохранить Y, Отмена N');

			ch:=readkey;

			      if (ord(ch)= 121) or (ord(ch)= 173) then  {Если нажата Y на английском

			      и Н на русском, то считывается из файла, который хранит коды товаров,

			      запоминает последний, увеличивает на единицу и добавляет новый код

			      в файл кодов}

			      begin

			            clrscr;

			            assign(f2,'e:\prog\kod.dat');

			            reset(f2);

			            while not Eof(f2) do readln(f2,Kod);

			            close(f2);

			            Baza.FKod:=Kod+1;

			            append(f2);

			            write(f2,'');

			            writeln(f2,Baza.FKod);

			            close(f2);

			            assign(f3,'e:\prog\bd.dat');

			            {Записывает в БД информацию о новом товаре}

			            append(f3);

			            writeln(f3,Baza.FKod);

			            writeln(f3,Baza.FRazdel);

			            writeln(f3,Baza.FPodRazdel);

			            writeln(f3,Baza.FName);

			            writeln(f3,Baza.FSeria);

			            writeln(f3,Baza.FProizvod);

			            writeln(f3,Baza.FOpisan);

			            writeln(f3,Baza.FMany);

			            writeln(f3,'*');

			            close(f3);

			            GoToXY(18,12); writeln('Запись сохранена для продолжения нажмите ввод');

			            readln;

			      end;

			clrscr;

			shapka;

			podRazdel;

			GoToXY(27,21);Textcolor(21); writeln('Для продолжения работы нажмите ESC');

			end;

			

			procedure vivod; {Основная процедура вывода}

			{Общий принцип: На экране появляется первый элемент выбранного раздела и подраздела

			Далее пользователь при помощи кнопок PageUp PageDown перемещается по всем товарам}

			var hod:integer; {Счетчик ходв}

			begin

			schet;    {Считать общее количество позиций}

			       f1:=7;f2:=11;f3:=7;f4:=11;f8:=11;pu:=11;pd:=11;f10:=7; {Переменные цвета нижних кнопок}

			       Text1:='Двигайтесь кнопками';

			       Text2:='PageDown,PageUp';       {Подсказки}

			       Text3:='Для выхода нажмите';

			       Text4:='ESC';

			RP; {Выводится первый товар}

			hod:=1;   {Сделан первый ход}

			

			writeSpisok; {Вывести на экран товар соответствующий коду товара из списка}

			repeat

			      ch:=readkey;

			      if (ord(ch)=81) and (ScetRP<>0) then {Если нажата PageDown}

			      begin

			           if ScetRP<>hod then

			           begin

			             hod:=hod+1;

			             PoiskFPR; {Считывается весь файл и проверяется соответствие каждого товара

			                       разделу и подразделу и проверяет входит ли код товара в список

			                       если входит то ищет дальше если нет то...}

			             addspisok; {Если нет то добавляет в список}

			             writeSpisok;  {Выводит товар соответствующий коду товара из списка}

			           end;

			      end;

			      if (ord(ch)=73) and (ScetRP<>0)  then  {Если нажата PageUp}

			      begin

			          if hod<>1 then

			          begin

			            hod:=hod-1;

			            DelSpisok;  {Удаляет последний элемент списка}

			            writeSpisok; {Выводит уже другой последний элемент}

			          end;

			      end;

			

			      if ord(ch)=60 then NewTovar; {Если нажата F2 то в данный раздел и подраздел ввести новый товар}

			      if (ord(ch)=66) and (ScetRP<>0) then Del;{Если нажата клавиша F8, то процедура удаление товара}

			      if (ord(ch)=62) and (ScetRP<>0) then PrintF;{Если нажата клавиша F4, то процедура создания отчета}

			until ord(ch)=27;

			end;

			

			procedure Vhod; {Процедура обработки события по нажатию клавише ввод}

			begin

			

			   Lom:=1;

			   if ord(ch)=13 then {Если нажат ввод}

			   begin

			        for i:=1 to nabor do

			        begin

			           if (men[i]=15)  then {Если текущий цвет белый то... }

			           begin

			                if razdel=1 then {Если открыт подраздел...}

			                begin

			                     podrazd:=Lom; {Присвоить подразделу его порядковый номер}

			                     vivod;        {Вывод на экран}

			                     kolvo:=0;

			                end;

			                if (Lom=1) and (razdel=0) then

			                begin

			                     rozd:='1'; {Номер раздела}

			                     MRazdel:=1;{Номер подраздела}

			                     razdel:=1; {Показывает что открыт подраздел, а не раздел}

			                end;{Далее аналогично}

			                if (Lom=2) and (razdel=0)  then begin rozd:='2'; MRazdel:=2; razdel:=1; end;

			                if (Lom=3) and (razdel=0)  then begin rozd:='3'; MRazdel:=3; razdel:=1; end;

			                if (Lom=4) and (razdel=0)  then begin rozd:='4'; MRazdel:=4; razdel:=1; end;

			                if (Lom=5) and (razdel=0)  then begin rozd:='5'; MRazdel:=5; razdel:=1; end;

			                if (Lom=6) and (razdel=0)  then begin rozd:='6'; MRazdel:=6; razdel:=1; end;

			                if (Lom=7) and (razdel=0)  then begin rozd:='7'; MRazdel:=7; razdel:=1; end;

			                if (Lom=8) and (razdel=0)  then begin rozd:='8'; MRazdel:=8; razdel:=1; end;

			                if (Lom=9) and (razdel=0)  then begin rozd:='9'; MRazdel:=9; razdel:=1; end;

			           end;

			           Lom:=Lom+1;

			        end;

			   end;

			   if ord(ch)=8 then {Если нажата <- то вернутся назад}

			   begin

			        rozd:='0'; {Открывает раздел}

			        razdel:=0; {Показывает что открыт раздел}

			   end;

			podRazdel; {Процедура создание подразделов}

			end;

			

			procedure Poisk;

			var punkt:integer; {Переменная ввода выбранного критерия поиска}

			    NSP:string; {Переменная условия поиска}

			    fol:integer; {Переменная счетчик}

			begin

			clrscr;

			fol:=0; {Счетчик указывающий количество найденных позиций}

			

			GoToXY(10,2);  Textcolor(10); Writeln('Выберете критерии поиска');

			{GoToXY(10,3);  Writeln('и нажмите ввод');}

			Textcolor(11); GoToXY(12,6); Writeln('1: Название');

			GoToXY(12,8); Writeln('2: Серия');

			GoToXY(12,10); Writeln('3: Производитель');

			GoToXY(12,12); Writeln('4: Отмена');

			repeat

			ch:=readkey;

			if (ord(ch)=49) or (ord(ch)=50) or (ord(ch)=51) then

			begin

			 {GoToXY(12,14); readln(punkt);}

			 GoToXY(12,14);writeln('Введите условие и нажмите ввод');

			 GoToXY(12,16);readln(nsp);

			

			 assign(f,'e:\prog\bd.dat');

			 reset(f);

			

			      while (not Eof(f)) do {Считывает очередной товар}

			         begin

			            readln(f,Baza.FKod);

			            readln(f,Baza.FRazdel);

			            readln(f,Baza.FPodRazdel);

			            readln(f,Baza.FName);

			            readln(f,Baza.FSeria);

			            readln(f,Baza.FProizvod);

			            readln(f,Baza.FOpisan);

			            readln(f,Baza.FMany);

			            readln(f,Baza.FSim);

			            If (Baza.FName=NSP) or (Baza.FSeria=Nsp) or (Baza.FProizvod=Nsp) then

			            begin

			               clrscr;

			               Tablo;

			               f1:=7;f2:=7;f3:=7;f4:=7;f8:=7;pu:=7;pd:=11; f10:=7; {Цвета нижних кнопок}

			               Text1:='Двигайтесь кнопкой';

			               Text2:='PageDown';        {Подсказка}

			               Text3:='Для выхода нажмите';

			               Text4:='ESC';

			               Shapka;

			               fol:=fol+1;

			               repeat

			               ch:=readkey;

			               until (ord(ch)=81)  or (ord(ch)=27);

			               f1:=11;f2:=7;f3:=11;f4:=7;f8:=7;pu:=7;pd:=11;f10:=11; {Цвета нижних кнопок}

			               if ord(ch)=27 then break;

			            end;

			         end;

			

			 close(f);

			 clrscr;

			 GoToXY(15,12);Textcolor(4);

			         if fol>0 then writeln('Больше совпадений нет, для продолжения работы нажмите ввод')

			         else writeln('Cовпадений нет, для продолжения работы нажмите ввод');

			 readln;

			 break;

			end;

			until ord(ch)=52;

			 clrscr;

			 Text1:='Двигайтесь курсором';

			 Text2:='до нужного раздела';        {Подсказка}

			 Text3:='и нажмите ВВОД';

			 Text4:='Для возврата <-';

			 Shapka;

			 podRazdel;

			

			end;

			

			procedure  help;

			var k:string;

			    n:integer;

			begin

			    clrscr;

			    n:=0;

			    assign(f,'e:\prog\help.dat');

			    reset(f);

			    while not Eof(f) do {Считывает очередной товар}

			    begin

			       if (n=24) or (n=48) or (n=72) or (n=96) or (n=120) or (n=120) then readln;{ch:=readkey;}

			         readln(f,k);

			         writeln(k);

			         n:=n+1;

			    end;

			    readln;

			    close(f);

			    clrscr;

			    Shapka;

			    podRazdel;

			end;

			

			procedure perem; {Процедура перемещает элементы меню}

			begin

			   {Массив цветов. Первый белый остальные зеленые}

			   men[1]:=15; men[2]:=2; men[3]:=2; men[4]:=2; men[5]:=2; men[6]:=2; men[7]:=2;

			    men[8]:=2;  men[9]:=2; men[10]:=2;men[11]:=2;men[12]:=2;men[13]:=2; men[14]:=2; men[15]:=2;

			  repeat

			   podRazdel; {Процедура вывода подразделов}

			   strok:=1; {Текущая строка}

			   GoToXY(79,1);

			   ch:=readkey; {Просит ввести курсором направления движения}

			   if (ord(ch)=80)  then {Если вниз тогда текущий становится белым,

			                         а нижний становится зеленым}

			   begin

			    for i:=1 to nabor do

			    begin

			      if (men[i]=15) and (strok<>nabor) then

			      begin

			          men[strok]:=2;

			          men[strok+1]:=15;

			      end

			      else strok:=strok+1;

			    end;

			   end;

			

			   if ord(ch)=72 then     {Если вверх, то текущий белым, а верхний зеленым}

			   begin

			     for i:=1 to nabor do

			     begin

			      if (men[i]=15) and (strok<>1)then

			      begin

			          men[strok]:=2;

			          men[strok-1]:=15;

			      end

			      else strok:=strok+1;

			     end;

			   end;

			

			   if ord(ch)=59 then Help; {Если нажата клавиша F1}

			   if ord(ch)=61 then Poisk;{Если нажата клавиша F3}

			{До тех пор пока не нажат ввод или назад или выход}

			

			  until (ord(ch)=13) or (ord(ch)=8) or (ord(ch)=68);

			  vof:=true;

			

			  if (ord(ch)<>68) then  vhod;{Если не нажат выход то вход в очередной раздел или подраздел}

			end;

			

			{Основная программа}

			begin

			 rozd:='0'; {Подраздел не выбран, значит выводить главный раздел}

			 razdel:=0; {Показывает что открыт раздел, а не подраздел}

			 vof:=false; {Переменная показывает что перемещений не было}

			 repeat

			       clrscr;

			       f1:=11;f2:=7;f3:=11;f4:=7;f8:=7;pu:=7;pd:=7;f10:=11; {Цвета нижних кнопок}

			       Text1:='Двигайтесь курсором';

			       Text2:='до нужного раздела';        {Подсказка}

			       Text3:='и нажмите ВВОД';

			       Text4:='Для возврата <-';

			       shapka; {Процедура выводит разметку на экран}

			       GoToXY(79,1);

			       perem;          {Процедура перемещения курсором в разделах и подразделах}

			 until (ord(ch)=68) ; {До тех пор пока не нажат пункт EXIT}

			end.