Курсовая

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

Работа добавлена на сайт bukvasha.net: 2014-07-17

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 11.11.2024


Содержание
1.      Введение
2.      Содержательная постановка и описание задачи
3.      Атрибуты объекта и предоставление данных в программ
4.      Описание программы создания набора данных
5.      Описание программы формирование выходного документа
6.      Описание программы формирование списковой структуры
7.      Технология обработки данных
8.      Заключение
9.      Список литературы
Приложение 1 - Графическое описание данных      
Приложение 2 - Представление данных в памяти ЭВМ
Приложение Рисунок списковой структуры
Приложение 4 – Формат выходного документа     
Приложение 5 – Схема последовательности обработки данных
Приложение 6 Листинг программы

1.   Введение
Цель выполнения курсового проекта состоит в том, чтобы научится описывать предметную область реального мира – объект и его атрибуты, закрепить навыки использования основных структур данных, способов их описания и основных операций над ними. Освоить разработку удобного пользовательского интерфейса.
Действительно при помощи Turbo Pascal достаточно не просто создать программу, которая бы демонстрировала работу с базами данных (далее БД). Для этого в настоящий момент существует огромное количество специализированных программ. Но все-таки основу и саму сущность формирования БД при помощи Turbo Pascal, реализовать, возможно.
К сожалению темы курсовых работ, были не произвольными, а выбирались по общим правилам. В связи с этим моей темой стал Справочник «Парфюмерный магазин». Я, конечно, слабовато знаю данную область, но с другой стороны в дальнейшей работе, придется создавать такие программы, предметной области которых я могу не знать совсем. Поэтому я постарался изучить данную предметную область и реализовать ее в программном продукте.

2.   Содержательная постановка и описание задачи
Парфюмерный магазин – это магазин с конкретно ориентированными товарами, предназначенными, в первую очередь, для личной гигиены и уходом за телом.
Программа должна обладать следующими функциями:
–  Удобная справочная система и система подсказок;
–  Возможность добавление в БД нового товара;
–  Возможность поиска по выбранным критериям;
–  Возможность удобной сортировки товаров;
–  Возможность создания отчетности;
–  Возможность удаления ненужного товара.
При этом в конечном программном продукте должен быть интуитивно понятный и доступный любым пользователем, интерфейс, с использованием подсказок. Удобная сортировка, а также удобное управление в режиме работы непосредственно с товарами.
Сортировки товаров в любой БД необходимо уделять особое внимание. Связано это в первую очередь с необходимостью оперативного доступа к требуемой информации из БД.

3.   Атрибуты объекта и предоставление данных в программе
Определим необходимый набор атрибутов. Условно их можно разделить на 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 Поля объекта
Основным объектом в данной программе является товар, все остальные объекты в программе так или иначе связаны с товаром.
Как показало изучение предметной области, критерии товаров должны быть следующими:
-      Код товара – целое число, которое должно быть уникальное для каждого товара, т.е. не повторятся;
-      Раздел – целое число, которое свидетельствует о принадлежности к определенному разделу, каждое из которых имеет свой уникальный номер;
-      Подраздел - целое число, которое свидетельствует о принадлежности к определенному подразделу, каждое из которых имеет свой уникальный номер;
-      Название – строковое данное, характеризует общее название товара;
-      Серия – это строковое данное, характеризует принадлежность товара к определенной серии;
-      Производитель - строковое данное, описывает название производителя;
-      Описание - строковое данное, которое описывает товар более подробно;
-      Цена товара – это строковое данное указывает цену товара. Цена товара будет именно строковым данным, сделано это для того, чтоб не указывать валюту (рубли, У.Е., евро, доллар США и т.д.) и деление на рубли и копейки.

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.   Описание программы формирование выходного документа
К выходным документам относятся:
-      Вывод информации на экран;
-      Вывод информации в файл.
5.1 Вывод информации на экран
Пример формирования выходного документа на экран см. в приложении 4 рис. 2
Экран в данной программе состоит из пяти частей:
–  Заголовок. Заголовок находится в верхней части экрана и показывает, в каком разделе пользователь находится в настоящий момент. Так же при выборе пользователем подраздела в правой части заголовка выводится количество позиций (товаров) в данном подразделе.
–  Меню. Меню находится в левой части экрана и отображает пользователю существующие разделы и подразделы, перемещение в которых осуществляется при помощи курсора.
–  Подсказка. Подсказки находятся в левой части экрана под Меню. Здесь отображается клавиши управления для навигации по программе.
–  Клавиши управления. Каждая клавиша имеет свой цвет и доступна только в тех случаях, когда данными функциями можно воспользоваться. Клавиши управления находятся в нижней части экрана и содержат следующие пункты:
1)        Помощь F1;
2)        Новый F2;
3)        Поиск F3;
4)        Отчет F4;
5)        Удалить F5;
6)        Назад PageUp;
7)        Далее PageDown;
8)        Выход 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 для чтения. Данный файл содержит справочную информацию о работе с программой.
–  Файл справки достаточно большой и, следовательно, не влезает в одно окно, для этого существует ограничения, когда экран заполнен, то дальнейшее считывание не происходит, до тех пор, пока пользователь не прочтет все и не нажмет клавишу ввод. После этого на экран выводится следующая часть файла справки.
–  По завершению работы с файлом справки, он закрывается и на экран выводится разметка,  разделы или подразделы, для дальнейшего выбора пользователем.
7.3.2   Поиск.
В ход в режим поиска осуществляется по нажатию клавиши 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):
–  У пользователя уточняется, действительно ли он хочет удалить товар;
–  Если да то открывается файл БД для чтения и открывается временный файл в режиме перезаписи;
–  Каждый элемент из БД копируется во временный файл, за исключением того которого, хотят удалить, т.е. того код, которого находится в вершине списка;
–  Закрываются оба файла;
–  Открытие файла БД в режиме перезаписи и временного файла в режиме чтения;
–  Вся информация из временного файла, целиком копируется в файл БД;
–  Файлы закрываются;
–  Выводится сообщение, что запись удалена;
–  Обновление информации на экране.

