Написание программы для удаления элементов и очистки внешних таблиц

РЕФЕРАТ



Пояснительная записка: 43c, 6 рис, 28 табл, 3 источника, 4 приложения.

Целью создания курсовой работы является разработка программы, которая выполняет удаление элементов внешних таблиц, а также очистку файлов, вывод таблиц на экран.

Входными данными являются: таблица различной структуры и размера в файле. Выходными данными является файл с данными, либо полностью очищенный файл. Так же выводится текстовый файл с информацией об внешних таблицах. 


СОДЕРЖАНИЕ



Введение

1 Постановка задачи

1.1 Цель разработки

1.2 Функциональные требования 

2. Методы и алгоритмы

3 Выбор языка программирования

4 Описание программного продукта

4.1 Входные данные

4.2 Выходные данные

4.3 Схема информационных потоков

4.4 Метод решения

4.5 Функционально – логическая схема

5 Комплект поставки и инсталляция

5.1 Комплект поставки

5.2 Порядок инсталляции

5.3 Запуск программы

6 Тестирование программного продукта

Выводы

Перечень использованных источников

Приложение А Техническое задание 

Приложение Б Руководство пользователя 

Приложение В Экранные формы 

Приложение Г Листинг программы


ВВЕДЕНИЕ



Внешние таблицы – таблицы, хранящиеся в файлах. Как правило, такие файлы велики, и для операций над ними, в частности удаление или добавление элементов, требуется большой объем оперативной памяти, поэтому для экономии памяти используются дополнительные или временные файлы, которые после произведения операций над ними переименовываются или удаляются.

Внешние таблицы – это таблицы любой структуры. Для работы с ними необходимо определить количество и тип полей (символьный или строковый). Примером внешних таблиц могут быть различные прайс-листы, информация об абонентах кабельного телевидения, телефонный справочник и т.д. Внешние таблицы активно используются в различных базах данных.




ПОСТАНОВКА ЗАДАЧИ



		Цель разработки



Цель курсового проекта – написание программы, которая загружала бы из файлов таблицы различной структуры и объема, имела понятный графический интерфейс, определяла тип полей (строковый или символьный), а также выводила данную таблицу на экран. Если файл велик, должен быть предусмотрен вертикальный скроллинг со сдвигом по одному элементу. Программный продукт предусматривает выполнение операций удаления и очистки внешних таблиц. Также должна быть разработана система помощи пользователю (информация о внешних таблицах, об использовании программы, а также краткие сведения об авторе).



		Функциональные требования

	

	Исходные данные хранятся в файлах. Это очень удобно. Таким способом можно загружать нужную информацию частично, что и требуется осуществить в программе. Очень удобно менять информацию, хранящуюся в файлах.


2 МЕТОДЫ И АЛГОРИТМЫ



Внешние таблицы могут быть очень велики, поэтому для работы с ними принципиально неправильно использовать только оперативную память, необходимы различные дополнительные (вспомогательные) структуры, например файлы. Приведем пример удаления элемента внешних таблиц по порядковому номеру и интервалу. Необходимо удалить с пятого по двенадцатый элемент. Вначале считываем заголовок таблицы и без изменений заносим в дополнительный файл.



Исходная таблица

N

п/п



(Hz)

E1

(B)

E2

(B)

L1

(mG)

1

100

30j

40

100

2

50

50j

36j

200

3

150

80

47j

50

4

100

40j

20j

220

5

50

60

30j

550

6

50

100j

24

150

7

100

50j

50

150

8

75

60

30j

270

9

100

30

80j

200

10

50

90j

60

400

11

100

100

75j

150

12

75

60j

40

120

13

100

90

75j

300

14

50

50

40j

120

15

50

70j

45

150

	

Вначале считываем заголовок таблицы и без изменений заносим в дополнительный файл.


Исходная таблица                                    Дополнительная таблица

N

п/п



(Hz)

E1

(B)

E2

(B)

L1

(mG)

N

п/п



(Hz)

E1

(B)

E2

(B)

L1

(mG)

 

Затем начинаем считывать по одному элементу из исходной таблицы, и если условие выполняется (считывается с первого по пятый и с тринадцатого по последний элементы), заносим в дополнительную таблицу.



1

100

30j

40

100

1

100

30j

40

100



2

50

50j

36j

200

2

50

50j

36j

200

 

3

150

80

47j

50

3

150

80

47j

50



4

100

40j

20j

220

4

100

40j

20j

220

 

Пропускаем элементы до тринадцатого, затем аналогично считываем по одному, и заносим в дополнительный файл



13

100

90

75j

300

5

100

90

75j

300



14

50

50

40j

120

6

50

50

40j

120

 

15

50

70j

45

150

7

50

70j

45

150



Дополнительная таблица в дополнительном файле



N

п/п



(Hz)

E1

(B)

E2

(B)

L1

(mG)

1

100

30j

40

100

2

50

50j

36j

200

3

150

80

47j

50

4

100

40j

20j

220

5

100

90

75j

300

6

50

50

40j

120

7

50

70j

45

150



