Программный комплекс
Turbo Pascal наглядно отражает методологию структурного программирования. Для управления текстовым режимом работы монитора и генератором звуковых сигналов, а также графическим режимом работы монитора в него входят стандартные модули (библиотеки констант, процедур и функций) CRT и Graph. С помощью этих библиотек можно организовывать полноценный (хотя и достаточно примитивный в сравнении… Читать ещё >
Программный комплекс (реферат, курсовая, диплом, контрольная)
Язык Turbo Pascal был разработан еще под операционную систему MS-DOS, с которой работали первые персональные компьютеры. Он является средой разработки одного из базовых языков программирования Pascal, созданного в 1970 году швейцарским ученым Н. Виртом. Широко применяемая в настоящее время разработчиками среда разработки Borland Delphi также основывается на языке Pascal. И, хотя автоматизация процесса программирования в этой среде достигла такого уровня, что для создания некоторых программ знания самого языка вовсе не требуется, тем не менее для осознанного создания качественных программ необходимо освоить и основы соответствующего языка.
Turbo Pascal наглядно отражает методологию структурного программирования. Для управления текстовым режимом работы монитора и генератором звуковых сигналов, а также графическим режимом работы монитора в него входят стандартные модули (библиотеки констант, процедур и функций) CRT и Graph. С помощью этих библиотек можно организовывать полноценный (хотя и достаточно примитивный в сравнении с современным уровнем графики) диалог человек-машина, рисование и вывод на экран таблиц, графиков, диаграмм и различных схематических рисунков. Turbo Pascal обеспечивает также наглядную работу с простейшими базами данных.
Использование данного средства разработки для решения поставленной задачи — разработки системы анализа выпускаемой продукции книжного издательства — удобно с точки зрения его простоты, дешевизны разрабатываемого продукта, удобства и наглядности работы системы.
В настоящее время вопросу автоматизации учета производства и реализации продукции посвящено немало работ и исследований. Разработаны специализированные программные комплексы для решения подобных задач. Но, как правило, они предназначены для использования на крупных производствах, поэтому весьма дорогостоящи и перегружены функциональными возможностями.
В ходе курсовой работы создается относительно простая система, освоение которой не требует специальных знаний и навыков работы на ПК.
Для выполнения поставленных в задании на курсовую работу задач необходимо провести их анализ и декомпозицию, а также изучить основные возможности и приемы работы на языке Turbo Pascal, различные типовые алгоритмы и подпрограммы, структуры данных, стандартные модули.
Результатом выполнения работы будет являться работоспособная и отлаженная программа, реализующая систему анализа выпускаемой продукции книжного издательства, и выполняющая все поставленные задачи.
1. Задание на разработку программного комплекса
Вариант 17
Разработать для книжного издательства информационную систему анализа выпускаемой продукции.
Информация, обрабатываемая в системе, должна храниться в текстовом или типизированном файлах.
Данные, которые должны быть отражены в системе: автор, название книги, возрастная группа (Д — детская литература, Ю — юношеская, В-взрослая), тематическая группа (У — учебная, Х — художественная, П — публицистика,
И — книги по искусству, Н — научно-популярная), отпускная цена, тираж, месяц выпуска.
В системе должны решаться следующие задачи:
1. Создание файла.
2. Дополнение файла.
3. Корректировка данных в файле.
4. Формирование ответов на запросы пользователя:
4.1. Для заданных возрастной и тематической групп вывести список книг с указанием автора и названия;
4.2. Для каждой тематической группы определить стоимость тиражей. Вывести названия групп с указанием стоимости в порядке возрастания стоимости тиража.
4.3. Определить общие объемы тиражей книг для всех возрастных групп;
4.4. Построить график изменения общего тиража книг по искусству в зависимости от месяца;
4.5. Построить круговую диаграмму, иллюстрирующую процентное соотношение книг каждой тематической группы за указанный месяц;
4.6. Построить столбиковую диаграмму количества выпущенных книг по каждой тематической группе в целом за год.
2. Функциональная структура приложения
Проанализируем работу книжного издательства с точки зрения задач программирования системы анализа выпускаемой продукции. Рассмотрим простейший случай, когда от системы требуется лишь учет определенных параметров по каждому наименованию продукции за целый финансовый год. Таким образом, в соответствии с заданием для каждого выпускаемого тиража книг нам необходимо записать в базу данных строку, содержащую следующие данные (текстовые или числовые константы):
1. Автор;
2. название книги;
3. возрастная группа (Д — детская литература, Ю — юношеская, В-взрослая);
4. тематическая группа (У — учебная, Х — художественная, П — публицистика, И — книги по искусству, Н — научно-популярная);
5. отпускная цена;
6. тираж;
7. месяц выпуска.
Система должна реализовывать задачи создания файла базы данных, дополнение его новыми строками, касающимися новых наименований продукции или следующего финансового года, а также возможность корректировки любой записи.
По запросам пользователя система должна формировать следующие отчеты:
1. Выводить список книг с указанием автора и названия для заданных возрастной и тематической групп;
2. Определить стоимость тиражей для каждой тематической группы и вывести названия групп с указанием стоимости в порядке возрастания стоимости тиража.
3. Для всех возрастных групп определить общие объемы тиражей книг;
4. График изменения общего тиража книг по искусству в зависимости от месяца;
5. Круговую диаграмму, иллюстрирующую процентное соотношение книг каждой тематической группы за указанный месяц;
6. Столбиковую диаграмму количества выпущенных книг по каждой тематической группе в целом за год.
Таким образом, поставленные задачи можно разделить на две группы. В первую группу входят задачи взаимодействия пользователя, вводящего данные для базы данных, с программой, которая должна правильно разместить и затем верно считать эти данные, проверив их с точки зрения точности ввода. Во вторую — обработка данных, содержащихся в базе, согласно запросам пользователя, и формирование одного из 6 различных по структуре отчетов. Каждый из отчетов использует все или часть данных БД, производя с ними определенные математические операции и выводя результат на экран в том или ином виде. Таким образом, мы уже можем представить себе общую структуру приложения и алгоритмы работы каждой из подпрограмм, формирующих отчеты.
3. Спецификация программного комплекса
программный приложение модуль комплекс
Название задачи: Информационная система анализа выпускаемой продукции для книжного издательства.
Название программы: info_sys.pas — программа для создания и корректировки базы данных объему выпуска печатной продукции, а также для формирования аналитических таблиц, графиков и диаграмм.
Система программирования: Turbo Pascal 7.1.
Требования к компьютеру: Требования, предъявляемые программой к оборудованию, минимальны. Возможна работа ПК под MS-DOS или Win3.1. Описание задачи.
1. Управление с клавиатуры переключением режима работы и типа выводимого отчета. Ввод с клавиатуры данных для заполнения БД.
2. Анализ вводимых данных на предмет обнаружения ошибки. Распределение данных в БД. Возможность корректировки данных.
3. Рисование таблиц, графиков и диаграмм с помощью модуля GRAPH.
4. Вычисление стоимости тиражей для каждой тематической группы по формуле:
(1)
Где:
PrEd[i] - стоимость тиражей по i-той тематической группе;
Edition [i, n] - объем тиража n-ой книги по i-той тематической группе;
Price[n] - отпускная цена книги.
и сортировка полученных данных в порядке возрастания.
5. Вычисление общих объемов тиражей для всех возрастных групп по формуле:
(2)
Где:
AgEd[i] - общий объем тиража по i-той возрастной группе (руб.);
Edition [i, n] - объем тиража n-ой книги по i-той возрастной группе;
6. Вычисление процентной доли книг каждой тематической группы за указанный месяц и за год:
Part (n) = (Edition (n)/SumEd) x100%,
где Part (n) — процентная доля книг n-ой тематической группы за указанный месяц в общем объеме тиража;
Edition (n) — тираж книг n-ой тематической группы за указанный месяц;
SumEd = Edition (1) +Edition (2)+ … + Edition (k) — общий объем тиража.
7. Обеспечение по запросу пользователя вывода необходимого отчета с подстановкой нужных значений параметров.
Управление режимами работы программы
Интерфейс «пользователь — компьютер» должен иметь дружественный вид и структуру, позволяющую легко ориентироваться в программе. Все диалоговые окна имеют соответствующие надписи.
При запуске программы на экране должен появляться входной текстовый интерфейс, где вводом одной из цифр (из приведенного на форме списка) запускается либо режим ввода или корректировки текстовых данных, либо вывод одного из шести отчетов.
Ввод текстовых данных производится в строку, добавление данных выполняется нажатием клавиши ввода, после чего добавляется следующая константа, предлагаемая к вводу в соответствующем сообщении окна. Неправильный ввод вызывает сообщение об ошибке в отдельном окне.
Графики и диаграммы занимают всю площадь экрана, предварительно очищаемого от иной информации. Различные поля в таблицах выделяются цветом; диаграммы также выводятся в цвете.
По окончании использования той или иной подпрограммы должно появляться сообщение, в котором пользователю предлагается выбрать: выйти из программы или вернуться к стартовому окну для продолжения работы в другом режиме.
Входные данные
1. Автор: Author — строковый тип (string) — Ф.И.О. автора книги;
2. Название книги: Name — строковый тип (string) — название книги;
3. Возрастная группа — символьная переменная (char);
4. Тематическая группа — символьная переменная (char);
5. Отпускная цена — вещественное число (real);
6. Тираж — целое число (integer);
7. Месяц выпуска — короткое целое число (byte).
Выходные данные
Номер записи n — целое число. Каждой позиции в базе данных ставится в соответствие свой порядковый номер; максимальное его значение соответствует числу строк в базе данных (общей таблице) на текущий момент времени.
Входные данные — автор, название, возрастная и тематическая группы, тираж, месяц выпуска — без каких-либо численных преобразований передаются на выход программы в табличной форме.
Также в программе рассчитываются дополнительные величины, с последующим выводом данных. Данные выводятся в табличном (PrEd) и графическом (все остальные) виде. Расчетные формулы приведены выше.
PrEd[i] - стоимость тиражей по i-той тематической группе (real);
AgEd[i] - общий объем тиража по i-той возрастной группе (integer);
Part[i] - процентная доля книг i-ой тематической группы в общем объеме тиража за месяц и за год (real);
Ошибки
Система выявляет следующие ошибки:
— Несоответствие вида вводимых чисел / знаков типу переменной;
— Невозможность связаться с файлом базы данных или изменить его содержимое;
— Некорректное имя создаваемого файла;
— Ошибка подключения к графическому режиму.
4. Структурная диаграмма программного комплекса
Структурная диаграмма программного комплекса
Структурная диаграмма программного комплекса изображена на рис. 2. Все ее элементы диаграммы так или иначе были описаны в предыдущих разделах работы. В целях решения поставленных задач программный комплекс разделен на основную программу и дополнительные программные модули. Основную часть управляющих задач, таких, как организация работы системы меню, выполняет основной модуль Info_sys. Работой с файлами БД занимается отдельный модуль Un_File, с помощью которого происходит запись и корректировка данных. Обработка запросов пользователя и графические операции выделены в модуль Un_Graph. Таким образом, всего программа состоит из 3 выделенных модулей, оформленных в виде внешних единиц.
Листинг программного кода (тексты каждого программного модуля, см. Приложение) содержат подробные комментарии на русском языке, поэтому здесь мы не приводим паспорта модулей. Изучив программный текст, можно без труда разобраться в работе программы, функциях модулей, номенклатуре входной, вводимой и выходной информации.
5. Блок-схемы алгоритмов ряда модулей
В программе используется ряд стандартных решений, связанных с построением графических изображений и использованием библиотек CRT и GRAPH. Описание и алгоритмы работы этих решений, оформленных в виде отдельных модулей, приведены в соответствующей литературе. Здесь мы опишем работу составных частей модулей управления (Info_Sys) и ввода данных (Un_File).
Схема адгоритма главного меню
Схема алгоритма модуля Un_File
Схема алгоритма процедуры NewFile
Схема алгоритма процедуры EditFile
6. Данные для тестирования программных модулей и программного комплекса в целом
Для тестирования программных модулей и комплекса в целом нам необходимо внести в базу данные о печатной продукции какого-либо издательства. На основе этой информации появится возможность проверить операции по составлению отчетов программой.
Данные записаны в таблице 2.
Таблица 2. Данные для тестирования
Автор | Название | Возр. группа | Темат. группа | Отп. цена | Тираж | Месяц вып. | |
Михеева Т. | Легкие горы | Д | Х | ||||
Костина Н.Н. | Подводный мир | Д | Н | ||||
Тарасов В. | Философские рассказы | Ю | Н | ||||
Чайковская В. | Три лика русского искусства ХХ века. | В | И | ||||
Верижникова Т. | Иван Билибин | В | И | ||||
Рачеева Е.П. | Мастера французской живописи | В | И | ||||
Хейнрих К. | Моне | В | И | ||||
Фридман М. | Десять открытий в истории медицины | В | Н | ||||
Цицерон | О пределах блага и зла. | В | Н | ||||
Пугачев Б. | Зеркало для слепого | В | Х | ||||
Шаргунов С. | Книга без фотографий | В | Х | ||||
Улицкая Л. | Первые и последние | В | Х | ||||
Володин В. | Энциклопедия для детей. Том 11. | Ю | У | ||||
Аксенова М. | Энциклопедия для детей. Том 39. | Ю | У | ||||
7. Инструкция для пользователя по работе с программным комплексом
1. Запустить программу Info_sys.exe. На экране появится информация о программе, затем — выведется меню, в котором с помощью клавиш «вверх» и «вниз» можно выбрать один из режимов работы: «Создание файла», «Добавление данных», «Редактирование данных» и «Запросы».
2. При выборе пункта меню «Создание файла» пользователь может создать новый файл базы данных. Необходимо ввести название файла, и последовательно вводить данные, следуя текстовым подсказкам системы.
3. При выборе пункта меню «Добавление данных» появляется возможность добавить новые данные в уже существующий файл. Необходимо ввести название (и при необходимости полный путь) существующего файла базы данных и далее вводить новые данные, следуя подсказкам системы.
4. При выборе пункта меню «Редактирование данных» появляется возможность редактировать данные в уже существующем файле. Необходимо ввести название (и при необходимости полный путь) существующего файла базы данных. После этого на экран выводится содержимое файла базы данных (в таблице, по 20 записей). Необходимо выбрать номер записи, которую следует изменить, после вводить новые данные, следуя подсказкам системы.
5. Пункт меню «Запросы» предоставляет доступ к подменю, включающему следующие пункты:
5.1 «Список книг по группам». После ввода имени файла базы данных выводит на экран список книг с указанием автора и названия для заданных возрастной и тематической групп.
5.2 «Стоимость тиражей». После ввода имени файла базы данных формирует и выводит на экран отчет по стоимости тиражей каждой тематической группы.
5.3 «Объемы тиражей по группам» После ввода имени файла базы данных формирует и выводит на экран отчет по объемам тиражей каждой возрастной группы.
5.4 «График изменения общего тиража». После ввода имени файла базы данных выводит на экран график изменения общего тиража книг по искусству в зависимости от месяца.
5.5 «Круговая диаграмма (соотношение книг, по тематике)». После ввода имени файла базы данных и месяца (цифрами) выводит на экран круговую диаграмму, отражающую процентное соотношение книг каждой тематической группы за указанный месяц.
5.6 «Столбиковая диаграмма (выпуск книг, по тематике)». После ввода имени файла базы данных выводит на экран столбиковую диаграмму, отражающую процентное соотношение книг каждой тематической группы за год.
6. При неверном наборе данных на каждом этапе выводится сообщение об ошибке.
12. При необходимости выйти в главное меню пользователь нажимает клавишу Esc. Аналогичным образом происходит выход из программы из главного окна.
Заключение
В настоящей работе была разработана система анализа выпускаемой продукции книжного издательства. Таким образом, была реализована цель курсового проектирования.
Информация о продукции хранится в текстовом файле.
Для ряда переменных выводятся таблицы, графики, круговая и столбиковая диаграммы.
Программа обладает устойчивостью к неверному вводу переменных — так, ввод буквенных символов в цифровые поля приводит к выдаче сообщений об ошибке.
Данная программа может служить хорошим примером использования возможностей языка Turbo Pascal на самом начальном уровне, без применения средств разработки, затрудняющих понимание структуры самого языка.
В дальнейшем программа может быть развита и усовершенствования с точки зрения удобства интерфейса и сложности решаемых задач.
Список используемых источников
1. Огнёва М. В. Кудрина Е.В. Turbo Pascal: первые шаги. Примеры и упражнения. — Саратов: Научная книга, 2008.
2. Культин Н. Б. Turbo Pascal в задачах и примерах. — Спб.: БХВ-Петербург, 2006.
3. Павловская Т. А. Паскаль. Программирование на языке высокого уровня: Учебник для вузов. — СПб.:Питер, 2007.
4. Федоренко Ю. Алгоритмы и программы на Turbo Pascal. Учебный курс. — СПб: Питер, 2001.
5. http://www.pascal.helpov.net/
6. http://bpascal.ru/res/index.php
7. http://delphid.dax.ru/
8. http://fmi.asf.ru/Library/Book/LabInf1/Index.html
9. www.informika.ru
10. www.citforum.ru
Приложение
Исходные тексты программных модулей
Program Info_books;
Uses CRT, Un_file, Un_Graph;
Const MaxMenuItem = 7;
{Var Ret: Byte;}
Type TMenu = record
X, Y: Byte;
S: String[55];
End;
Type MasMenu = Array [0.MaxMenuItem] Of TMenu;
Var Menu1, Menu2: MasMenu;
Run: Boolean; {ўлЎа ЇгЄв Ґо}
Sel, Ret, fl: Byte;
TC, TB: Byte; {color}
Procedure DrawMenu (Menu: MasMenu; MenuItem: Byte);
Var I: Byte;
Begin
For I:= 0 To MenuItem Do
Begin
GotoXY (Menu[I]. X, Menu[I]. Y);
Write (Menu[I]. S);
End;
End;
Procedure Select (Menu: MasMenu; I: Byte);
Begin
TextBackground (TC); TextColor (TB);
GotoXY (Menu[I]. X, Menu[I]. Y);
Write (Menu[I]. S);
TextBackground (TB); TextColor (TC);
End;
Procedure DeSelect (Menu: MasMenu; I: Byte);
Begin
TextBackground (TB); TextColor (TC);
GotoXY (Menu[I]. X, Menu[I]. Y);
Write (Menu[I]. S);
TextBackground (TB); TextColor (TC);
End;
Function MainMenu (Menu_F: MasMenu; Items, R_Select: Byte):Byte;
Begin
TextBackground (Blue);
TextColor (LightGreen);
ClrScr;
TC:= TextAttr mod 16;
TB:= TextAttr div 16;
DrawMenu (Menu_F, Items);
Sel:= R_Select;
Select (Menu_F, Sel);
Run:= False;
While Not Run Do
Begin
Case ReadKey Of
#13: Run:= True;
#27: Begin
Run:= True;
Sel:= Items;
End;
#0: Case ReadKey Of
#72: Begin
DeSelect (Menu_F, Sel);
If Sel = 0 Then
Sel:= Items
Else Sel:= Sel — 1;
Select (Menu_F, Sel);
End;
#80: Begin
DeSelect (Menu_F, Sel);
If Sel = Items Then
Sel:= 0
Else Sel:= Sel + 1;
Select (Menu_F, Sel);
End;
End;
End;
End;
MainMenu:= Sel;
TextBackground (TB);
TextColor (TC);
ClrScr;
End;
Procedure SecondMenu;
Begin
clrscr;
Menu2. S:= '1. `ЇЁб®Є ЄЁЈ Ї® ЈагЇЇ '; Menu2. X:= 20; Menu2. Y:=5;
Menu2. S:= '2. `в®Ё®бвм вЁа ¦Ґ(c)'; Menu2. X:= 20; Menu2. Y:=6;
Menu2. S:= '3. ЋЎкҐл вЁа ¦Ґ© Ї® ЈагЇЇ '; Menu2. X:= 20; Menu2. Y:=7;
Menu2. S:= '4. ѓа дЁЄ Ё§ҐҐЁп ®ЎйҐЈ® вЁа ¦ '; Menu2. X:= 20; Menu2. Y:=8;
Menu2. S:= '5. ЉагЈ®ў п ¤Ё Ја (б®(r)в®иҐЁҐ ЄЁЈ, Ї® ⥠⨪Ґ)'; Menu2. X:= 20; Menu2. Y:=9;
Menu2. S:= '6. `в®"ЎЁЄ®ў п ¤Ё Ја (ўлЇгбЄ ЄЁЈ, Ї® ⥠⨪Ґ)'; Menu2. X:= 20; Menu2. Y:=10;
Menu2. S:= '‚л室 '; Menu2. X:= 20; Menu2. Y:=11;
Ret:= 0;
Repeat
Ret:=MainMenu (Menu2,6, Ret);
Case Ret Of
0: Begin
FindAgeTheme;
End;
1: Begin
PriceEditions;
End;
2: Begin
AgeEditions;
End;
3: Begin
GraphArtEditions;
End;
4: Begin
CircleDiagram;
End;
5: Begin
StolbDiagram;
End;
Else Begin
End;
End; {case Ret}
Until Ret = 6;
TextBackground (Black);
TextColor (LightGray);
ClrScr;
End;
Procedure FirstMenu;
Begin
clrscr;
TextBackground (Blue);
TextColor (LightGreen);
Menu1. S:= '1. `®§¤ ЁҐ д (c)" '; Menu1. X:= 20; Menu1. Y:= 5;
Menu1. S:= '2. «®Ў ў «ҐЁҐ ¤ ле'; Menu1. X:= 20; Menu1. Y:= 6;
Menu1. S:= '3. ђҐ¤ ЄвЁа®ў ЁҐ ¤ ле'; Menu1. X:= 20; Menu1. Y:= 7;
Menu1. S:= '4. ‡ Їа®бл'; Menu1. X:= 20; Menu1. Y:= 8;
Menu1. S:= ' ‚л室 '; Menu1. X:= 20; Menu1. Y:= 9;
Ret:= 0;
Repeat
Ret:=MainMenu (Menu1,4, Ret);
Case Ret Of
0: Begin
NewFile;
End;
1: Begin
AddFile;
End;
2: Begin
EditFile;
End;
3: Begin
SecondMenu;
End;
Else Begin
Ret:=4;
End;
End; {case Ret}
Until Ret = 4;
End;
Begin
Presentation;
FirstMenu;
End.
Unit Un_File;
Interface
uses Crt, Graph;
type
TBook=Record
Author:string[20];
Name:string[25];
Age:char;
Theme:char;
Price:real;
Edition:integer;
Month: Byte;
End;
Symbol=set of char;
PrArr=Array [1.5] of real;
EdArr=Array [1.5] of integer;
MonArr=Array [1.12] of integer;
ThArr=Array [1.5] of string[20];
Procedure NewFile;
Procedure AddFile;
Procedure EditFile;
Procedure InputBook (var InpBook: TBook);
Procedure Presentation;
Implementation
Var
Book:TBook; {Переменная пользовательского типа}
f, f2: file of TBook;
k, n: Byte;
s1: Boolean;
FileName:string[10];
ch:char;
S_Age, S_Theme: Symbol;
ThMas: ThArr;
Procedure Presentation;
Begin
clrScr;
TextBackground (Blue);
TextColor (LightGreen);
GotoXY (35,5);
Writeln ('Программа');
GotoXY (20,6);
Writeln ('Информационная система анализа выпуска продукции ');
GotoXY (30,7);
Writeln ('книжного издательства');
{Writeln;}
GotoXY (20,9);
Writeln ('Для продолжения работы нажмите любую клавишу');
Readln;
End;
{Процедура ввода записи}
Procedure InputBook (var InpBook: TBook);
var
i, fl, m, n: integer;
ch:char;
Begin
with InpBook do
Begin
Writeln ('Введите данные');
Write ('Автор: ');
Readln (Author);
Write ('Название: ');
Readln (Name);
Writeln ('Возрастная группа (Д-детская, Ю-юношеская, В-взрослая): ');
Readln (ch);
While not (ch in S_Age) do
Begin
write ('Ошибка при вводе группы. Повторите ввод. ');
Readln (ch);
End;
Age:=ch;
Write ('Тематическая группа: ');
Write ('У-учебная, Х-художественная, П-публицистика, И-искусство, Н-научная ');
Readln (ch);
While not (ch in S_Theme) do
Begin
write ('Ошибка при вводе группы. Повторите ввод. ');
Readln (ch);
End;
Theme:=ch;
Write ('Отпускная цена: ');
Readln (Price);
Write ('Тираж: ');
Readln (Edition);
Write ('Месяц выпуска (цифрами): ');
Readln (m);
While (m<0) or (m>13) do
Begin
writeln ('Неправильно введен месяц. Повторите ввод.');
Readln (m);
End;
Month:=m;
End;
End;
{Процедура создания нового файла}
Procedure NewFile;
var
i, fl, m, n: integer;
ch:char;
Begin
Clrscr;
Writeln ('Создание файла');
Writeln ('Введите имя создаваемого файла');
Readln (FileName);
Assign (f, FileName);
{$I-}
Rewrite (f);
{$I+}
if IOResult=0 then
Begin
fl:=1;
while fl=1 do
Begin
InputBook (Book);
Write (f, book);
Writeln ('Продолжить ввод? 1-Да, 0-Нет');
Readln (fl);
clrscr;
End;
close (f);
End
Else
Begin
writeln ('Ошибка при работе с файлом');
readln;
End;
End;
{Процедура дополнения файла}
Procedure AddFile;
var
i, fl, m: integer;
ch:char;
Begin
Clrscr;
Writeln ('Дополнение файла');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
Seek (f, FileSize (f));
fl:=1;
while fl=1 do
Begin
InputBook (Book);
Write (f, book);
Writeln ('Продолжить ввод? 1-Да, 0-Нет');
Readln (fl);
clrscr;
End;
close (f);
End
else
Begin
writeln ('Файл не найден');
readln;
end;
End;
Procedure EditFile;
var
i, fl, num, k, m: integer;
ch:char;
Begin
Clrscr;
Writeln ('Вывод файла');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
fl:=1;
while fl=1 do
Begin
seek (f, 0);
i:=1;
writeln ('|-|-|-|-|-|-|-|-|');
writeln ('| № | Автор | Название |Возр.|Тем.| Отп. |Тираж|Месяц|');
writeln ('| | | |гр. |гр. | цена | |вып. |');
writeln ('|-|-|-|-|-|-|-|-|');
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
if ((i mod 20)<>1) or (i<20) then
begin
write ('|', i:3,'|', author:15,'|', name:20,'| ', Age, ' | ');
writeln (Theme, ' |', Price:8:2,'|', Edition:5,'| ', Month:2,' |');
end
else readln;
end;
i:=i+1;
end;
writeln ('|-|-|-|-|-|-|-|-|');
writeln;
k:=0;
while k=0 do
begin
write ('Введите номер записи, которую надо исправить: ');
readln (num);
while num>i do
begin
writeln ('Записи с таким номером нет. Общее число записей n=', i);
write ('Повторите ввод. ');
Readln (num);
end;
seek (f, num-1); {Поиск записи с указ номером (нумерация записей с 0)}
read (f, book);
write ('Исправляемая запись: ');
with Book do
Begin
writeln ('№ ', num:3,' Автор: ', author, ' Название ', name);
end;
write ('Исправить — 1, выбрать другую запись — 0 ');
readln (k);
end;
seek (f, filepos (f) — 1); {возвращение к изменяемой записи}
clrscr;
InputBook (book);
Write (f, book);
Writeln ('Изменить еще одну запись 1-Да, 0-Нет');
Readln (fl);
End;
close (f);
End
else
begin
writeln ('Файл не найден');
readln;
end;
End;
Begin
S_Age:=['Д', 'Ю', 'В'];
S_Theme:=['У', 'Х', 'П', 'И', 'Н'];
End.
Unit Un_Graph;
Interface
uses Crt, Graph;
type
TBook=Record
Author:string[20];
Name:string[25];
Age:char;
Theme:char;
Price:real;
Edition:integer;
Month: Byte;
End;
Symbol=set of char;
PrArr=Array [1.5] of real;
EdArr=Array [1.5] of integer;
MonArr=Array [1.12] of integer;
ThArr=Array [1.5] of string[20];
Procedure PriceEditions;
Procedure AgeEditions;
Procedure GraphArtEditions;
Procedure CircleDiagram;
Function RealToStr (r:real; n, m: integer):string;
Procedure StolbDiagram;
Procedure FindAgeTheme;
Implementation
Var
Book:TBook; {Переменная пользовательского типа}
f:file of TBook;
k, n: Byte;
s1: Boolean;
FileName:string[10];
ch:char;
S_Age, S_Theme: Symbol;
ThMas: ThArr;
{Процедура вывода стоимости тиражей по группам}
Procedure PriceEditions;
var
PrEd: PrArr;
i, j: integer;
MaxPr:real;
Str:string[20];
Begin
Clrscr;
Writeln ('Стоимость тиражей по группам');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
i:=1;
writeln;
Writeln ('Стоимость тиражей по группам');
writeln;
writeln ('|-|-|');
writeln ('| Тематическая | Стоимость,|');
writeln ('| группа | тыс. руб. |');
writeln ('|-|-|');
For i:=1 to 5 do
PrEd[i]: =0;
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
if Theme='У' then
PrEd[1]: =PrEd[1]+Price*Edition/1000;
if Theme='Х' then
PrEd[2]: =PrEd[2]+Price*Edition/1000;
if Theme='П' then
PrEd[3]: =PrEd[3]+Price*Edition/1000;
if Theme='И' then
PrEd[4]: =PrEd[4]+Price*Edition/1000;
if Theme='Н' then
PrEd[5]: =PrEd[5]+Price*Edition/1000;
end;
end;
close (f);
For i:=1 to 5 do
Begin
For j:=4 downto 1 do
if PrEd[j]>PrEd [j+1] then
Begin
MaxPr:=PrEd[j];
PrEd[j]:=PrEd [j+1];
PrEd [j+1]: =MaxPr;
Str:=ThMas[j];
ThMas[j]:=ThMas [j+1];
ThMas [j+1]: =Str;
End;
End;
For i:=1 to 5 do
writeln ('|', ThMas[i]: 20,'| ', PrEd[i]: 7:2,' |');
writeln ('|-|-|');
readln;
End
else writeln ('Файл не найден');
End;
{Процедура определения объема тиражей по возрастным группам}
Procedure AgeEditions;
var
AgEd: EdArr;
AgMas: ThArr;
i, j: integer;
Begin
Clrscr;
Writeln ('Общие объемы тиражей по возрастным группам');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
i:=1;
writeln;
Writeln ('Общие объемы тиражей');
writeln;
writeln ('|-|-|');
writeln ('| Возрастная | Общий объем |');
writeln ('| группа | тиражей |');
writeln ('|-|-|');
AgMas[1]: ='Детская';
AgMas[2]:='Юношеская';
AgMas[3]:='Взрослая';
For i:=1 to 3 do
AgEd[i]: =0;
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
if Age='Д' then
AgEd[1]: =AgEd[1]+Edition;
if Age='Ю' then
AgEd[2]: =AgEd[2]+Edition;
if Age='В' then
AgEd[3]: =AgEd[3]+Edition;
end;
end;
close (f);
For i:=1 to 3 do
writeln ('|', AgMas[i]: 15,'| ', AgEd[i]: 7,' |');
writeln ('|-|-|');
readln;
End
else writeln ('Файл не найден');
End;
{Процедуры построения графика изменения
тиражей книг по искусству по месяцам}
Procedure GraphArtEditions;
var
MonEd: MonArr;
i, j, x0, y0, px, py: integer;
grDriver:integer;
grMode:integer;
grPath:string;
StX, StY: String[10];
ErrCode:integer;
Step, Max, Min, GradX, GradY, mx, x, y, x1, y1: real;
Flag: Boolean;
Begin
Clrscr;
Writeln ('График изменения общего тиража книг по искусству по месяцам');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
i:=1;
For i:=1 to 12 do
MonEd[i]: =0;
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
for i:=1 to 12 do
if Month=i then
MonEd[i]: =MonEd[i]+Edition;
end;
end;
close (f);
For i:=1 to 12 do
write ('|', i:5);
writeln ('|');
For i:=1 to 12 do
write ('|', MonEd[i]: 5);
writeln ('|');
readln;
clrscr;
grDriver:=VGA;
grMode:=VGAHi;
grPath:='tpbgi';
InitGraph (grDriver, grMode, grPath);
ErrCode:=GraphResult;
if ErrCode <> grOK then
begin
writeln ('Ошибка инициализации графического режима.');
writeln ('Для завершения нажмите ');
readln;
Halt (1);
end;
x0:=50;
y0:=400;
{координатные оси}
line (10, y0,600, y0);
line (x0,10, x0,470);
{Построение графика}
Step:=550/(GetMaxY-40);
Max:=MonEd[1];
Min:=MonEd[1];
For i:=2 to 12 do
Begin
If Max
If Min>MonEd[i] then Min:=MonEd[i];
End;
Min:=-5;
Max:=Max+5;
GradX:=GetMaxX/20;
GradY:=GetMaxY/(Max-Min);
{Coord (-2,15, Min, Max);}
Flag:=True;
mx:=60;
For i:=1 to 12 do
Begin
px:=Round (GradX*(mx-60));
py:=Round (GradY*(Max-MonEd[i]));
Str ((MonEd[i]), StY);
OuttextXY (30, py, StY);
Str (i, StX);
OuttextXY (px+60,410, StX);
mx:=mx+Step;
End;
mx:=60;
For i:=1 to 12 do
Begin
px:=Round (GradX*(mx-60));
py:=Round (GradY*(Max-MonEd[i]));
If Flag Then
MoveTo ((px+60), py);
LineTo ((px+60), py);
Flag:=false;
mx:=mx+step;
End;
readln;
CloseGraph;
End
else
Begin
writeln ('Файл не найден');
readln;
End;
End;
{Процедура построения круговой диаграммы}
Procedure CircleDiagram;
var
Ed: EdArr;
Part: PrArr;
{ThMas: ThArr;}
i, j, mon: integer;
sum:real;
a1, a2: integer;
x, y: integer;
St:string;
grDriver:integer;
grMode:integer;
grPath:string;
ErrCode:integer;
Begin
Clrscr;
Writeln ('Построение круговой диаграммы: ');
Writeln (' «Процентное соотношение книг по тематическим группам за месяц» ');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Writeln ('Введите месяц (цифрами)');
Readln (Mon);
for i:=1 to 5 do
Ed[i]: =0;
i:=1;
sum:=0;
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
if Month=Mon then
Begin
if Theme='У' then
Ed[1]: =Ed[1]+Edition;
if Theme='Х' then
Ed[2]: =Ed[2]+Edition;
if Theme='П' then
Ed[3]: =Ed[3]+Edition;
if Theme='И' then
Ed[4]: =Ed[4]+Edition;
if Theme='Н' then
Ed[5]: =Ed[5]+Edition;
sum:=sum+Edition;
end;
end;
end;
close (f);
readln;
clrscr;
grDriver:=VGA;
grMode:=VGAHi;
grPath:='tpbgi';
InitGraph (grDriver, grMode, grPath);
ErrCode:=GraphResult;
if ErrCode <> grOK then
begin
writeln ('Ошибка инициализации графического режима.');
writeln ('Для завершения нажмите ');
readln;
Halt (1);
end;
{Вычислим долю каждой категории в общей сумме}
for i:=1 to 5 do
Part[i]: =Ed[i]/sum*100;
{Строим диаграмму}
a1:=0;
x:=350;
y:=100;
for i:=1 to 5 do
Begin
{Сектор}
a2:=a1+Round (3.6*Part[i]);
if a2>360 then
a2:=360;
SetFillstyle (SolidFill, i);
PieSlice (200,200, a1, a2,100);
a1:=a2; {Следующий сектор}
Bar (x, y, x+30, y+10);
Rectangle (x, y, x+30, y+10);
Str (Part[i]: 7:2, st);
OutTextXY (x+50, y, ThMas[i]+' - '+st+' % ');
y:=y+20;
end;
readln;
CloseGraph;
End
else
Begin
writeln ('Файл не найден');
readln;
End;
End;
{Столбиковая диаграмма}
Function RealToStr (r:real; n, m: integer):string;
var st: string;
Begin
Str (r:n:m, st);
RealToStr:=st;
end;
Procedure StolbDiagram;
var
Ed, Hth: EdArr;
Part: PrArr;
i, j, m: integer;
sum:real;
a1, a2: integer;
x, y: integer;
St:string;
grDriver:integer;
grMode:integer;
grPath:string;
ErrCode:integer;
Begin
Clrscr;
Writeln ('Построение столбиковой диаграммы: ');
Writeln (' «Количество выпущенных книг по тематическим группам за год» ');
Writeln ('Введите имя файла с данными');
Readln (FileName);
for i:=1 to 5 do
Ed[i]: =0;
i:=1;
sum:=0;
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
if Theme='У' then
Ed[1]: =Ed[1]+Edition;
if Theme='Х' then
Ed[2]: =Ed[2]+Edition;
if Theme='П' then
Ed[3]: =Ed[3]+Edition;
if Theme='И' then
Ed[4]: =Ed[4]+Edition;
if Theme='Н' then
Ed[5]: =Ed[5]+Edition;
sum:=sum+Edition;
end;
end;
close (f);
readln;
clrscr;
grDriver:=VGA;
grMode:=VGAHi;
grPath:='tpbgi';
InitGraph (grDriver, grMode, grPath);
ErrCode:=GraphResult;
if ErrCode <> grOK then
begin
writeln ('Ошибка инициализации графического режима.');
writeln ('Для завершения нажмите ');
readln;
Halt (1);
end;
{Вычислим долю каждой категории в общей сумме}
for i:=1 to 5 do
Part[i]: =Ed[i]/sum*100;
{Определим индекс максимального тиража}
{и вычислим высоту столбиков диаграммы}
M:=1;
For i:=2 to 5 do
if Ed[i]>Ed[m] then m:=i;
{Максимальному тиражу соответствует
столбик высотой 200 пикселей
Вычислим высоту остальных столбиков}
for i:=5 downto 1 do
Hth[i]: =Round ((200/Ed[m])*Ed[i]);
{Строим диаграмму}
OutTextXY (40,50,'Выпуск книг по тематическим группам за год');
Rectangle (40,80,170,310);
x:=50;
y:=300;
for i:=1 to 5 do
Begin
SetFillstyle (SolidFill, i);
Bar (x, y, x+10, y-Hth[i]);
x:=x+20;
end;
x:=50;
for i:=1 to 5 do
Begin
SetFillstyle (SolidFill, i);
OutTextXY (x, y-Hth[i] - 10, RealToStr (Part[i], 5,2)+' % ');
x:=x+20;
end;
x:=200;
y:=100;
for i:=1 to 5 do
Begin
SetFillstyle (SolidFill, i);
Bar (x, y, x+20, y+10);
OutTextXY (x+25, y, ThMas[i]);
y:=y+20;
end;
readln;
CloseGraph;
End
else
Begin
writeln ('Файл не найден');
readln;
End;
End;
{Список книг по возрастной и тематической группам}
Procedure FindAgeTheme;
var a, t: char;
i, fl: integer;
ch:char;
Begin
Clrscr;
Writeln ('Список книг по возрастной и тематической группам');
Writeln ('Введите имя файла с данными');
Readln (FileName);
Assign (f, FileName);
{$I-}
Reset (f);
{$I+}
if IOResult=0 then
Begin
Writeln ('Выберите возрастную группу (Д-детская, Ю-юношеская, В-взрослая): ');
Readln (a);
While not (a in S_Age) do
Begin
writeln ('Ошибка при вводе группы. Повторите ввод.');
Readln (a);
End;
Writeln ('Выберите тематическую группу: ');
Write ('У-учебная, Х-художественная, П-публицистика, И-искусство, Н-научная ');
Readln (t);
While not (t in S_Theme) do
Begin
writeln ('Ошибка при вводе группы. Повторите ввод.');
Readln (t);
End;
i:=0;
writeln;
writeln ('Список книг по возрастной группе «', a, '»; тематической группе: «', t, '» ');
writeln;
writeln ('|-|-|-|-|-|');
writeln ('| № | Автор | Название |Возр.|Тем.|');
writeln ('| | | |гр. |гр. |');
writeln ('|-|-|-|-|-|');
while not eof (f) do
Begin
read (f, book);
with Book do
Begin
if (a=Age) and (t=Theme) then
begin
writeln ('|', i:3,'|', author:15,'|', name:20,'| ', Age, ' | ', Theme, ' |');
i:=i+1;
end;
end;
end;
writeln ('|-|-|-|-|-|');
if i=0 then
writeln ('По запросу записей не найдено');
readln;
close (f);
end
else
Begin
writeln ('Файл не найден');
readln;
End;
End;
Begin
S_Age:=['Д', 'Ю', 'В'];
S_Theme:=['У', 'Х', 'П', 'И', 'Н'];
ThMas[1]:='Учебная';
ThMas[2]:='Художественная';
ThMas[3]:='Публицистика';
ThMas[4]:='Искусство';
ThMas[5]:='Научно-популярная';
End.