Процедура/Функция
|
Параметры
|
Описание
|
Add
|
b:Integer (Общее кол-во элементов) p:TPElem(Вершина стека)
|
В стек добавляется элемент.
Входной параметр-вершина стека. Код программы представлен в Приложении 1.
Листинг 1
|
Del
|
p:TPElem(Вершина стека)
|
Входным параметром является
вершина стека, удаляется верхний элемент стека. Код программы представлен в
Приложении 1. Листинг 2.
|
Del1
|
p:TPElem(Вершина стека)
|
Входным параметром является
вершина стека, удаляются все элементы стека путем повторения процедуры Del.
Код программы представлен в Приложении 1. Листинг 5.
|
Edit
|
b:Integer (Общее кол-во элемен-тов) p:TPElem(Вершина стека)
|
Вводится номер элемента для
изменения, новые данные перезаписываются на место старых данных, входной
параметр вершина стека. Код программы представлен в Приложении 1. Листинг 6.
|
Vivod
|
b:Integer (Общее кол-во элемен-тов) p:TPElem(Вершина стека)
|
Выводится заданный элемент
стека. В процедуре цикл, проходит по всему стеку, если находит элемент с
заданным номером, выводит его. Код программы представлен в Приложении 1.
Листинг 4.
|
Printall
|
p:TPElem(Вершина стека)
|
Выводится стек, путем
прохождения по всем элементам от вершины, входным параметром является вершина
стека. Код программы представлен в Приложении 1. Листинг 3.
|
Help
|
p:TPElem(Вершина стека)
|
Процедура-справка, выводит
список для выбора действий, входным параметром является вершина стека. Код
программы представлен в Приложении 1. Листинг 12.
|
Pomog
|
k:Integer (Номер элемента) p:TPElem(Вершина стека)
|
Выводит элемент стека (Для
процедур one, two, three, four).Код программы представлен в Приложении 1. Листинг
7.
|
One
|
p:TPElem(Вершина стека)
|
В процедуре цикл, проходит
по всему стеку, если находит элемент, у которого дата покупки входит в 4
квартал прошлого года, то выводит элемент. Входной параметр - вершина стека.
Код программы представлен в Приложении 1. Листинг 8.
|
Two
|
p:TPElem(Вершина стека)
|
Выводит максимальную
стоимость покупок, сделанных в каждом из мест. Проходит по всему стеку и
записывает для каждого из мест стоимость в переменную, если стоимость больше
предыдущих, затем выводит место покупки, товар, цену и дату покупки. Входной
параметр - вершина стека. Код программы представлен в Приложении 1. Листинг
9.
|
Three
|
p:TPElem(Вершина стека)
|
Four
|
p:TPElem(Вершина стека)
|
Вывод общей стоимости покупок,
сделанных за заданный период в заданном месте, проходит по стеку, если дата
входит в указанный период и место покупки совпадает с указанным местом,
суммирует цены. Предлагает вывести товары, приобретенные за указанный период
в указанном месте покупки. Если ответ положительный, то проходит по стеку, и
если дата покупки входит в указанный период и место покупки совпадает с
указанным местом, то выводит номер записи, товар, место покупки, цену и дату
покупки. Входной параметр - вершина стека. Код программы представлен в
Приложении 1. Листинг 11.
|
Vibor
|
W:string(строка для ввода команды) p:TPElem(Вершина стека) b:Integer (Общее кол-во элемен-тов) k:Integer(счетчик
номера элементов)
|
Процедура предлагает
пользователю ввести команду. Как только пользователь вводит команду,
программа ищет эту программу и переходит на нужную процедуру. Код программы
представлен в Приложении 1. Листинг 12.
|
3. Описание алгоритмов
. Добавление элемента в стек.
В процедуре Add реализован
алгоритм добавления элемента в стек согласно блок-схеме на рисунке 1. В этой
процедуре выполняются следующие действия:
. Выделение памяти под элемент линейного списка.
. Ввод данных пользователем.
. Проверка на содержание в стеке элементов.
. Если стек содержит элементы, то создается ссылка на предыдущий элемент,
и вершиной стека становится текущий указатель. Если же стек не содержит
элементов, то вершиной стека становится текущий указатель, но не создается
ссылка на предыдущий элемент, т.к. это единственный элемент в стеке.
Рис.1. Добавление элемента в стек
Код программы представлен в Приложении 1 Листинг 1
. Удаление из стека.
В процедуре Del реализован
алгоритм удаления элемента из стека согласно блок-схеме на рисунке 2. В этой
процедуре выполняются следующие действия:
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверка на наличие элементов в стеке.
. Если в стеке есть элементы, то указателю стека присваивается предыдущая
запись (т.е. вершиной стека становится предыдущая запись), и освобождается
выделенная под вершину стека память (с помощью функции Dispose). Если же в стеке нет элементов, то программа выведет
сообщение, что стек пуст.
Рис. 2. Удаление элемента из стека
Код программы представлен в Приложении 1 Листинг 2.
. Вывод стека.
В процедуре Printall
реализован алгоритм вывода стека согласно блок-схеме на рисунке 3.
Рис. 3. Вывод стека
В этой процедуре выполняются следующие действия:
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Обнуляется счетчик номера элементов(j).
. Проверка на наличие элементов в стеке.
. Если в стеке есть элементы, то начинается цикл, пока указатель не будет
указывать на nil, выполняются действия:
. Увеличивается счетчик номера записей(j) на 1.
. Вывод номера записи (j).
. Вывод самой записи.
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
. Если в стеке нет элементов, то программа выведет запись, что стек пуст.
Код программы представлен в Приложении 1 Листинг 3.
. Вывод элемента стека.
В процедуре Print реализован
алгоритм вывода элемента стека согласно блок-схеме на рисунке 4. В этой
процедуре выполняются следующие действия:
. Программа запрашивает у пользователя номер записи, которую нужно
вывести.
. Пользователь вводит номер записи(j).
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверяется, есть ли в стеке запись с данным номером (не является ли j отрицательным числом, не превышает
ли j общее количество элементов, не пуст
ли стек).
. Если номер записи выходит за пределы существующих записей или в стеке
нет элементов, то программа выведет, что такого элемента не существует.
Если же номер записи указан корректно, запись существует и стек не пуст,
то программа продолжает свою работу.
. Счетчику номера элементов(i) присваивается значение 1.
. Пока указатель не будет указывать на nil или пока номер элемента меньше номера, указанного
пользователем будет происходить цикл:
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
. Счетчик номера элементов(i)
увеличивается на 1.
Как только найден элемент с нужным номером, то цикл прекращается.
. Выводится номер указанного элемента (j).
. Выводится сама запись.
Рис. 4 Вывод элемента стека.
Код программы представлен в Приложении 1 Листинг 4.
5. Удаление стека.
В процедуре Del1 реализован
алгоритм удаления стека согласно блок-схеме на рисунке 5. В этой процедуре
выполняются следующие действия:
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверка на наличие элементов в стеке.
. Если в стеке нет элементов, то программа выведет сообщение, что стек
пуст.
Если в стеке есть элементы, то начинается цикл, пока указатель не будет
указывать на nil, выполняются действия:
. Выполняется процедура Del(описана
выше).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
. Программа выводит сообщение о том, что стек пуст.
Рис. 5. Удаление стека
Код программы представлен в Приложении 1 Листинг 5.
. Редактирование элемента стека.
. Программа запрашивает у пользователя номер записи, которую нужно
изменить.
. Пользователь вводит номер записи(j).
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверяется, есть ли в стеке запись с данным номером (не является ли j отрицательным числом, не превышает
ли j общее количество элементов, не пуст
ли стек).
. Если номер записи выходит за пределы существующих записей или в стеке
нет элементов, то программа выведет, что такого элемента не существует.
. Если же номер записи указан корректно, запись существует и стек не
пуст, то программа продолжает свою работу.
.Программа выводит исходную запись с помощью процедуры Vivod (описана выше).
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Счетчику номера элементов(i) присваивается значение 1.
. Пока указатель не будет указывать на nil или пока номер элемента меньше номера, указанного
пользователем будет происходить цикл:
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
. Счетчик номера элементов(i)
увеличивается на 1.
Как только найден элемент с нужным номером, то цикл прекращается.
. Пользователь вводит новые данные, которые записываются на место старых.
Рис. 6. Редактирование элемента стека
Код программы представлен в Приложении 1 Листинг 6.
. Получить список мест покупки и наименований товаров, приобретенных в
четвертом квартале прошлого года.
В процедуре One реализован
алгоритм получения записей, с датой покупки, входящей в 4 квартал прошлого
года, согласно блок-схеме на рисунке 7. В этой процедуре выполняются следующие
действия:
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверка на наличие элементов в стеке.
. Если в стеке нет элементов, программа выводит сообщение о том, что стек
пуст.
Если в стеке есть элементы, программа продолжает свою работу.
. Программа присваивает переменным D1 и D2
даты начала и конца 4 квартала прошлого года.
. Обнуляется счетчик номеров элементов(k).
. Пока в стеке есть элементы, работает цикл:
. Счетчик номеров элементов(k) увеличивается на 1.
. Проверяется, входит ли дата покупки в данной записи в указанный
период (дата меньше или равна D1 и больше D2).
.Если дата не входит в указанный период, то программа продолжает свою
работу.
Если дата входит в указанный период, то запись выводится на экран с
помощью вспомогательной процедуры Pomog (Ссылка на программный код данной процедуры находится в Приложении 1
Листинг 7). Программа продолжает свою работу.
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
Рис.7. Список товаров, приобретенных в 4 квартале прошлого года
Код программы представлен в Приложении 1 Листинг 8.
. Найти максимальную стоимость покупок, сделанных по каждому из
встречающихся мест покупки.
В процедуре Two реализован
алгоритм нахождения записей с максимальной стоимостью покупок, сделанных по
каждому из встречающихся мест, согласно блок-схеме на рисунке 8. В этой
процедуре выполняются следующие действия:
. Обнуляются переменные для записи максимальных цен.
. Обнуляются записи, для сохранения номера записи.
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Обнуляется счетчик номеров элементов(k).
. Проверка на наличие элементов в стеке.
.Если в стеке нет элементов, программа выводит сообщение о том, что стек
пуст.
Если в стеке есть элементы, программа продолжает свою работу.
1. Пока в стеке есть элементы, работает
цикл.
1. Увеличивается счетчик номеров элементов(k) на 1.
. Программа проверяет, к какому из мест покупки принадлежит запись.
. Если цена покупки больше, чем хранящаяся в переменной максимальной
цены, то эта цена присваивается переменной максимума, а переменной номера
элемента максимальной цены присваивается номер данной записи. Далее программа
продолжает свою работу.
Если цена меньше, чем хранящаяся в переменной максимальной цены, то
программа продолжает свою работу.
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
. Программа выводит элементы с максимальной стоимостью покупки на экран с
помощью вспомогательной процедуры Pomog (Ссылка на программный код данной процедуры находится в Приложении 1
Листинг 7).
Рис.8 Список товаров максимальной стоимости, сделанных по каждому из мест
покупки.
Код программы представлен в Приложении 1 Листинг 9.
. Найти количество покупок за каждый квартал прошлого года.
В процедуре Three реализован
алгоритм нахождения количества покупок за каждый квартал прошлого года,
согласно блок-схеме на рисунке 9. В этой процедуре выполняются следующие
действия:
.Обнуляются переменные количества покупок.
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверка на наличие элементов в стеке.
. Если в стеке нет элементов, программа выводит сообщение о том, что стек
пуст.
Если в стеке есть элементы, программа продолжает свою работу.
.Переменным D1,D2,D3,D4,D5 присваиваются начала каждого
квартала прошлого года и начало первого квартала данного года.
. Пока в стеке есть элементы, работает цикл:
. Проверяется, какому кварталу прошлого года принадлежит дата покупки.
. Если найден нужный период, то переменная количества покупок данного
периода увеличивается на 1; Программа продолжает свою работу.
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
. Программа выводит информацию о том, сколько покупок сделано в каждом из
кварталов прошлого года и предлагает вывести записи, покупок которых совершены
в прошлом году.
Если пользователь ответил отрицательно, выполняется выход из процедуры.
. Программа выводит номер квартала.
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Обнуляется счетчик номеров элементов(k).
. Пока в стеке есть элементы, работает цикл:
. Счетчик номеров элементов(k) увеличивается на 1.
. Проверяется, входит ли дата покупки в данной записи в указанный период
(дата заданного квартала).
. Если дата не входит в указанный период, то программа продолжает свою
работу.
Если дата входит в указанный период, то запись выводится на экран с
помощью вспомогательной процедуры Pomog (Ссылка на программный код данной процедуры находится в Приложении 1
Листинг 7). Программа продолжает свою работу.
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
.Пункты с 9 по 12 повторяются для каждого из кварталов прошлого года.
Рис.9. Список товаров максимальной стоимости, сделанных по каждому из
мест покупки.
Код программы представлен в Приложении 1 Листинг 10.
. Определить общую стоимость покупок, сделанных за указанный период в
указанном месте.
В функции Four реализован
алгоритм нахождения общей стоимости покупок, сделанных за указанный период в
указанном месте, согласно блок-схеме на рисунке 10. В этой процедуре
выполняются следующие действия:
. Обнуляется переменная общей стоимости покупок.
. Пользователь указывает начало и конец периода(D1 и D2).
. Пользователь указывает место покупки(Mesto1).
. Указателю присваивается вершина стека (т.е. стек рассматривается с его
вершины).
. Проверка на наличие элементов в стеке.
. Если в стеке нет элементов, программа выводит сообщение о том, что стек
пуст.
Если в стеке есть элементы, программа продолжает свою работу.
. Пока в стеке есть элементы, работает цикл:
. Программа проверяет, входит ли дата покупки в указанный период и
совпадает ли место покупки с указанным.
. Если дата или местно не совпадают, то программа продолжает свою работу.
Если дата и место совпали с указанными, то в переменную общей стоимости
записывается цена из данной записи.
. Указателю стека присваивается предыдущая запись (т.е. вершиной стека
становится предыдущая запись).
Цикл заканчивает свою работу, когда в стеке больше нет элементов
(указатель равен nil).
. Программа присваивает функции значение переменной суммы.
Рис.10. Нахождение общей стоимости покупок, сделанных в указанном месте
за указанный период.
Код программы представлен в Приложении 1 Листинг 11.
. Реализация пользовательского интерфейса
Запускаем программу (Kursovaya31.exe), для получения списка команд нужно
ввести Help и нажать Enter. Как показано на рисунке 11.
Рис.
11. Интерфейс help
Если пользователь ввел Add,
то выполняется добавление элементов в стек как показано на рисунке 12.
Рис. 12. Процедура Add
Если пользователь ввел Delete,
то выполняется удаление верхнего элемента стека.
Если пользователь ввел Delete all, то
выполняется удаление всего стека, как показано на рисунке 13
Рис. 13. Процедура Del1
Если пользователь ввел Edit,
то выполняется изменение элемента стека как показано на рисунке 14
Рис. 14. Процедура Edit
Если пользователь ввел Print,
то выполняется Вывод заданного элемента стека как показано на рисунке 15
Рис. 15. Процедура Print
Если пользователь ввел Printall, то выполняется Вывод стека.
Если пользователь ввел Help,
то выполняется Вывод справки.
Если пользователь ввел One,
то выполняется вывод товаров, приобретенных в 4 квартале прошлого года, как
показано на рисунке 16
Рис.16. работа процедуры One
Если пользователь ввел Two,
то выполняется вывод максимальной стоимости покупок, сделанных в каждом из
мест, как показано на рисунке 17
Рис.17. работа процедуры Two
Если пользователь ввел Three,
то выполняется вывод количества покупок за каждый квартал прошлого года (y - вывод списка покупок), как
показано на рисунке 18
Рис.18. работа процедуры Three
Если пользователь ввел Four,
то выполняется вывод общей стоимости покупок, сделанных за заданный период в
заданном месте, как показано на рисунке 19
Рис.19. работа процедуры Four
Если пользователь ввел Exit,
то выполняется выход из программы.
После чего, выбрав интересующую нас команду, вводим соответствующее ей
значение в появившееся поле «Введите команду:» и далее следуем инструкциям.
В случае если при запуске программы вы увидели непонятные иероглифы:
Клик правой кнопкой > Свойства > Шрифт: LucidaConsole> ОК
Заключение
В результате выполнения курсовой работы была реализована программа для
обработки информации и приобретен опыт работы со стеком и динамическими
массивами. Для хранения данных в программном обеспечении используется - стек. В
программе реализованы следующие процедуры работы с данными: добавление,
удаление, редактирование записи. В процессе работы со стеком сформировался
навык производить операции на нем по определенным критериям, например поиск по
дате. Получены новые знания о некоторых возможностях языка программирования
Delphi, например, со встроенными функциями, такими как Length, StrToInt, StrToDate и т.д., а также с типами и
динамическими указателями.
программа delphi стек алгоритм
Список используемых источников
1. Блог Jakeroid’а: личный блог о программировании, компьютерах и саморазвитии. Очередь и
стек в Delphi 7, 2011. URL: http:/jakeroid.com/ochered-i-stek-v-delphi.html (дата обращения 26.12.2012)
. Бобровский С. Delphi 7. Учебный курс. - Санкт-Петербург: Питер, 2005. - 736 с.
. Дистанционная подготовка по информатике. Стек. Отличия
стека от списка. Основные операции со стеком, URL: http:/informatics.mccme.ru/moodle/mod/book/view.php?id=543
(дата обращения 26.12.2012)
. Культин Н.Б. Основы программирования в Delphi 7. - Санкт-Петербург: БХВ-Петербург,
2007. - 594 с.
. Язык паскаль. Программирование для начинающих. Процедуры,
обслуживающие стек, 2011. URL: http:/pas1.ru/steckdinamic (дата обращения 26.12.2012)
. Язык паскаль. Программирование для начинающих.
Стек(«»магазин»), 2010. URL: http:/pas1.ru/stack (дата обращения 26.12.2012)
Приложение 1
Листинг 1.Добавление элемента в стек
procedure Add(var b:Integer; p:TPElem);g:string;;(p);
Writeln('Введите
наименование товара:');
Readln(p^.Tovar);
Writeln('Введите
место покупки:');
Readln(p^.Mesto);
Writeln('Введите
цену товара:');
Readln(p^.Cena);
Writeln('Введите
дату покупки(дд.мм.гггг):');
Readln(g);(g,p^.Date_P);p<>nil then p^.prev:= top;:= p;
b:=b+1;
end;
Листинг 2.Удаление элемента из стека
procedure Del(p:TPElem);
Begin:= top;p <> nil then:= p^.prev;(p);:=b-1;else
writeln('Стек пуст');;
Листинг
3. Вывод стека
Printall(p:TPElem);j:Integer;:=top;:=0;p <> nil then;p<>nil
do(j);Length(IntToStr(j))=1 then write(j, ' ');Length(IntToStr(j))=2 then
write(j, ' ');Length(IntToStr(j))=3 then write(j, ' ');
Length(p^.Tovar)=17 then write(p^.Tovar, '
');Length(p^.Tovar)=12 then write(p^.Tovar, ' ');Length(p^.Tovar)=5 then
write(p^.Tovar, ' ');Length(p^.Tovar)=7 then write(p^.Tovar, '
');Length(p^.Tovar)=13 then write(p^.Tovar, ' ');
Length(p^.Mesto)=7 then write(p^.Mesto, '
');Length(p^.Mesto)=6 then write(p^.Mesto, ' ');Length(p^.Mesto)=8 then
write(p^.Mesto, ' ');Length(p^.Mesto)=3 then write(p^.Mesto, ' ');
Length(IntToStr(p^.Cena))=4 then write(p^.Cena, '
')write(p^.Cena, ' ');
(DateToStr(p^.Date_P));
:=p^.prev;else writeln('Стек пуст');;
Листинг
4.Вывод элемента стекаVivod(b:Integer;
p:TPElem);i,j:Integer;W='print' then
Writeln('Какую
запись вывести?');
Readln(j);;:=top;(j>0) and(j<=b) and (p<>nil)
then:=1;(p<>nil) or (i<j) do:=p^.prev;(i);i=j
then;Length(IntToStr(j))=1 then write(j, ' ');Length(IntToStr(j))=2 then
write(j, ' ');Length(IntToStr(j))=3 then write(j, ' ');
Length(p^.Tovar)=17 then write(p^.Tovar, '
');Length(p^.Tovar)=12 then write(p^.Tovar, ' ');Length(p^.Tovar)=5 then
write(p^.Tovar, ' ');Length(p^.Tovar)=7 then write(p^.Tovar, '
');Length(p^.Tovar)=13 then write(p^.Tovar, ' ');
Length(p^.Mesto)=7 then write(p^.Mesto, '
');Length(p^.Mesto)=6 then write(p^.Mesto, ' ');Length(p^.Mesto)=8 then
write(p^.Mesto, ' ');Length(p^.Mesto)=3 then write(p^.Mesto, ' ');
Length(IntToStr(p^.Cena))=4 then write(p^.Cena, '
')write(p^.Cena, ' ');
(DateToStr(p^.Date_P));;;else Writeln('нет такой записи');;
Листинг
5.Удаление стека Del1(p:TPElem);:=top;p<>nil thenp<>nil do;else
writeln('Стек пуст');;
Листинг
6. Редактирование элемента стека
Edit(b:Integer; p:TPElem);g:string;j:Integer;i:Integer;('Какой элемент редактировать??');(j);:=top;(j>0) and (j<=b)
and (p<>nil) then
Writeln('Исходная
запись:');
Vivod(b);:=top;:=1;(p<>nil) and (i<j)
do:=p^.prev;(i); (i=j) then
begin
writeln('введите
новое наименование товара:');
Readln(p^.Tovar);
writeln('Введите
новое место покупки:');
Readln(p^.Mesto);
writeln('Введите
новую цену товара:');
Readln(p^.Cena);
Writeln('Введите
новую дату покупки(дд.мм.гггг.):');
readln(g);(g,p^.Date_P);;;else Writeln('нет такой записи');;
Листинг
7.Вывод элемента стекаPomog(k:integer;
p:TPElem);
if Length(IntToStr(k))=1 then write(k, '
');Length(IntToStr(k))=2 then write(k, ' ');Length(IntToStr(k))=3 then write(k,
' ');
Length(p^.Tovar)=17 then write(p^.Tovar, '
');Length(p^.Tovar)=12 then write(p^.Tovar, ' ');Length(p^.Tovar)=5 then
write(p^.Tovar, ' ');Length(p^.Tovar)=7 then write(p^.Tovar, '
');Length(p^.Tovar)=13 then write(p^.Tovar, ' ');
Length(p^.Mesto)=7 then write(p^.Mesto, '
');Length(p^.Mesto)=6 then write(p^.Mesto, ' ');Length(p^.Mesto)=8 then
write(p^.Mesto, ' ');Length(p^.Mesto)=3 then write(p^.Mesto, ' ');
Length(IntToStr(p^.Cena))=4 then write(p^.Cena, '
')write(p^.Cena, ' ');
(DateToStr(p^.Date_P));;
Листинг
8.Задание
№2one(p:TPElem);k:Integer;D1,D2:TDateTime;Y,Mn,D:Word;
writeln;
Writeln('Список
товаров, приобретенных в 4 квартале прошлого года:');
p:=top;p=nil then Writeln('Стек пуст
')(Data,Y,Mn,D);:=EncodeDate(Y-1,10,01);:=EncodeDate(Y,01,01);:=0;;p<>nil
do(k);(p^.Date_P>D1) and (p^.Date_P<D2) then(k);;:=p^.prev;;;;
Листинг
9. Задание №3
procedure two(p:TPElem);j,n,n1,n2,n3,n4:Integer;m,m1,m2,m3,m4,k:Integer;two2(b:integer);:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=top;:=0;p<>nil
thenp<>nil do(j);(p^.Mesto='Связной') and (p^.Cena>n) then:=p^.Cena;:=j;;
(p^.Mesto='МВидео')
and (p^.Cena>n1) then:=p^.Cena;:=j;;
(p^.Mesto='Евросеть')
and (p^.Cena>n2) then:=p^.Cena;:=j;;
(p^.Mesto='МТС')
and (p^.Cena>n3) then:=p^.Cena;:=j;;
(p^.Mesto='Эксперт')
and (p^.Cena>n4) then:=p^.Cena;:=j;;
:=p^.prev;;else Writeln('Стек пуст');;mm1(k,j:integer);(p<>nil)
or (k<j) do:=p^.prev;(k);(k+1)=j then(k);;;;;('Максимальная стоимость покупки в каждом из
магазинов');
Tabl;(b);:=top;:=m;:=0;(k,j);:=top;:=m1;:=0;(k,j);:=top;:=m2;:=0;(k,j);:=top;:=m3;:=0;(k,j);:=top;:=m4;:=0;(k,j);;
Листинг
10. Задание №4
end;
Writeln('За
I квартал прошлого года продано ', s, ' товаров');
Writeln('За
II квартал прошлого года продано ', s1, ' товаров ');
Writeln('За
III квартал прошлого года продано ', s2, ' товаров ');
Writeln('За
IV квартал прошлого года продано ', s3, ' товаров ');
Writeln('Вывести
список товаров?(да-y/нет-n)'); Readln(otv);
otv:=AnsiLowerCase(otv);otv='y' then
Writeln('I квартал прошлого года:');
p:=top;:=0;p<>nil do(k);(p^.Date_P>D1) and
(p^.Date_P<D2) then Pomog(k);:=p^.prev;
end;
Writeln('II квартал прошлого года:');
p:=top;:=0;p<>nil do(k);(p^.Date_P>=D2) and
(p^.Date_P<D3) then Pomog(k);:=p^.prev;
end;
Writeln('III квартал прошлого года:');
p:=top;:=0;p<>nil do(k);(p^.Date_P>=D3) and
(p^.Date_P<D4) then Pomog(k);:=p^.prev;
end;
Writeln('IV квартал прошлого года:');
p:=top;:=0;p<>nil do(k);(p^.Date_P>=D4) and
(p^.Date_P<D5) then Pomog(k);:=p^.prev;;;;;
Листинг
11. Задание №5
four(p:TPElem):integer;D1,D2:TDateTime;,otv,g,g1:string;,k:Integer;:=0;('Укажите начало
периода(дд.мм.гггг):'); Readln(g);
TryStrToDate(g,D1);
Writeln('
Укажите конец периода(дд.мм.гггг):'); Readln(g1);
TryStrToDate(g1,D2);
Writeln('Укажите
место покупки:'); Readln(Mesto1);
p:=top;p=nil then Writeln('Стек пуст')beginp<>nil
do(p^.Date_P>D1) and (p^.Date_P<D2) and (p^.Mesto=Mesto1)
then:=q+p^.Cena;:=p^.prev;;:=q;;;
Листинг
12. Выбор дейстия
Vibor(W:string; p:TPElem;
b,k:Integer);:=AnsiLowerCase(W);(W='print') or (W='printall') or (W='help') or
(W='delete') or (W='delete all') or (W='edit') or (W='exit')(W='one') or
(W='two') or (W='three') or (W='four') or (W='add') thenW='print'
then(b);;W='printall' then;;W='help' then;;W='delete' then;;W='delete all'
then;;W='add' then(b);;W='edit' then(b);;W='exit' then:=1;;(W='one')
then;;(W='two') then;;(W='three') then;;(W='four') then
q:=four;
Writeln('Общая
стоимость покупок в указанном месте за указанное время равно', q, ' рублей');
end;
end else Writeln('Такой команды не существует');
end;