Теперь удаляем исходный файл, запомнив при этом его название, и переименовываем дополнительный. 

Сложнее обстоит дело с удалением элементов по заданному значению ключа. Необходимо определить тип полей таблицы и самого ключа, затем сравнивать поэлементно числа или строки (в зависимости от ключа) в записях внешних таблиц, и таким же образом, как было рассмотрено выше, заносить во временный файл и произвести переименовку дополнительного файла.



Исходная таблица

Вид таблицы

Плотность заполнения







упорядоченный

100 %

80

1

12

неупорядоченный

100 %

40

1

15

Хеш-таблица

50 %

400

1.2

20



Введем ключ “1”

Исходная таблица                                           Дополнительная таблица



Вид 

Плотность зап.







Вид 

Плотность зап









Считываем 1-й элемент



1

1

1

1



упорядоченный

100 %

80

1

12



Элемент не заносится в дополнительную таблицу 


Считываем 2-й элемент



1

1

1

1



неупорядоченный

100 %

40

1

15



Элемент не заносится в дополнительную таблицу 



Считываем 3-й элемент



1

1

1

1

1

1

1



Хеш-таблица

50 %

400

1.2

20



Элемент заносится в дополнительную таблицу 



Дополнительная таблица



Вид таблицы

Плотность заполнения







Хеш-таблица

50 %

400

1.2

20



Теперь удаляем исходный файл, запомнив при этом его название, и переименовываем дополнительный.


3 ВЫБОР ЯЗЫКА ПРОГРАММИРОВАНИЯ



	Процесс работы компьютера состоит в выполнении программы, набора вполне определённых команд в вполне определённом порядке. Машинный код команды, состоящий из нулей и единиц, указывает, какое именно действие должен выполнить процессор. Т.е. чтобы создать программу для компьютера, необходимо записать последовательность нулей и единиц. Однако программирование в машинных кодах – занятие утомительное и малопродуктивное. Для упрощения процесса программирования были созданы специальные средства – языки программирования. Они стали появляться с 50-х годов и не перестают появляться и сегодня. Огромное количество языков говорит об ещё большем числе задач, которые приходится решать с помощью компьютера.

	Вообще, одну и ту же задачу обычно можно решить с использованием разных языков. Но применение неподходящего языка программирования может заметно усложнить процесс программирования или ухудшить результат работы.

	Для реализации данного программного продукта был выбран язык C и компилятор Borland C++ 3.1. 

	Это решение было принято по следующим причинам:

		программный продукт слишком велик для того, чтобы быть написанным на языке низкого уровня, таком как ассемблер; 

		система требует высокого быстродействия и доступа к низкоуровневому оборудованию; 

		язык программирования должен содержать библиотеку для работы в графическом режиме;

		язык должен иметь средства работы со строками;

		язык должен содержать средства работы с файлами;

		необходимы средства динамического распределения памяти;

		желательно наличие отладчика, позволяющего исполнять программу в пошаговом режиме, просматривать значения переменных и регистров процессора в процессе исполнения программы.

Язык C отвечает всем этим требованиям. Хоть он и не является языком низкого уровня, скорость программ написанных на C довольно высока в сравнении с другими высокоуровневыми языками. Тем не менее, он обладает всеми чертами языков высокого уровня: обладает мощными управляющими структурами, является типизированным языком, позволяет структурировать программу. Библиотеки языка C предоставляют средства работы в графическом режиме, множество функций работы со строками и файлами. В C реализована система динамического распределения памяти. Он позволяет обращаться к любым адресам оперативной памяти, к портам ввода вывода, прерываниям операционной системы. Есть возможность делать ассемблерные вставки. Так что наиболее критичные участки программы могут быть написаны на языке ассемблера. Наконец, в состав системы Borland C++ 3.1 входит мощный отладчик, позволяющий расставлять в тексте программы контрольные точки, исполнять программу в пошаговом режиме, просматривать значения переменных, регистров и областей оперативной памяти по ходу исполнения программы.

Кроме того, программы, написанные на C, отличаются компактностью как исходного, так и машинного кода. Они легко переносятся на другие операционные системы.

Язык C обладает также и некоторыми недостатками: некорректное использование указателей может привести к серьёзным ошибкам в программе; компактность языка в сочетании с большим количеством операторов даёт возможность создавать код, понимание которого чрезвычайно затруднительно. Эти недостатки связаны с тем, что C ориентирован на опытных программистов, которые хорошо знают, что они делают.

	Таким образом, наиболее удобным для реализации данного программного продукта является язык программирования C.


4 ОПИСАНИЕ ФУНКЦИОНИРОВАНИЯ ПРОГРАММНОГО ПРОДУКТА



Входные данные

	

	Входными данными является любой файл, содержащий таблицу любой структуры (тип полей – символьный или строковый). 

	

Выходные данные

	

	Выходными данными является тот же файл, но с изменениями, зависящими от действий пользователя, структура таблицы при этом не нарушается.

	

	4.3 Схема информационных потоков

	