8      Заключение
Подведем итог того, что все-таки удалось в данном курсовом проекте:
–  Удалось создать неплохую сортировку, что облегчает работу с товарами, на мой взгляд, эта основа любой БД;
–  Удалось создать достаточно простой и интуитивно понятный интерфейс, без каких либо излишеств;
–  В программе реализованы основные функции работы с БД – удаление, добавление, отчетность, поиск;
–  Показано когда, какая функция доступна;
–  Отражено, в каком разделе осуществляется работа, т.к. некоторые разделы содержат одинаковые подразделы и можно запутаться;
–  Существует справочная система и система подсказок. Хотя над справкой можно было еще поработать;
–  Достаточно простое управление товарами;
Конечно, можно было еще поработать над справкой, отчетами и поиском. Действительно отчет всего по двум критериям, для БД конечно маловато, и достаточно примитивный поиск. Но, подводя итог можно сказать, что основная цель, на мой взгляд, все-таки выполнена, эти функции показаны и реализованы.
Ко всему прочему можно с уверенностью сказать, что данную программу можно приспособить под большинство справочников. Для этого достаточно открыть файл разделов и создать другие, например жанры книг и точно также разделы, и подразделы, т.е. сортировку. Затем изменить некоторые позиции в товаре, поиске и отчетности и в принципе все. В итоге, как мне кажется, за день другой, данную программу можно очень быстро переделать.
В итоге конечная цель все-таки достигнута. Была создана универсальная БД со всем набором необходимых функций. Конечно же, в Turbo Pascal достаточно сложно создавать БД и БД получаются достаточно примитивные, но принцип создания БД, описан очень хорошо.

9      Список литературы
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
Выбор режима работы, схема 1000
Вывод на экран разделов и подразделов схема 100
Операции над товарами, схема 1000
Конец
 

Схема 1 – Общая схема
Вывод линий разметки
Вывод кнопок управления
Вывод заголовка
Вывод подсказок
Конец
Начало
 

Схема 2 – Разметка экрана
Начало
Открытие файла для чтения
Считывание доступных разделов и подразделов
Закрытие файла
Операции над товарами
Вывод элементов меню
Конец
 

Схема 3 – вывод разделов и подразделов
Начало
Вывод разделов и подразделов схема 10000
Сохранение текущей строки
Выбор направления
 

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

Схема 4 – Перемещение по меню
Начало
Выбор режима работы
 

                                        Enter                                           F1
 

     F3
Конец
События по нажатию Enter схема 10000
Поиск схема 10000
Помощь схема 10000
 

Схема 5 – Выбор режима работы
Начало
Открытый ли раздел
 

     нет
 

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

Вход
                                        Вниз                     
Конец
 

Схема 6 - События по нажатию Enter
Начало
Выбор критерий поиска
 

                                                     1                                 3
 

                                                                                           
                                                                               2
Ввод условия поиска
Блок-схема: данные: Ввод условия поиска
 

                                                          
Поиск в БД
Есть совпад.
 

                                                                                            нет
 

                                                            Да
Вывод на экран товаров схема 100
Блок-схема: данные: Вывод на экран товаров схема 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.

1. Реферат на тему Heart Of Darkness Essay Research Paper Whether
2. Курсовая на тему Денежные затраты предприятий
3. Реферат на тему Особенности Нового курса Ф Рузвельта в США
4. Реферат на тему Dream Of A Long Fur Coat Judgement
5. Реферат Производительные силы понятие, структура, особенности развития в Украине
6. Контрольная работа на тему Страховой рынок в РФ. Имущественное страхование
7. Реферат Гликопин
8. Реферат Ненадання допомоги судну та особам що зазнали лиха Порушення правил безпеки дорожнього руху аб
9. Реферат Старообрядчество понятие и сущность
10. Отчет по практике Похід по урочищу Феофанія