Программный комплекс

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Введение

Язык 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. Данные для тестирования

Автор

Название

Возр. группа

Темат.

группа

Отп. цена

Тираж

Месяц

вып.

Михеева Т.

Легкие горы

Д

Х

200

5000

01

Костина Н.Н.

Подводный мир

Д

Н

150

2500

02

Тарасов В.

Философские рассказы

Ю

Н

350

2000

02

Чайковская В.

Три лика русского искусства ХХ века.

В

И

500

1500

03

Верижникова Т.

Иван Билибин

В

И

450

1000

05

Рачеева Е.П.

Мастера французской живописи

В

И

550

1500

04

Хейнрих К.

Моне

В

И

400

1000

06

Фридман М.

Десять открытий в истории медицины

В

Н

450

1000

04

Цицерон

О пределах блага и зла.

В

Н

600

500

03

Пугачев Б.

Зеркало для слепого

В

Х

300

5000

04

Шаргунов С.

Книга без фотографий

В

Х

350

4000

10

Улицкая Л.

Первые и последние

В

Х

300

4500

08

Володин В.

Энциклопедия для детей. Том 11.

Ю

У

1000

1500

07

Аксенова М.

Энциклопедия для детей. Том 39.

Ю

У

1100

1500

09

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 [0]. S:= '1. `ЇЁб®Є Є­ЁЈ Ї® ЈагЇЇ '; Menu2 [0]. X:= 20; Menu2 [0]. Y:=5;

Menu2 [1]. S:= '2. `в®Ё®бвм вЁа ¦Ґ(c)'; Menu2 [1]. X:= 20; Menu2 [1]. Y:=6;

Menu2 [2]. S:= '3. ЋЎкҐл вЁа ¦Ґ© Ї® ЈагЇЇ '; Menu2 [2]. X:= 20; Menu2 [2]. Y:=7;

Menu2 [3]. S:= '4. ѓа дЁЄ Ё§Ґ­Ґ­Ёп ®ЎйҐЈ® вЁа ¦ '; Menu2 [3]. X:= 20; Menu2 [3]. Y:=8;

Menu2 [4]. S:= '5. ЉагЈ®ў п ¤Ё Ја (б®(r)⭮襭ЁҐ Є­ЁЈ, Ї® ⥠⨪Ґ)'; Menu2 [4]. X:= 20; Menu2 [4]. Y:=9;

Menu2 [5]. S:= '6. `в®"ЎЁЄ®ў п ¤Ё Ја (ўлЇгбЄ Є­ЁЈ, Ї® ⥠⨪Ґ)'; Menu2 [5]. X:= 20; Menu2 [5]. Y:=10;

Menu2 [6]. S:= ''л室 '; Menu2 [6]. X:= 20; Menu2 [6]. 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 [0]. S:= '1. `®§¤ ­ЁҐ д (c)" '; Menu1 [0]. X:= 20; Menu1 [0]. Y:= 5;

Menu1 [1]. S:= '2. «®Ў ў «Ґ­ЁҐ ¤ ­­ле'; Menu1 [1]. X:= 20; Menu1 [1]. Y:= 6;

Menu1 [2]. S:= '3. ђҐ¤ ЄвЁа®ў ­ЁҐ ¤ ­­ле'; Menu1 [2]. X:= 20; Menu1 [2]. Y:= 7;

Menu1 [3]. S:= '4. ‡ Їа®бл'; Menu1 [3]. X:= 20; Menu1 [3]. Y:= 8;

Menu1 [4]. S:= ' 'л室 '; Menu1 [4]. X:= 20; Menu1 [4]. 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 ('Для завершения нажмите < enter>');

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< MonEd[i] then Max: =MonEd[i];

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 ('Для завершения нажмите < enter>');

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 ('Для завершения нажмите < enter>');

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.

ПоказатьСвернуть
Заполнить форму текущей работой