Существует главная программа. В неё поступают Входные данные, вводимые пользователем с клавиатуры (имя файла данных, ключ), а также из внешних текстовых файлов (теория по ВТ, исходные данные). В ответ на вводимые данные главная программа выводит на экран монитора Выходные данные – теоретический материал, справку, таблицы с данными. Схематически работа программы изображена на рисунке 1.6.




Таблицы данных











Дисплей

монитора











ГЛАВНАЯ ПРОГРАММА

Имя файла





Ключ

Клавиатура







			





Справка

Файлы с данными и

теорией



Внешние файлы

			

				

Рисунок 4.3 Схема информационных потоков.



4.4 Метод решения



После запуска программы происходит прорисовка экрана затем и самого главного меню. Из меню вызываются функции: файл, вывод окошка-запроса о загрузке, либо очистке файла, либо запросе о выходе из программы; таблица, вывод окошка-запроса об удалении элементов внешних таблиц; Справка - в этом пункте меню пользователь узнает, как правильно работать с программой, как корректно выйти; выход.

Удаление элементов происходит по такой схеме: считываем в цикле по одному элементы из заданного файла, проверяем, входит ли этот элемент в заданный диапазон: если нет, то записываем в цикле по одному элементы во временный файл, если да, то пропускаем. Затем удаляем начальный файл и переименовываем временный.


4.5 Функционально – логическая схема





























                                             





                    





       

                         

Начало





Выбор пункта меню





Файл	

Удаление

Помощь

Выход



очистка



По номеру



Просмотр справочной 

информации

загрузка



По ключу





По интервалу





Внешняя память











Рисунок 4.5 – функционально – логическая схема



Работа программы начинается с загрузки главного меню программы. Он состоит из строки меню и двух окон вывода. Строка «Файл» состоит из трех пунктов. Пользователь выбирает нужный ему пункт. Назначение пунктов строки следующее: 

		новый – создание нового файла с таблицей;

загрузка – загрузка из внешней памяти уже существующего файла; 

удаление – удаление существующего файла из памяти ЭВМ;

Меню «Удаление» состоит из трех пунктов:

1) по номеру – удаление из загруженной таблицы записи под соответствующим номером (значение задает пользователь). 

Просмотр меню «Справка» приведет к выводу справочной информации по эксплуатации программы на экран.

Меню «Выход» выполняет освобождение используемой памяти, закрытие используемых файлов и завершение работы алгоритма.

Схематично работа программы представлена на рисунке 4.5.


5 КОМПЛЕКТ ПОСТАВКИ И ИНСТАЛЛЯЦИИ



5.1 Комплект поставки



В комплект поставки программного продукта входят следующие файлы:

kursovoi.exe – файл запускает программу; 

start.bat - файл запускает русификатор, а потом программу;

1.in, 2.in, 3.in – файлы-примеры, содержащие некоторые таблицы;

help.dat – файл содержит текст справки;

keyrus.com – русификатор;

egavga.bgi – файл содержит драйвер видеоадаптера;



5.2 Порядок инсталляции



Процедура инсталляции очень проста:

1) на жестком диске необходимо создать новую папку;

2) в эту папку скопировать файлы, входящие в комплект поставки.



5.3 Запуск программы



Загружается файл start.bat . Программа запущена. В случае отсутствия каких-либо файлов не гарантируется правильность работы программы.


6 ТЕСТИРОВАНИЕ ПРОГРАММНОГО ПРОДУКТА



Тестирование программного продукта можно произвести, загружая различные файлы, производя над ними операции удаления элементов или очистки таблиц, просмотр справочного материла, а также удаляя из папки различные файлы, необходимые для корректной работы программы, и наблюдая за реакцией программы. 

На тестовом примере покажем действие программы.

Загружаем файл:

После выбора пункта меню “Удаление”→”По интервалу” и введя от 4-х до 13-ти, получим:

После загрузки того же файла и выбрав: “Удаление”→”По ключу”, введя ключ “250”, получим:



n

Индекс

Продукт

Стоимость

1

30/121

Печенье

210

2

15/124

Конфеты

150

3

12/212

Зефир

140

6

10/376

Картофель

480

7

35/564

Арбузы

700

10

20/341

Морковь

800

11

10/343

Лук

750

12

15/123

Орехи

210

13

30/121

Айва

450

14

15/124

Капуста

150



Тестируя данный программный продукт можно определить его плюсы и минусы. К положительным качествам можно отнести простой и понятный интерфейс, внизу экрана на нижней кнопке находится подсказка к использованию, все, что нужно узнать по эксплуатации программы находится в пункте меню “Помощь”. В “логической” части программы главными плюсами является возможность редактирования файлов с таблицами без применения самой программы, также создание новых файлов с различными структурами и конструкциями. Типы полей загружаемой таблицы могут быть либо символьными, либо числовыми, вне зависимости от их порядка или конфигурации (т.е. рассмотрены различные варианты представления структуры таблицы). Рассмотрено также удаление элементов по заданному значению ключа, по интервалу. Но в программе имеются и свои недостатки: удаление элементов по сложному значению ключа (из-за возможных сложных конструкций), добавление элементов в файл (по той же причине), 16-ти-цветный интерфейс, также отсутствие горячих клавиш. 

		
ВЫВОДЫ

		

		Целью данного программного продукта является разработка программы, которая выполняла бы удаление элементов и очистку внешних таблиц. Приложение имеет свои преимущества и недостатки, а также перспективы усовершенствования. К положительным качествам можно отнести то, что программа занимает немного места на жестком диске, очень быстро загружается, не требовательна к операционным системам, выполняет просмотр и редактирование файлов различных конструкций.

		К недостаткам можно отнести отсутствие возможности управлять мышью, отсутствие горячих клавиш.

		К перспективам усовершенствования можно отнести подключение манипулятора “мышь”, создание более красочного интерфейса, возможности выполнения еще некоторых операций с внешними таблицами (добавление элементов и т. д.).

		
