Курсовая работа: Создание справочника Парфюмерный магазин при помощи программы Turbo Pascal
Название: Создание справочника Парфюмерный магазин при помощи программы Turbo Pascal Раздел: Рефераты по информатике Тип: курсовая работа | ||||||||||||||||||||||||||||||||||||
Содержание 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 – Схема последовательности обработки данных. Схема 1 – Общая схема Схема 2 – Разметка экрана Схема 3 – вывод разделов и подразделов Вверх Вниз
Схема 4 – Перемещение по меню
Enter F1 F3
Схема 5 – Выбор режима работы
нет
Да
Вход Вниз
Схема 6 - События по нажатию Enter
1 3 2
нет
Да
Да
нет
Схема 7 - Поиск
Да
Нет
Схема 8 - Помощь
Операции с товарами
Передвижение
PageDown PageUp
ESC
Схема 9 – Вывод товара на экран
Схема 10 – Вывод общего количества товаров
Схема 11 – Найти первый товар
Схема 12 – Добавить код товара в список
Да нет
Схема 13 – Поиск следующего товара
Нет
Да
Схема 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. |