Курсовая

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

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

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

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

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

от 25%

Подписываем

договор

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

Скидка 25% при заказе до 27.12.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. Контрольная работа на тему Источники гражданского права
2. Реферат на тему Line Item Veto Essay Research Paper The
3. Реферат на тему Dihonesty Essay Research Paper Our Dishonest Society
4. Статья на тему Учет основных средств по МСФО и РСБУ
5. Методичка на тему Планирование производства электроэнергии на КЭС
6. Реферат Сущность понятие себестоимости и классификация издержек
7. Реферат Система охлаждения двигателя ВАЗ 2108
8. Реферат на тему Венерические заболевания 2
9. Доклад Grip INC
10. Реферат на тему Органическое заболевание головного мозга сосудистого генеза Психоорганический синдром Задержка психического