ПЕРЕЧЕНЬ ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

		

	В. В. Подбельский, С. С. Фомин “Программирование на языке Си”,2-е издание – Москва: “Финансы и статистика”, 2002г. - 600с.

	Герберт “Шилдт Полный справочник по С”, 4-е издание – К.: Вильямс, 2002 - 700с.

	Джефф Элджер “C++” – Санкт-Петербург: “Библиотека программиста”, 2000г. – 320с.

		
Приложение А



ТЕХНИЧЕСКОЕ ЗАДАНИЕ



А.1 Общие сведения



Полное наименование проектируемой системы: “Удаление элементов и очистка внешних таблиц”. Систему проектирует студент 2-го курса Донецкого государственного института искусственного интеллекта (ДонГИИИ), факультета современных компьютерных информационных технологий Климов В. А. 



А.2 Основания для разработки



Основанием для разработки является задание к курсовому проектированию по курсу “Структуры и организация данных в ЭВМ”, выданное кафедрой программного обеспечения интеллектуальных систем, факультета СКИТ.



А.3 Цель разработки



Цель разработки – создание программного продукта, предназначенного для удаления элементов внешних таблиц по заданным значениям ключа, вывод таблиц на экран, возможность сохранения результатов в файл.



А.4 Требования к ПП



А.4.1 Требования к ПП в целом

К ПП предъявляются следующие требования:

наличие удобного интерфейса в виде меню с системой подсказок, позволяющих пользователю управлять программой;

наличие контроля вводимых данных (проверка на существование файла);

вывод на экран результата выполнения операций над файлом.



А.4.2 Требования к задачам и функциям, выполняемым ПП

Программный продукт должен реализовывать следующие функции:

считывание информации из файла; 

удаление элементов внешних таблиц;

очистка файлов;

сохранение результатов в файл;

вывод текстовой информации о внешних таблицах.



А.4.3 Требования к техническому обеспечению



Программный продукт должен нормально функционировать на ПК со следующими характеристиками:

- процессор с частотой не ниже 66 MHz;

- 4MB памяти;

- VGA- монитор с поддержкой расширения 640x480.



А.4.4 Организационные требования



Программный продукт должен:

быть разработан на языке С;

- функционировать под ОС MS-DOS 5.0 и выше;

быть снабжённым пояснительной запиской объёмом не менее 30 страниц и руководством пользователя.

Этапы разработки и плановые сроки выполнения указаны в таблице А.1

Таблица A.1 – График выполнения курсового проекта

№

Этапы работы

Срок выполнения (недели)

1

Постановка задачи: формулировка, исходные данные, результаты, определение требований к программному продукту.

1

1.

Составление технического задания

1-2

2.

Техническое проектирование. Изучение метода решения задачи.

2-3

3.

Рабочее проектирование.

Определение структур входных и выходных данных. Оценки структур данных и алгоритмов.

4

4.

 Написание алгоритмов удаления элементов по различных значениях ключа.

5

5.

Написание алгоритмов очистки внешних таблиц

6-8

6.

Создание файлов помощи по алгоритму и по программе

9

7.

Отладка и тестирование.

10

8.

Написание пояснительной записки

10-14

9.

Защита курсового проекта.

28.12.2003




Приложение Б



РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ



Б.1 Меню



Передвижение по меню осуществляется с помощью клавиш “↑” и “↓”. Для выбора пункта меню нужно нажать Enter. Для выхода из меню нужно нажать ESC. Передвижение по пунктам подменю осуществляется с помощью клавиш “↑” и “↓”. Для выбора пункта подменю нужно нажать клавишу Enter. Для выхода из подменю нужно нажать клавишу ESC. Из основного меню путем нажатия клавиши Esc осуществляется вызов пункта меню “Выход”.



Б.1.1 Пункт «Файл»

На экран выводится вертикальное меню, состоящее из трех подпунктов: “Загрузка”, “Очистка”, “Выход”. Хождение по меню осуществляется с помощью нажатия клавиш <↑> и <↓>. Для выбора одного из пунктов необходимо нажать клавишу Enter.



Б.1.1.1 Подпункт «Загрузка»

