Обработка набора данных, представленного в виде файла
Введение
Целью данной курсовой работы является практическая обработка
набора данных, представленного в виде файла. В данной работе необходимо
обеспечить реализацию следующих запросов к заданному множеству
структурированной информации:
1
Создание
набора данных.
2
Добавление
новых элементов в конец набора данных.
3
Просмотр
всех элементов набора данных.
4
Поиск
элемента по номеру.
5
Переход
к работе с другим набором данных.
В соответствии с заданием моего варианта необходимо
обеспечить реализацию двух запросов к заданному множеству структурированной
информации:
1 Удаление, элементов начиная от текущего
2 Просмотр элементов и вычисление среднего, минимума и
максимума из заданного диапазона
Множество данных должно представлять собой информацию об
абонентах АТС:
1
фамилия
(string);
2
оплата
в месяц (longint);
3
номер
АТС (integer);
4
дополнительные
средства связи: факс-модем, модем, факс, отсутствуют (перечислимый тип).
Условия и ограничения, которые должны быть соблюдены при
написании данного программного комплекса:
1 Главную процедуру программы с реализацией простейшего
меню следует определить в отдельном модуле.
2 Процедуры, реализующие запросы, должны быть
размещены в одном или более модулях.
Глобальные данные: Спецификация файла. Никаких
других глобальных переменных использовать нельзя.
Вместе с меню на экране должно быть отображено:
·
номер
текущего элемента;
·
содержимое
текущего элемента.
5 На экран выводить элементы в виде таблицы (один элемент -
одна строка таблицы).
6 Если после выполнения запроса изменяется хотя бы
один элемент, то заканчивать запрос выводом всего множества элементов.
Тестами к заданиям служат 2 НД с правдоподобной
информацией.
1. Описание программного комплекса
1.1 Структура программного комплекса
Программный комплекс состоит из семи модулей, которые
содержат процедуры, реализующие запросы, модуля, содержащего главную процедуру
и исполняемой программы, вызывающей главную процедуру.
Главная программа подключает следующие модули: crt, menu, sozd, perehod, vivod, poisk, dobavlenie, udalenie, sredmaxmin
Псевдокод программы kursach:
kursach;crt, menu, sozd, perehod, vivod, poisk,
dobavlenie, udalenie{, sredmaxmin};kolvo=8; x=1; y=1;dopsredstva = (faxmodem,
modem, fax, nety);= record:byte;:string;:longint;:integer;:dopsredstva;;mass:mymenu;:integer;:string;:zapis;
{процедура прорисовки меню}vertmenu (mas:mymenu;
x, y, kol:integer; var long:integer);max, i, j:integer; l:byte; key:char;
{нахождение максимальной строки}
{дополнение всех строк до максимальной}
{прорисовка рабочего окна}i:=1 to kol do
{вывод полей меню}
{end for i:=1 to kol do}
{инициализация long}
{подсветка первого поля меню}
{инициализация l}
{определение кода нажатой клавиши}
{реакция на нажатие командных клавиш}
{прорисовка поля меню в исходный цвет}
{подсветка следующего выбранного поля меню}false
{end repeat};
{процедура отключения курсора}cursor_off;
{процедура включения курсора}cursor_on;
{процедура очистки экрана}stir;
{прорисовка рабочего окна}
{инициализация полей меню}
{вызов процедуры отключения курсора}
{вывод меню}long of
{вызов процедур в соответствии с выбранным
пунктом меню}
:begin
{очистка экрана и включение курсора}
{вызов процедуры создания нд}
{очистка экрана и отключение курсора}
{вывод меню};
:begin
{очистка экрана и включение курсора}
{вызов процедуры добавления элементов в конец нд}
{очистка экрана и отключение курсора}
{вывод меню};
:begin
{очистка экрана}
{вызов процедуры вывода нд}
{очистка экрана}
{вывод меню};
:begin
{включение курсора}
{вызов процедуры поиска элемента}
:begin
{очистка экрана и включение курсора}
{вызов процедуры перехода к работе с другим нд}
{очистка экрана и отключение курсора}
{вывод меню};
:begin
{очистка экрана и включение курсора}
{вызов процедуры создания нд по ключевому полю}
{очистка экрана и отключение курсора}
{вывод меню};
:begin
{очистка экрана и включение курсора}
{вызов процедуры добавления всех эл-тов в другой
нд}
{очистка экрана и отключение курсора}
{вывод меню};;long=kolvo;
{end repeat};.
1.2 Описание модуля sozd.tpu
программный модуль данные файл
В модуле sozd.tpu описана процедура sozdanienab и типы создаваемого
множества данных.
Описательная часть модуля:
unit sozd;dopsredstva = (faxmodem, modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;sozdanie_nd;
Процедура sozdanienab создает новый набор данных.
Псевдокод процедуры sozdanienab:
procedure sozdanienab;fail:file of zapis;:zapis;,
n, tg:integer;:string;
{ввод имени создаваемого файла}
{связывание переменной fail с набором данных}
{открытие файла fail для записи}
{ввод количества элементов n}i:=1 to n do
{ввод данных}
{запись данных в файл};
{end for i:=1 to n}
{закрытие файла};
1.3 Описание модуля dobavlenie.tpu
В модуле dobavlenie.tpu описана процедура dobavleniek и типы, необходимые для
работы с множеством данных.
Описательная часть модуля:
dobavlenie;vivod;dopsredstva = (faxmodem, modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;dobavleniek (name:string);
Процедура dobavleniek добавляет элементы в конец набора данных. В эту
процедуру передается переменная name (имя файла).
Псевдокод процедуры dobavleniek:
procedure dobavleniek;fail:file of zapis;:zapis;, n, tg,
max:integer;, oplatastr:string;
{связывание переменной fail с набором данных}
{открытие файла fail для записи}
{поиск последнего эл-та и установка указателя в конец файла}
{ввод кол-ва добавляемых элементов}i:=max+1 to n+max do
{ввод данных}
{запись данных в файл};
{end for}
{закрытие файла}
{вывод нд};
1.4 Описание модуля vivod.tpu
В модуле vivod.tpu описана процедура vivodnab и типы, необходимые для
работы с множеством данных.
Описательная часть модуля:
vivod;crt;dopsredstva = (faxmodem, modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;vivodnab (name:string);
Процедура vivodnab обеспечивает вывод набора данных на экран в виде
таблицы и скроллинг таблицы, если она не помещается в окне. В эту процедуру
передается переменная name (имя файла).
Псевдокод процедуры vivodnab:
vivodnab;stroka:array [1..50] of string[80];:integer;:zapis;,
oplatastr:string;:file of zapis;, m, a, l:integer;:char;
{связывание переменной fail с нд и открытие файла}
{инициализация k}
{инициализация stroka[1] и stroka[2]}
{чтение данных из файла}
{перевод данных в строковый тип}
{запись строк таблицы в массив строк}
{подготовка следующей итерации}eof(fail);
{end repeat}
{инициализация последней строки}
{отключение курсора}
{прорисовка рабочего окна}
{вывод первых 25-ти строк}
{инициализация m}
{определение кода нажатой клавиши}key of
{реакция на нажатие командых клавиш};
{инициализация l}a:=m to m+24 do
{вывод строк в соответсвии с нажатой клавишей}key=#27;
{end repeat}
{закрытие файла};
1.5 Описание модуля poisk.tpu
В модуле poisk.tpu описана процедура poiskel и типы, необходимые для
работы с множеством данных.
Описательная часть модуля:
poisk;crt;dopsredstva = (faxmodem, modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;poiskel
(imya_faila:string);
Процедура poiskel обеспечивает поиск в наборе данных поиск
элемента по номеру и вывод этого элемента вместе с главным меню. В эту
процедуру передается переменная name (имя файла).
Псевдокод процедуры poiskel:
poiskel;fail:file of zapis;, i:byte;, nomstr,
oplatastr:string;:zapis;
{прорисовка рабочего окна}
{ввод номера элемента}
{связывание файла с нд}
{открытие файла}
{нахождение максимального номера и проверка введенного
номера}
{установка указателя на начало файла}
{чтение из файла}
{перевод данных из файла в строковое представление}zap.nom=n
then
{вывод элемента}
{end if}eof(fail);
{end repeat}
{закрытие файла};
1.6 Описание модуля perehod.tpu
В модуле perehod.tpu описана процедура perehodnab.
Описательная часть модуля:
perehod;perehodnab (var name:string);
Процедура perehodnab выполняет переход к работе с другим набором
данных. Из этой процедуры в главную передается переменная name (имя файла).
Псевдокод процедуры perehodnab:
perehodnab;fail:file;
{ввод имени файла}
{связывание файла с нд}
{проверка ввода\вывода};
1.7
Описание модуля udalenie.tpu
В модуле udalenie.tpu описана процедура udelenieel.
Описательная часть модуля:
sozd_key;crt, vivod;x=1; y=2; kol=4;dopsredstva = (faxmodem,
modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;udalenieel (name:string;
nom:integer);
Процедура udelenieel удаляет данные начиная от текущуго номера. В эту
процедуру передается переменная name (имя файла).
Псевдокод процедуры udalenieel:
udalenieel (name:string; nom:integer);
{открытие файла}
{удаление файла};.
1.8
Описание модуля sredmaxmin.tpu:
В модуле sredmaxmin.tpu описана процедура nahojdenie. Также в модуле описаны
типы, необходимые для работы с множеством данных.
Описательная часть модуля:
sredmaxmin;crt;dopsredstva = (faxmodem, modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;naxogdenie (name:string);
Процедура nahojdenie обеспечивает нахождение среднего, максимального
и минимального элементов текущего набора данных. В эту процедуру передается
переменная name (имя исходного файла).
Псевдокод процедуры dobavlenie:
naxogdenie (name:string);fail:file of zapis;:zapis;, niz,
min, max, i, j, k:integer;_vo:array [1..100] of integer;, sredn:real;,
oplatastr:string;
{ввод нижней и верхней границы}
{вывод шапки таблицы}
{вывод эллементов попавших в данный диапазон}eof(fileout);
{end repeat}
{вычисление среднего, максимального и минимального
эллементов}
{вывод эллементов};
2.
Описание работы программы по контрольному примеру
Программ начинается с вывода меню. Для передвижения по
пунктам меню нужно использовать клавиши «Вверх» и «Вниз» (Рисунок 1).
Рисунок 1 - Главное меню
2.1 Создание набора данных
Чтобы создать новый набор данных, нужно выбрать в меню пункт
«Создать новый НД». После выбора программа попросит ввести имя создаваемого
файла, затем количество элементов, после чего мы приступим к вводу самих
элементов. После завершения ввода программа вернется в меню. Создадим набор
данных, состоящий из трех элементов (рисунок 2), и выведем его (рисунок 3).
Рисунок 2 - Создание набора данных
2.2 Добавление элементов в конец набора данных
Чтобы добавить в уже существующий набор данных новые
элементы, нужно выбрать в меню пункт «Добавить элементы в конец НД». Программа
попросит ввести количество добавляемых элементов, после ввода количества мы
сможем ввести сами элементы. На на рисунке 5 - процесс добавления элементов, на
рисунке 6 - конечное состояние набора данных.
Рисунок 5 - Добавление элементов в конец нд
Рисунок 6 - Конечное состояние нд
2.3 Просмотр всех элементов набора данных
Рисунок 7 - Вывод набора данных (Часть 1)
Рисунок 8 - Вывод набора данных (Часть 2)
2.4 Поиск элемента по номеру
Для поиска элемента в наборе данных по номеру необходимо
выбрать в меню пункт «Найти элемент по номеру», ввести номер, после чего
программа выведет данный элемент. Для примера возьмем набор данных из
предыдущего примера и выведем второй элемент.
Рисунок 9 - Поиск элемента по номеру
2.5 Переход к работе с другим набором данных
Для перехода к работе с другим набором данных нужно выбрать в
меню пункт «Перейти к работе с другим НД» и ввести имя файла, который нам нужно
открыть. В примере, изображенном на рисунках 11 и 12 я перейду от нд из пункта
2.3 к нд из пункта 2.2.
Рисунок 10 - Переход к работе с другим нд
Рисунок 11 - Вывод нд, к которому перешли
2.6 Удаление элементов, начиная от текущего
Для удаления элементов, начиная от текущего нужно выбрать
элемент, а затем выбрать в меню пункт «Удаление элементов, начиная от
текущего», после этого программа удалит все элементы начиная от выбранного.
Рисунок 13 - Ввод имени создаваемого файла
Рисунок 16 - Вывод созданного набора данных
2.7 Просмотр элементов и вычисление среднего,
минимума и масимума из заданного диапазона
Для просмотра элементов и вычисление среднего, минимума и
масимума из заданного диапазона нужно выбрать в меню пункт «Просмотр элементов
и вычисление среднего, минимума и масимума из заданного диапазона», после чего
программа попросит ввести верхний и нижний дивпазоны (рисунок 17).
Рисунок 17 - Ввод нижнего и верхнего диапазонов
Рисунок 18 - Вывод результата
Заключение
Итогом выполнения данной курсовой работы является написание
программного комплекса по обработке набора данных. В результате написания
программного комплекса, я закрепил свои знания по основам алгоритмизации и
программирования, углубил свои знания по алгоритмическому языку Pascal, получил опыт разработки
программных комплексов и на практике освоил основы модульного программирования.
Все условия данной курсовой работы были соблюдены. Все запросы выполняются
корректно.
Список
использованных источников
1
Исходники.ру
[Электронный ресурс]. - 2012. - Режим доступа:
http://forum.sources.ru.
- Дата доступа: 15.05.2012.
2
Зуев,
Е.А. Программирование на языке Turbo Pascal 6.0, 7.0 / Е.А. Зуев. - Радио и
связь, Веста, 1993. - С. 215-227.
Приложение
Текст главной программы:
program kursach;crt, menu, sozd, perehod, vivod, poisk,
dobavlenie, udalenie, sredmaxmin;kolvo=8; x=1; y=1;dopsredstva = (faxmodem,
modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;mas:mymenu;:integer;:string;:zapis;
cursor_off;ah, 1cx, 2020h10h;;
cursor_on;;ah, 1cx, 0607h10h;
stir;(1,1,80,25);(black);(white);;;
(1,1,80,25);(white);(black);[1]:='Создать новый
НД';[2]:='Добавить элементы в конец НД';[3]:='Просмотреть все элементы
НД';[4]:='Найти элемент по номеру';[5]:='Перейти к работе с другим НД';[6]:='Удаление
элементов, начиная от текущего';[7]:='Просмотр элементов и вычисление среднего,
минимума и максимума';[8]:='Выход';;_off;(mas, x, y, kolvo, long);long of
:begin;_on;;;_off;(mas, x, y, kolvo, long);;
:begin;_on;(name);;_off;(mas, x, y, kolvo, long);;
:begin;(name);;(mas, x, y, kolvo, long);;
:begin_on;(name);_off;;
:begin;_on;(name);;_off;(mas, x, y, kolvo, long);;
:begin;_on;(name, nom);;_off;(mas, x, y, kolvo, long);;
:begin;_on;(name);;_off;(mas, x, y, kolvo, long);;;
{end case}long=kolvo;
{end repeat}.
Текст модуля sozd.tpu:
sozd;dopsredstva = (faxmodem, modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;sozdanienab;sozdanienab;fail:file
of zapis;:zapis;, n, tg:integer;:string;('введите имя файла');(name);(fail,
name);(fail);('введите количество элементов');(n);i:=1 to n do('введите
фамилию');(zap.familiya);('введите оплату');(zap.oplata);('введите
номер');(zap.nomerATS);('выберите дополнительное средство');('1 -
факс-модем');('2 - модем');('3 - факс');('4 - нету');(tg);(tg<1) or
(tg>4) then('ошибка, введите заново');(tg>=1) and (tg<=4);
{end repeat}tg of
:zap.sredstva:=faxmodem;
:zap.sredstva:=modem;
:zap.sredstva:=fax;
:zap.sredstva:=nety;;
{end case}.nom:=i;(fail, zap);;
{end for}(fail);;;.
Текст модуля dobavlenie.tpu:
unit dobavlenie;vivod;dopsredstva = (faxmodem,
modem, fax, nety);=
record:byte;:string;:longint;:integer;:dopsredstva;;dobavleniek
(name:string);dobavleniek;fail:file of zapis;:zapis;, n, tg, max:integer;,
oplatastr:string;(fail, name);(fail);(fail, zap);zap.nom>max
then:=zap.nom;eof(fail);
{end repeat}(fail, max);('введите количество
добавляемых элементов');(n);i:=max+1 to n+max do('введите
фамилию');(zap.familiya);('введите оплату в месяц');(zap.oplata);('введите
номер');(zap.nomerATS);('выберите дополнительные средства');('1 -
факс-модем');('2 - модем');('3 - факс');('4 - отсутствует');(tg);(tg<1) or
(tg>4) then('ошибка, введите заново');(tg>=1) and (tg<=4);
{end repeat}tg of
:zap.sredstva:=faxmodem;
:zap.sredstva:=modem;
:zap.sredstva:=fax;
:zap.sredstva:=nety;;
{end case}.nom:=i;(fail, zap);;
{end for}(name);(fail);;.
Текст модуля vivod.tpu:
{end for}ord (zap.sredstva)+1 of
:sredstvastr:=' факс-модем';
:sredstvastr:=' модем';
:sredstvastr:=' факс';
:sredstvastr:=' нету';;
{end case}(zap.oplata,
oplatastr);i:=length(oplatastr) to 8 do:=oplatastr+' ';
{end for}(zap.nomerATS,
nomerATSstr);i:=length(nomerATSstr) to 9 do:=nomerATSstr+' ';[k]:='╠══════════╬═════════╬══════════╬═══════════════╣';[k+1]:='║'+zap.familiya+'║'+oplatastr+'║'+nomerATSstr+'║'+sredstvastr+'║';:=k+2;eof(fail);
{end repeat}[k]:='╚══════════╩═════════╩══════════╩═══════════════╝';
ah, 1cx, 2020h10h;
(1,1,80,25);(black);(white);;
i:=1 to 24
do(stroka[i]);(stroka[25]);:=1;:=readkey;key of
#80:if m+24<k then:=m+1;
{end if}
#72:if m>1 then:=m-1;
{end if}
#81:if m+24<k then:=m+24;m+24>k then:=k-25;
{end if};
{end if}
#73:if m>25 then:=m-24:=1;
{end if};
{end case}:=1;a:=m to m+24 do(1,
l);(stroka[a]);:=l+1;;key=#27;
{end repeat}(fail);;.
Текст модуля poisk.tpu:
unit poisk;crt;dopsredstva = (faxmodem, modem,
fax, nety);= record:byte;:string;:longint;:integer;:dopsredstva;;poiskel
(imya_faila:string);poiskel;fail:file of zapis;, i:byte;, nomstr,
oplatastr:string;:zapis;(1,12,80,25);(white);(black);;('введите номер
элемента');(n);(fail, imya_faila);(fail);;(fail, zap);(zap.nom,
nomstr);i:=length(nomstr) to 5 do:=nomstr+' ';
{end for}i:=length (zap.familiya) to 9
do.familiya:=' '+zap.familiya;
{end for}(zap.oplata,
oplatastr);i:=length(oplatastr) to 8 do:=oplatastr+' ';
{end for}ord (zap.sredstva)+1 of
:sredstvastr:=' Факс-модем';
:sredstvastr:=' Модем';
:sredstvastr:=' Факс';
:sredstvastr:=' Нету';;
{end case}zap.nom=n then('текущий элемент:');('╔══════╦══════════╦═════════╦═════════╦═══════════════╗');('║номер
║ Фамилия ║ Оплата ║Номер АТС║ Доп. средсва ║');('╠══════╬══════════╬═════════╬═════════╬═══════════════╣');('║',
nomstr, '║', zap.familiya, '║', oplatastr, '║',
zap.nomerATS:9,'║', sredstvastr:15,'║');('╚══════╩══════════╩═════════╩═════════╩═══════════════╝');;
{end if}eof(fail);
{end repeat}(fail);;.
Текст модуля perehod.tpu:
unit perehod;perehodnab (var
name:string);perehodnab;fail:file;('ўўҐ¤ЁвҐ Ё¬п д ©» ');(name);(fail,
name);(fail, 1);(fail);;.
Текст модуля serdmaxmin.tpu:
unit sredmaxmin;crt;dopsredstva = (faxmodem,
modem, fax, nety);= record:byte;:string;:longint;:integer;:dopsredstva;;naxogdenie
(name:string);naxogdenie (name:string);fail:file of zapis;:zapis;, niz, min,
max, i, j, k:integer;_vo:array [1..100] of integer;, sredn:real;,
oplatastr:string;(fail, name);(fail);('введите нижнюю границу диапазона');(niz);('введите
верхнюю границу диапазона');(verh);niz>verh then('верхяя граница должна быть
больше нижней');
{end if}verh>=niz;
{end repeat}:=1;('╔══════════╦═════════╦═══════════╦═══════════════╗');('║
Фамилия ║ Оплата ║ Номер ║ Доп.средства ║');(fail, zap);i:=length
(zap.familiya) to 9 do.familiya:=' '+zap.familiya;
{end for}ord (zap.sredstva)+1 of
:sredstvastr:=' факс-модем';
:sredstvastr:=' модем';
:sredstvastr:=' факс';
:sredstvastr:=' нету';;
{end case}(zap.oplata,
oplatastr);i:=length(oplatastr) to 8 do:=oplatastr+' ';
{end for}(zap.oplata>=niz) and
(zap.oplata<=verh) then_vo[k]:=zap.oplata;:=k+1;('╠══════════╬═════════╬═══════════╬═══════════════╣');('║',
zap.familiya, '║', oplatastr:9,'║', zap.nomerATS:11,'║',
sredstvastr, '║');;eof(fail);
{end repeat}('╚══════════╩═════════╩═══════════╩═══════════════╝');:=kol_vo[1];:=kol_vo[1];j:=1
to k-1 dokol_vo[j]>max then:=kol_vo[j];kol_vo[j]<min
then:=kol_vo[j];:=sum+kol_vo[j];;('макс. элемент - ', max);('мин. элемент - ',
min);:=sum/(k-1);('среднее - ', sredn:0:3);;;.
Текст модуля udalenie.tpu:
unit udalenie;crt;dopsredstva = (faxmodem, modem,
fax, nety);= record:byte;:string;:longint;:integer;:dopsredstva;;:file of
zapis;:dopsredstva;:string;:integer;
udalenieel (name:string; nom:integer);
udalenieel (name:string; nom:integer);;(fail,
name);(fail);(fail, nom);(fail);;.
Текст модуля menu.tpu:
menu;crt;mymenu=array [1..25] of string;vertmenu
(mas:mymenu; x, y, kol:integer; var long:integer);vertmenu;max, i, j:integer;
l:byte; key:char;:=length (mas[1]);i:=2 to kol dolength (mas[i])>max
then:=length (mas[i]);
{end if}
{end for}i:=1 to kol doj:=length (mas[i])+1 to
max do[i]:=mas[i]+' ';
{end for}
{end for}(x, y, x+max, y+kol);(blue);;i:=1 to kol
do(1, i);(mas[i]);;
{end for}:=1;(1,1);(red);(white);(mas[1]);:=long;:=readkey;key=#0
then:=readkey;
{end if}key of
#80:if long<kol then:=long+1:=1;
{end if}
#72:if long>1 then:=long-1:=kol;
{end if}
#13:exit;;
{end case}(1, l);(white);(blue);(mas[l]);(1,
long);(red);(white);(mas[long]);false
{end repeat};.