На экран выводится окошко с запросом о вводимом файле, после чего нужно ввести имя файла, нажать клавишу Enter. Далее произойдет загрузка и вывод содержимого файла на экран, либо окошко, оповещающее о том, что загрузка не удалась по какой-либо причине. Для экстренной остановке выполнения какой-нибудь команды, используйте клавишу Esc. 



Б.1.1.2 Подпункт «Очистка»

На экран выводится окошко с запросом о вводимом файле, после чего нужно ввести имя файла, нажать клавишу Enter. Далее произойдет очистка содержимого файла и вывод окна об успешном выполнении очистки, либо окошко, оповещающее о том, что загрузка не удалась по какой-либо причине. Для экстренной остановке выполнения какой-нибудь команды, используйте клавишу Esc. 



Б.1.1.3 Подпункт «Выход»

Смотри пункт “Выход”.



Б.1.2 Пункт «Удаление»

На экран выводится вертикальное меню, состоящее из трех подпунктов: “По номеру”, “По интервалу”, “По ключу”. Хождение по меню осуществляется с помощью нажатия клавиш <↑> и <↓>. Для выбора одного из пунктов необходимо нажать клавишу Enter.



Б.1.2.1 Подпункт «По номеру»

На экран выводится окошко с запросом о вводимом удаляемом порядковом номере элемента, после чего нужно ввести число, нажать клавишу Enter. Далее произойдет удаление элемента таблицы под заданным номером и вывод содержимого файла на экран. Для экстренной остановке выполнения какой-нибудь команды, используйте клавишу Esc. 



Б.1.2.2 Подпункт «По интервалу»

На экран выводится окошко с запросом о вводимом интервале удаляемых элементов, после чего нужно ввести 2 числа (начального и конечного удаляемого элемента), нажать клавишу Enter. Далее произойдет удаление элементов таблицы под заданным номером и вывод содержимого файла на экран. Для экстренной остановке выполнения какой-нибудь команды, используйте клавишу Esc. 


Б.1.2.3 Подпункт «По ключу»

На экран выводится окошко с запросом о вводимом удаляемом значении ключа, после чего нужно ввести значение ключа, нажать клавишу Enter. Далее произойдет удаление элемента или элементов таблицы под заданным значением ключа и вывод содержимого файла на экран. Для экстренной остановке выполнения какой-нибудь команды, используйте клавишу Esc. 



Б.1.3 Пункт «Помощь»



На экран выводится справка об эксплуатации программы.



Б.1.4 Пункт «Выход»



При выборе этого пункта программа завершит свою работу.


Приложение В



ЭКРАННЫЕ ФОРМЫ





Рисунок В.1 – Начальный вид экрана





Рисунок В.2 – Вид экрана после выбора пункта меню “Файл”-“Загрузка”



Рисунок В.3 – Реакция программы на отсутствие загружаемого файла





Рисунок В.4 – Вид экрана после выбора пункта меню “Удаление”-“По номеру”





Рисунок В.5 – Загрузка файла справки





Рисунок В.6 – Запрос о выходе из программы


Приложение Г



ЛИСТИНГ ПРОГРАММЫ



#include <stdio.h>

#include <conio.h>

#include <graphics.h>

#include <alloc.h>

#include <dos.h>

#include <string.h>

#include <stdlib.h>



int a,b,d=1,d2=1,i,j,m,l=0,x=0,z=0,n,p=0,r=0,k=0,nomer=0,nom;

int mode=VGAHI;

int driver=VGA;

char kluch[10];

int nach, con;

FILE *in;

char ch,*v,h[10],cd[50],*str,c[5],s[50],cf[50],cb;

void *buf,*buf1, *buf2, *buf3;

struct type

 {

 char nazv[10];

 char kol[10];

 char sum[10];

 char kl[10];

 } tablica[15],*ukz;



void imya();

void del()

{FILE *in;

 char fname[11];



setfillstyle(SOLID_FILL,0);

bar(200,100,500,300);

setcolor(4);

outtextxy(300,152,"‚ўҐ¤ЁвҐ Ё¬п д ©« !!!(*.in)");

outtextxy(315,162,"max 2 бЁ¬ў®« :_");

rectangle(301,174,463,185);

imya();

in = fopen(s,"w");

fclose(in);



outtextxy(300,152,"” ©« ®зЁйҐ­!!!");

}





void record(void)

{ char ch,name[11];

 FILE *out;

 int j=0;



 clrscr();

 printf("•®вЁвҐ б®еа ­Ёвм Ё­д®а¬ жЁо ў д ©«(y - ¤ , Ё­ зҐ ­Ґв):");

 ch=getch();

 if (ch=='y')

 {

 do

 {

	clrscr();

	printf("‚ўҐ¤ЁвҐ Ё¬п д ©« (*.out):");

	scanf("%s",name);

	out=fopen(name,"w");

 }while (out==NULL);



 for (j=0;j<=n;j++)

 {

 fprintf(out,"%s\n",tablica[j].nazv);

 fprintf(out,"%s\n",tablica[j].kol);

 fprintf(out,"%s\n",tablica[j].sum);

 fprintf(out,"%s\n",tablica[j].kl);}



 clrscr();

 gotoxy(32,13);

 printf("‡ ЇЁбм Їа®Ё§ўҐ¤Ґ­ гбЇҐи­®!");

 getch();

 fclose(out);

 }

}

void interval()

{

 setfillstyle(SOLID_FILL,0);

 setcolor(4);

 outtextxy(300,202,"‚ўҐ¤ЁвҐ ­Ё¦­оо Ја ­Ёжг!!!(*.in)");

 outtextxy(315,212,"max 2 бЁ¬ў®« :_");

 rectangle(301,224,463,235);

p=0;

do{

 a=getch();



 if ((a!=13)&&(a!=8)&&(a!=27))

 { s[p]=a; p++; s[p]='\x0';}



 bar(302,225,302+textwidth(s),226+textheight(s));

 if (a==8) if (p>0) s[--p]='\x0';

 outtextxy(302,225,s);



 if(strlen(s)>15)

 {

 outtextxy(250,220,"Ѓ®«миҐ бЁ¬ў®«®ў ўўҐбвЁ ­Ґ«м§п!!!!");

 outtextxy(250,230," „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ Enter");

 do

 {

 a=getch();

 }while (a!=13);

 }

 }while(a!=13);

 setfillstyle(SOLID_FILL,0);

 bar(300,202,600,235);

 nach=atoi(s);

setfillstyle(SOLID_FILL,0);

setcolor(4);

outtextxy(300,202,"‚ўҐ¤ЁвҐ ўҐае­оо Ја ­Ёжг!!!(*.in)");

outtextxy(315,212,"max 2 бЁ¬ў®« :_");

rectangle(301,224,463,235);

p=0;

do{

 a=getch();



 if ((a!=13)&&(a!=8)&&(a!=27))

 { s[p]=a; p++; s[p]='\x0';}



 bar(302,225,302+textwidth(s),226+textheight(s));

 if (a==8) if (p>0) s[--p]='\x0';

 outtextxy(302,225,s);



 if(strlen(s)>15)

 {

 outtextxy(250,220,"Ѓ®«миҐ бЁ¬ў®«®ў ўўҐбвЁ ­Ґ«м§п!!!!");

 outtextxy(250,230," „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ Enter");

 do

 {

 a=getch();

 }while (a!=13);

 }

 }while(a!=13);

 setfillstyle(SOLID_FILL,0);

 bar(164,24,606,446);

 con=atoi(s);

 i=0;j=0;x=0;k=0;

 outtextxy(175,30,"Ќ®¬ €­¤ҐЄб Ќ §ў ­ЁҐ ‘г¬¬ Љ«оз");

 do

 {

 i++;x+=10;j++;



 if (i==nach)

 {

 do

 {

 i++;

 }

 while (i>=con);

 }

 itoa(j,c,10);

 outtextxy(180,50+x,c);

 outtextxy(220,50+x,ukz[i].nazv);

 outtextxy(290,50+x,ukz[i].kol);

 outtextxy(390,50+x,ukz[i].sum);

 outtextxy(460,50+x,ukz[i].kl);

 }while (i!=n);



getch();

}

void load(void)

{

 FILE *in;

 char fname[11];

 int i=1;

 setfillstyle(SOLID_FILL,0);

setcolor(4);

outtextxy(300,152,"‚ўҐ¤ЁвҐ Ё¬п д ©« !!!(*.in)");

outtextxy(315,162,"max 20 бЁ¬ў®«®ў:_");

rectangle(301,174,463,185);

 imya();

 in = fopen(s,"r");

 do

 { fgets(ukz->nazv,10,in);

 fgets(ukz->kol,10,in);

 fgets(ukz->sum,10,in);

 fgets(ukz->kl,10,in);

 i++;

 k++;

 } while(!feof(in));



 rewind(in);

 i=1;

 outtextxy(175,30,"Ќ®¬ €­¤ҐЄб Ќ §ў ­ЁҐ ‘г¬¬ Љ«оз");

 ukz=(struct type *)malloc(sizeof(struct type)*k);

 do

 {i++;

 itoa(i-1,c,10);

 x+=10;

 outtextxy(180,50+x,c);

 fscanf(in,"%s",ukz[i-1].nazv);

 outtextxy(220,50+x,ukz[i-1].nazv);



 fscanf(in,"%s",ukz[i-1].kol);

 outtextxy(290,50+x,ukz[i-1].kol);



 fscanf(in,"%s",ukz[i-1].sum);

 outtextxy(390,50+x,ukz[i-1].sum);



 fscanf(in,"%s",ukz[i-1].kl);

 outtextxy(460,50+x,ukz[i-1].kl);

 n=i;

 }while (!feof(in));



 fclose(in);

 }

 openf (char s[20])

{



					setfillstyle(SOLID_FILL,0);

					bar(164,24,606,446);

					z=0;

					k=0;

					in=fopen(s,"r");

					setviewport(164,24,606,446,0);

					rewind(in);

					while(fgets(cd,53,in)!=NULL)



						{



						a=strlen(cd);



						if(cd[a-1]=='\n')

						cd[a-1]=' ';

						setcolor(7);

						outtextxy(10,10+x,cd);

						x+=10;

						k++;

					}



				 a=getch();

				while (a!=27)

				 {

				 a=getch();

				 }

				k=0;

				x=0;

				clearviewport();

				setviewport(0,0,639,479,0);

				fclose(in);





 return(0);

}



void imya()

{

 p=0;

 do{

 a=getch();

 if ((a!=13)&&(a!=8)&&(a!=27))

 { s[p]=a; p++; s[p]='\x0';}



 bar(302,175,302+textwidth(s),176+textheight(s));

 if (a==8) if (p>0) s[--p]='\x0';

 outtextxy(302,175,s);



 if(strlen(s)>19)

 {

 outtextxy(250,200,"Ѓ®«миҐ бЁ¬ў®«®ў ўўҐбвЁ ­Ґ«м§п!!!!");

 outtextxy(250,210," „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ Enter");

 do

 {

 a=getch();

 }while (a!=13);

 }

 }while(a!=13);

 setfillstyle(SOLID_FILL,0);

 bar(164,24,606,446);

}

 liniya (int k,int m,int n)

{ setcolor(n);

 line(130,20+k*60,130,50+k*60);

 line(20,50+k*60,130,50+k*60);

 setcolor(m);

 line(20,20+k*60,20,50+k*60);

 line(20,20+k*60,130,20+k*60);



return 0;

}



liniya2(int i,int m,int n)

{

 setcolor (m);

 line(20,300+i*60,20,330+i*60);

 line(20,300+i*60,130,300+i*60);

 setcolor (n);

 line(130,300+i*60,130,330+i*60);

 line(20,330+i*60,130,330+i*60);

 return 0;

}

void nomer1()

{

setfillstyle(SOLID_FILL,0);

setcolor(4);

outtextxy(300,202,"‚ўҐ¤ЁвҐ ­®¬Ґа § ЇЁбЁ!!!(*.in)");

outtextxy(315,212,"max 2 бЁ¬ў®« :_");

rectangle(301,224,463,235);

p=0;

do{

 a=getch();

 if ((a!=13)&&(a!=8)&&(a!=27))

 { s[p]=a; p++; s[p]='\x0';}



 bar(302,225,302+textwidth(s),226+textheight(s));

 if (a==8) if (p>0) s[--p]='\x0';

 outtextxy(302,225,s);



 if(strlen(s)>15)

 {

 outtextxy(250,220,"Ѓ®«миҐ бЁ¬ў®«®ў ўўҐбвЁ ­Ґ«м§п!!!!");

 outtextxy(250,230," „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ Enter");

 do

 {

 a=getch();

 }while (a!=13);

 }

 }while(a!=13);

 setfillstyle(SOLID_FILL,0);

 bar(164,24,606,446);

 nom=atoi(s);

 i=0;j=0;x=0;

 outtextxy(175,30,"Ќ®¬ €­¤ҐЄб Ќ §ў ­ЁҐ ‘г¬¬ Љ«оз");

 m=n;

 do

 { x+=10;

 i++; j++;

 if((i==nom)&&(i==n)) break;

 if(i==nom){i++;m-=1;}

 itoa(j,c,10);

 outtextxy(180,50+x,c);

 outtextxy(220,50+x,ukz[i].nazv);

 outtextxy(290,50+x,ukz[i].kol);

 outtextxy(390,50+x,ukz[i].sum);

 outtextxy(460,50+x,ukz[i].kl);



 }while (i!=m);



 getch();

}

void kluchik()

{

setfillstyle(SOLID_FILL,0);

setcolor(4);

outtextxy(300,202,"‚ўҐ¤ЁвҐ Є«оз (*.in)");

outtextxy(315,212,"max 2 бЁ¬ў®« :_");

rectangle(301,224,463,235);

p=0;

do{

 a=getch();



 if ((a!=13)&&(a!=8)&&(a!=27))

 { s[p]=a; p++; s[p]='\x0';}



 bar(302,225,302+textwidth(s),226+textheight(s));

 if (a==8) if (p>0) s[--p]='\x0';

 outtextxy(302,225,s);



 if(strlen(s)>15)

 {

 outtextxy(250,220,"Ѓ®«миҐ бЁ¬ў®«®ў ўўҐбвЁ ­Ґ«м§п!!!!");

 outtextxy(250,230," „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ Enter");

 do

 {

 a=getch();

 }while (a!=13);

 }

 }while(a!=13);

 setfillstyle(SOLID_FILL,0);

 bar(164,24,606,446);

 strcpy(kluch,s);

 v=s;

 i=0;j=0;x=0;

 outtextxy(175,30,"Ќ®¬ €­¤ҐЄб Ќ §ў ­ЁҐ ‘г¬¬ Љ«оз");

 do

 { x+=10;

 i++;j++;

 if (ukz[i-2].kl==v) i++;

	itoa(j,c,10);

 outtextxy(180,50+x,c);

 outtextxy(220,50+x,ukz[i-1].nazv);

 outtextxy(290,50+x,ukz[i-1].kol);

 outtextxy(390,50+x,ukz[i-1].sum);

 outtextxy(460,50+x,ukz[i-1].kl);



 }while (i!=n);

 getch();

}

file (char str1[5],char str2[5],char str3[5])

{

 d2=1;

 setfillstyle(SOLID_FILL,1);

 for (i=0;i<3;i++)

 {

 bar(20,300+i*60,130,330+i*60);

 liniya2(i,9,0);

 }



 while (a!=27)

 {

 setcolor(6);

 outtextxy(27,310,str1);

 outtextxy(27,370,str2);

 outtextxy(27,430,str3);



	if ((a==80)||(a==72))

	 {

	 if (a==80) d2++;

	 if (a==72) d2--;

	 if (d2>3) d2=1;

	 if (d2<1) d2=3;

	 }

	 if ((d2==1)&&(nomer==1))

	 {

	 setcolor(4);

	 outtextxy(27,310,str1);



	 liniya2(0,0,9);

		a=getch();

	 liniya2(0,9,0);

	 if (a==13)

		{

		 del();

		}else continue;

	 }

	 if ((d2==1)&&(nomer==2))

	 {

	 setcolor(4);

	 outtextxy(27,310,str1);

	 liniya2(0,0,9);

		a=getch();



		if (a==13)

		{

		 nomer1();

		}

	 liniya2(0,9,0);

	 }

	 if ((d2==2)&&(nomer==1))

	 {

	 setcolor(4);



	 outtextxy(27,370,str2);



		 liniya2(1,0,9);

	 a=getch();

		if (a==13)

		{

		 load();

		}

	 liniya2(1,9,0);

	 }

	 if ((d2==2)&&(nomer==2))

	 {

	 setcolor(4);

	 outtextxy(27,370,str2);

	 liniya2(1,0,9);

	 a=getch();

		if (a==13)

		{

		 kluchik();

		}



	 liniya2(1,9,0);

	 }

	 if ((d2==3)&&(nomer==2))

	 {

	 setcolor(4);



	 outtextxy(27,430,str3);



	 liniya2(2,0,9);

	 a=getch();

	 liniya2(2,9,0);

		if (a==13)

		{

		 interval();

		}

		else continue;



	 liniya2(2,9,0);

	 }

 }

setfillstyle(SOLID_FILL,8);

bar(20,300,130,460);

return 0;

}





void interfice()

{

 setfillstyle(SOLID_FILL,8);

 bar(0,0,640,480);

 setfillstyle(SOLID_FILL,0);

 bar(164,24,606,446);

 setfillstyle(SOLID_FILL,1);

 for (i=0;i<4;i++)

 {

 bar(20,20+i*60,130,50+i*60);

 liniya(i,9,0);

 }

 setfillstyle (SOLID_FILL,1);

 bar(160,20,163,450);

 bar(20,265,163,268);

 bar(160,20,610,23);

 bar(607,20,610,450);

 bar(160,447,610,450);

 d=1;

 while (ch!=27)

 {

 setcolor(6);

 outtextxy(60,30,"”Ђ‰‹");

 outtextxy(45,90,"“„Ђ‹…Ќ€…");

 outtextxy(45,150,"‘ЏђЂ‚ЉЂ");

 outtextxy(55,210,"‚›•Ћ„");



	if ((a==80)||(a==72))

	 {

	 if (a==80) d++;

	 if (a==72) d--;

	 if (d>4) d=1;

	 if (d<1) d=4;

	 }

	 if (d==1)

	 {

	 nomer=1;

	 setcolor(4);

	 outtextxy(60,30,"”Ђ‰‹");

	 liniya(0,0,9);

	 a=getch();

	 liniya(0,9,0);

	 if (a==13)

	 {

		file("Ћ—€‘’ЉЂ","‡Ђѓђ“‡ЉЂ","");

	 }else continue;

	 }

	 if (d==2)

	 {

	 setcolor(4);

	 nomer=2;

	 outtextxy(45,90,"“„Ђ‹…Ќ€…");

	 liniya(1,0,9);

	 a=getch();

	 liniya(1,9,0);

	 if (a==13)

	 {

		file("ЏЋ ЌЋЊ…ђ“","ЏЋ Љ‹ћ—“","ЏЋ €Ќ’…ђ‚Ђ‹“");



	 }else continue;

	 }

	 if ((d==3))

	 {

	 setcolor(4);

	 outtextxy(45,150,"‘ЏђЂ‚ЉЂ");

	 liniya(2,0,9);

	 a=getch();

	 liniya(2,9,0);

	 if (a==13)

	 {

	 openf("e:\\bc31\\bin\\help.dat");

	 }

	 else continue;

	 }

	 if (d==4)

	 {

	 setcolor(4);

	 outtextxy(55,210,"‚›•Ћ„");

	 liniya(3,0,9);

	 a=getch();

	 liniya(3,9,0);

	 if (a==13)

	 {

	 break;

	 }

 else continue;

	 }

 }

}

void main(void)

{

 initgraph(&driver,&mode,"e:\\bc31\\bin");

 interfice();

 closegraph();

}