Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Описание программного комплекса↑ Стр 1 из 2Следующая ⇒ Содержание книги
Поиск на нашем сайте
Описание программного комплекса Структура программного комплекса Программа состоит из четырех модулей: главной программы Main, модуля текстовых утилит и ввода-вывода Util, модуля интерактивного меню TextMenu, модуля элементов данных и их массива Transp. Главная программа содержит обработку ввода пользователя и реакцию на него путем вызова соответствующих процедур и функций модуля данных. Текстовый файл, в котором программа хранит данные, имеет следующий формат: <номер маршрута>|<кол-во единиц техники>|<длина пути>\n … <номер маршрута>|<кол-во единиц техники>|<длина пути>\n Файл хранится в кодировке cp866, также известной как DOS Russian и OEM (стандартная кодировка для русского языка в системе MS-DOS). Модуль функций-утилит Util function dup(ch: char; count: byte): string; Функция создает строку из count символов ch. Нужна для заполнения таблиц: рисования рамок и дополнения значений до необходимой ширины. function fit(str: string; width: byte): string; Функция возвращает строку str, обрезанную или наоборот дополненную пробелами до ширины width. Используется для красивого вывода в табличку на экран с ограниченной шириной. function IntToStr(value: integer): string; Переводит целое число value в строковое представление. Используется для конкатенации строк и чисел вперемешку с помощью операции +. function StrToInt(str: string; var value: integer): boolean; Функция пытается разобрать строку str как целое число и сохранить полученное значение в переменной value. В случае успеха возвращает значение true, иначе false. function RealToStr(value: real): string; Переводит вещественное число value в строковое представление. Используется для конкатенации строк и чисел вперемешку с помощью операции +. function StrToReal(str: string; var value: real): boolean; Функция пытается разобрать строку str как вещественное число и сохранить полученное значение в переменной value. В случае успеха возвращает значение true, иначе false. function OpenFileRead(fname: string; var f: text): boolean; Функция пытается открыть для чтения текстовый файл с именем fname и сохранить его состояние в переменной f. В случае успеха возвращает true, иначе false. function OpenFileWrite(fname: string; var f: text): boolean; Функция пытается открыть для записи текстовый файл с именем fname и сохранить его состояние в переменной f. В случае успеха возвращает true, иначе false. Если файл с таким именем существовал, его содержимое пропадет. function ReadFileString(var f: text; var target: string): boolean; Функция пытается прочитать строку из текстового файла f и сохранить ее в переменной target. В случае успеха возвращает true, иначе false. function CloseFile(var f: text): boolean; Функция закрывает файл f. В случае успеха возвращает true, иначе false. function InputString(prompt: string): string; Функция выводит пользователю приглашение с описанием того, что требуется ввести, в параметре prompt, и читает введенную строку, возвращая ее. procedure Report(errmsg: string); Процедура выводит сообщение об ошибке errmsg красным цветом для акцентирования внимания пользователя. Исходный текст модуля Util приведен в приложении Г. Загрузка файлов Рисунок 3 – Загрузка массива данных с диска Для осуществления загрузки файлов у пользователя запрашивается дополнительная информация – имя файла. В случае возникновения ошибки загрузки, выводится сообщение об ошибке (рисунок 4). В случае успешной загрузки новое содержимое массива данных выводится на экран. Рисунок 4 – Сообщение об ошибке загрузки файла Редактирование записи При выборе команды редактирования записи требуется ввести номер записи, затем новые значения полей в записи. При этом при вводе пустой строки в записи будет оставлено старое значение. В случае ошибки оригинальные данные редактируемой записи не будут затронуты. Рисунок 7 – Массив после редактирования записи Сортировка записей Рисунок 8 – Меню выбора поля и направления сортировки Рисунок 9 – Отсортированный по возрастанию количества единиц техники массив При выборе пункта сортировки пользователю выводятся дополнительные меню для выбора поля сортировки (номер, количество техники или длина маршрута) и направления сортировки (по возрастанию или убыванию). Меню работают полностью аналогично главному меню. Сохранение массива данных Рисунок 11 – Сохранение массива записей под новым (или старым) именем При выборе команды записи пользователю задается вопрос, хочет ли он переименовать файл или сохранить изменения в тот же самый (ранее загруженный) файл. Заключение В процессе выполнения курсовой работы на языке Паскаль в системе Borland Turbo Pascal 7.0 было написано приложение, обрабатывающее массив записей, описывающих маршруты общественного транспорта и содержащие поля для номера (строка), количества единиц техники на маршруте (целое число) и длины маршрута (вещественное число). Приложение выполняет все запросы, требуемые условием задачи. Запросы выбираются пользователем путем выбора соответствующих пунктов в консольном меню с выбором желаемого пункта путем ввода его номера. Программа содержит подсказки пользователю и обработку ошибок ввода. В процессе работы были изучены приемы работы с массивами записей, функции для работы с консолью, способы преобразования данных между строковым и числовым представлениями, базовые приемы работы с объектно-ориентированными расширениями Borland Pascal 7.0. Список использованных источников 1 Кинг, Д. Создание эффективного программного обеспечения: Пер. с англ. / Дэвид Кинг – М.: Мир, 1991. – 288 с., ил. ISBN 5-03-002005-5 2 Кнут, Д. Э. Искусство программирования: т. 3 – Сортировка и поиск / Дональд Э. Кнут. – М.: Мир, 1978. – 335 с. 3 Рапаков, Г. Г., Ржеуцкая, С. Ю. Программирование на языке Pascal. – СПб.: БХВ-Петербург, 2004. – 351 с. 4 Фаронов В. В. Turbo Pascal 7.0. Учебный курс. // В. В. Фаронов. – М.: КноРус. – 2011. – 368 с. 5 Borland Pascal. Руководство пользователя [Электронный ресурс] – 1994 – Режим доступа: http://www.helloworld.ru/texts/comp/lang/pascal/bp70/index.htm – Дата доступа: 09.03.2017 Приложение А (***************************************************************************** Главная программа. Отображает меню и выполняет запросы пользователя.
*****************************************************************************) PROGRAM Main;
USES Util, TextMenu, Transp;
VAR main_menu: PMenu; load_item: integer; save_item: integer; view_item: integer; add_item: integer; edit_item: integer; sort_item: integer; del_item: integer; selection: integer; field_menu: PMenu; { меню поля сортировки } num_item: integer; cnt_item: integer; len_item: integer; dir_menu: PMenu; { меню направления сортировки } asc_item: integer; { по возр. } desc_item: integer; { по убыв. } filename: string; { имя файла текущего загруженного или пустая }
procedure view; begin viewItems; end;
procedure load; var f: text; okay: boolean; fname: string; tmp: Marshrut; data: string; begin fname:= InputString('имя файла'); okay:= OpenFileRead(fname,f); if okay then begin clearItems; repeat ReadLn(f,data); if length(data)>0 then begin okay:= readItem(tmp,data); if okay then okay:= addItem(tmp); end; until EOF(f) or (not okay); CloseFile(f); end; if not okay then Report('* Ошибка чтения!') else begin filename:= fname; view; end; end;
procedure save; var f: text; okay: boolean; fname: string; sz, i: integer; tmp: Marshrut; begin if length(filename)>0 then begin fname:= InputString('имя файла ('+filename+')'); if length(fname)=0 then fname:= filename; end else begin fname:= InputString('имя файла'); end; okay:= OpenFileWrite(fname,f); if okay then begin sz:= getSize; for i:=1 to sz do begin okay:= getItem(i,tmp); WriteLn(f,writeItem(tmp)); end; CloseFile(f); end; if not okay then Report('* Ошибка записи!') else begin filename:= fname; WriteLn('Операция выполнена успешно.'); end; end;
procedure add; var tmp: Marshrut; okay: boolean; buf: string; begin okay:= true; tmp.number:= InputString('номер маршрута'); okay:= StrToInt(InputString('кол-во единиц техники'),tmp.count); if okay then okay:= StrToReal(InputString('длину маршрута'),tmp.length_km); if okay then okay:= addItem(tmp); if okay then view else Report('Операция отменена'); end;
procedure edit; var tmp: Marshrut; okay: boolean; buf: string; idx: integer; begin okay:= StrToInt(InputString('индекс редактируемого элемента'),idx); if okay then okay:= getItem(idx,tmp); if okay then begin buf:= InputString('номер ('+tmp.number+')'); if length(buf)>0 then tmp.number:= buf; end; if okay then begin if okay then buf:= InputString('кол-во единиц техники ('+IntToStr(tmp.count)+')'); if okay then begin if length(buf)>0 then okay:= StrToInt(buf,tmp.count) end; end; if okay then begin if okay then buf:= InputString('длина маршрута ('+RealToStr(tmp.length_km)+')'); if okay then begin if length(buf)>0 then okay:= StrToReal(buf,tmp.length_km) end; end; if okay then okay:= setItem(idx,tmp); if okay then view else Report('Операция отменена'); end;
procedure sort; var field: integer; dir: integer; okay: boolean; begin field:= field_menu^.SelectItem; okay:= field<>EXIT_ITEM; if okay then dir:= dir_menu^.SelectItem; if okay then okay:= dir<>EXIT_ITEM; if okay then begin if field=num_item then sortItemsByNumber(dir=desc_item) else if field=cnt_item then sortItemsByCount(dir=desc_item) else if field=len_item then sortItemsByLength(dir=desc_item); view; end else Report('Операция отменена'); end;
procedure delToEnd; var index: integer; okay: boolean; begin okay:= StrToInt(InputString('индекс первого удаляемого элемента'),index); if okay then okay:= trimItems(index); if okay then view else Report('Операция отменена'); end;
BEGIN main_menu:= New(PMenu,Init('Главное меню','Выход')); load_item:= main_menu^.AddItem('Загрузить файл'); save_item:= main_menu^.AddItem('Сохранить файл'); view_item:= main_menu^.AddItem('Просмотреть элементы'); add_item:= main_menu^.AddItem('Добавить элемент'); edit_item:= main_menu^.AddItem('Изменить элемент'); sort_item:= main_menu^.AddItem('Сортировать элементы'); del_item:= main_menu^.AddItem('Удалить элементы'); field_menu:= New(PMenu,Init('Поле сортировки','Отмена')); num_item:= field_menu^.AddItem('Номер маршрута'); cnt_item:= field_menu^.AddItem('Кол-во единиц техники'); len_item:= field_menu^.AddItem('Длина маршрута'); dir_menu:= New(PMenu,Init('Порядок сортировки','Отмена')); asc_item:= dir_menu^.AddItem('По возрастанию'); desc_item:= dir_menu^.AddItem('По убыванию'); filename:= '';
repeat selection:= main_menu^.SelectItem; if selection=load_item then load else if selection=save_item then save else if selection=view_item then view else if selection=add_item then add else if selection=edit_item then edit else if selection=sort_item then sort else if selection=del_item then delToEnd; until selection=EXIT_ITEM;
Dispose(dir_menu,Done); Dispose(field_menu,Done); Dispose(main_menu,Done); END. Приложение Б (***************************************************************************** Определения записи о транспорте, и функции доступа к массиву этих записей. *****************************************************************************) UNIT Transp;
INTERFACE
CONST MAX_SIZE = 128;
TYPE Marshrut = record number: string; count: integer; length_km: real; end;
(** * Создание маршрута из строки (прочитанной из файла например). *) function readItem(var item: Marshrut; str: string): boolean; (** * Получение строки для записи в файл. *) function writeItem(var item: Marshrut): string; (** * Размер массива. *) function getSize: integer; (** * Очистка массива. *) procedure clearItems; (** * Удаление элемемнтов начиная с startindex до конца массива. *) function trimItems(startindex: integer): boolean; (** * Добавление элемента в конец массива. *) function addItem(var item: Marshrut): boolean; (** * Редактирование элемента в позиции index. *) function setItem(index: integer; var item: Marshrut): boolean; (** * Редактирование элемента в позиции index. *) function getItem(index: integer; var item: Marshrut): boolean; (** * Просмотр всех элементов. *) procedure viewItems; (** * Сортировка элементов по номеру. desc = true - по убыванию. *) procedure sortItemsByNumber(desc: boolean); (** * Сортировка элементов по кол-ву. desc = true - по убыванию. *) procedure sortItemsByCount(desc: boolean); (** * Сортировка элементов по длине. desc = true - по убыванию. *) procedure sortItemsByLength(desc: boolean);
IMPLEMENTATION
USES Util;
VAR items: array [1..MAX_SIZE] of Marshrut; item_count: integer;
function readItem(var item: Marshrut; str: string): boolean; var rest: string; okay: boolean; tmp: Marshrut; strpos: byte; begin okay:= true; rest:= str; strpos:= Pos('|',rest); if strpos>0 then tmp.number:= Copy(rest,1,strpos-1) else okay:= false; if okay then begin rest:= Copy(rest,strpos+1,length(rest)-strpos); strpos:= Pos('|',rest); if strpos>0 then okay:= StrToInt(Copy(rest,1,strpos-1),tmp.count) else okay:= false; end; if okay then begin rest:= Copy(rest,strpos+1,length(rest)-strpos); okay:= StrToReal(Copy(rest,1,length(rest)),tmp.length_km); end; if okay then item:= tmp; readItem:= okay; end;
function writeItem(var item: Marshrut): string; var numstr: string; begin writeItem:= item.number + '|' + IntToStr(item.count) + '|' + RealToStr(item.length_km); end;
function getSize: integer; begin getSize:= item_count; end;
procedure clearItems; begin item_count:= 0; end;
function trimItems(startindex: integer): boolean; begin if (startindex<0) or (startindex>item_count) then trimItems:= false else begin item_count:= startindex-1; trimItems:= true; end; end;
function addItem(var item: Marshrut): boolean; begin if item_count>=MAX_SIZE then addItem:= false else begin inc(item_count); items[item_count]:= item; addItem:= true; end; end;
function setItem(index: integer; var item: Marshrut): boolean; begin if (index<1) or (index>item_count) then setItem:= false else begin items[index]:= item; setItem:= true; end; end;
function getItem(index: integer; var item: Marshrut): boolean; begin if (index<1) or (index>item_count) then getItem:= false else begin item:= items[index]; getItem:= true; end; end;
procedure viewItems; var i: integer; begin WriteLn('+-----+------------+-------------+-----------+'); WriteLn('| | Маршрут | Ед. техники | Длина, км |'); WriteLn('+-----+------------+-------------+-----------+'); for i:=1 to item_count do begin WriteLn('| ',i:3, ' | ',fit(items[i].number,10), ' | ',items[i].count:11, ' | ',items[i].length_km:9:2,' |'); end; WriteLn('+-----+------------+-------------+-----------+'); WriteLn('Маршрутов: ',item_count); end;
procedure sortItemsByNumber(desc: boolean); var i,j: integer; tmp: Marshrut; begin if desc then begin for i:=1 to item_count-1 do begin for j:=i+1 to item_count do begin if items[i].number<items[j].number then begin tmp:= items[i]; items[i]:= items[j]; items[j]:= tmp; end; end; end; end else begin for i:=1 to item_count-1 do begin for j:=i+1 to item_count do begin if items[i].number>items[j].number then begin tmp:= items[i]; items[i]:= items[j]; items[j]:= tmp; end; end; end; end; end;
procedure sortItemsByCount(desc: boolean); var i,j: integer; tmp: Marshrut; begin if desc then begin for i:=1 to item_count-1 do begin for j:=i+1 to item_count do begin if items[i].count<items[j].count then begin tmp:= items[i]; items[i]:= items[j]; items[j]:= tmp; end; end; end; end else begin for i:=1 to item_count-1 do begin for j:=i+1 to item_count do begin if items[i].count>items[j].count then begin tmp:= items[i]; items[i]:= items[j]; items[j]:= tmp; end; end; end; end; end;
procedure sortItemsByLength(desc: boolean); var i,j: integer; tmp: Marshrut; begin if desc then begin for i:=1 to item_count-1 do begin for j:=i+1 to item_count do begin if items[i].length_km<items[j].length_km then begin tmp:= items[i]; items[i]:= items[j]; items[j]:= tmp; end; end; end; end else begin for i:=1 to item_count-1 do begin for j:=i+1 to item_count do begin if items[i].length_km>items[j].length_km then begin tmp:= items[i]; items[i]:= items[j]; items[j]:= tmp; end; end; end; end; end;
BEGIN item_count:= 0; END. Приложение В (************************************************************************* Управление текстовым меню с пунктами.
*************************************************************************) UNIT TextMenu;
INTERFACE
CONST MAX_ITEMS = 128; EXIT_ITEM = 0;
TYPE TMenu = object items: array [0..MAX_ITEMS] of string; numitems: integer; menuname: string;
constructor Init(name, quit_label: string); destructor Done;
function AddItem(name: string): integer; function SelectItem: integer; end; PMenu = ^TMenu;
IMPLEMENTATION
USES Util;
procedure printItem(index: integer; item: string); begin WriteLn(index:2,'> ',item); end;
constructor TMenu.Init(name, quit_label: string); begin items[0]:= quit_label; numitems:= 0; menuname:= name; end;
destructor TMenu.Done; begin end;
function TMenu.AddItem(name: string): integer; begin if numitems<MAX_ITEMS then begin inc(numitems); items[numitems]:= name; AddItem:= numitems; end else AddItem:= EXIT_ITEM; end;
function TMenu.SelectItem: integer; var i: integer; input: string; select: integer; legal: boolean; begin WriteLn('======== ',menuname,' ========'); for i:=1 to numitems do begin printItem(i,items[i]); end; printItem(0,items[0]);
legal:= true; repeat if not legal then Report('* Ошибка выбора!'); Write('> '); ReadLn(input); legal:= StrToInt(input,select) and (select>=0) and (select<=numitems); until legal;
WriteLn('========'); SelectItem:= select; end;
BEGIN END. Приложение Г (***************************************************************************** Утилиты для приведения типов и пр.
*****************************************************************************) UNIT Util;
INTERFACE
function dup(ch: char; count: byte): string; function fit(str: string; width: byte): string; function IntToStr(value: integer): string; function StrToInt(str: string; var value: integer): boolean; function RealToStr(value: real): string; function StrToReal(str: string; var value: real): boolean; function OpenFileRead(fname: string; var f: text): boolean; function OpenFileWrite(fname: string; var f: text): boolean; function ReadFileString(var f: text; var target: string): boolean; function CloseFile(var f: text): boolean; function InputString(prompt: string): string; procedure Report(errmsg: string);
IMPLEMENTATION
USES CRT;
function dup(ch: char; count: byte): string; var i: integer; { счетчик } res: string; { результат } begin res:= ''; for i:=1 to count do res:= res+ch; dup:= res; end;
function fit(str: string; width: byte): string; var l: integer; { длина строки } begin l:= length(str); { вычисляем длину } if l<width then { если длина меньше нужной ширины } fit:= str+dup(' ',width-l) { дополняем пробелами } else fit:= Copy(str,1,width); { иначе обрезаем } end;
function IntToStr(value: integer): string; var retval: string; begin Str(value,retval); IntToStr:= retval; end;
function StrToInt(str: string; var value: integer): boolean; var errorc: integer; begin errorc:= 0; Val(str,value,errorc); StrToInt:= (errorc = 0); end;
function RealToStr(value: real): string; var retval: string; begin Str(value,retval); RealToStr:= retval; end;
function StrToReal(str: string; var value: real): boolean; var errorc: integer; begin errorc:= 0; Val(str,value,errorc); StrToReal:= (errorc = 0); end;
function OpenFileRead(fname: string; var f: text): boolean; begin {$I-} Assign(f,fname); Reset(f); {$I+} if IOResult<>0 then OpenFileRead:= false else OpenFileRead:= true; end;
function OpenFileWrite(fname: string; var f: text): boolean; begin {$I-} Assign(f,fname); Rewrite(f); {$I+} if IOResult<>0 then OpenFileWrite:= false else OpenFileWrite:= true; end;
function ReadFileString(var f: text; var target: string): boolean; begin {$I-} ReadLn(f,target); {$I+} if IOResult<>0 then ReadFileString:= false else ReadFileString:= true; end;
function CloseFile(var f: text): boolean; begin Close(f); end;
function InputString(prompt: string): string; var ret: string; begin Write('Введите ',prompt,': '); ReadLn(ret); InputString:= ret; end;
procedure Report(errmsg: string); var oldattr: byte; begin oldattr:= TextAttr; TextAttr:= (oldattr and $F0) or $04; WriteLn(errmsg); TextAttr:= oldattr; end;
END. Приложение Д 1 25а|6| 1.2600000000E+01 25|14| 1.1500000000E+01 5|8| 1.4900000000E+01 3|6| 6.7000000000E+00 1|8| 7.2000000000E+00 16|10| 8.0000000000E+00 10|4| 7.6000000000E+00 2 25а|6|12.6 25|14|11.5 5|8|14.9 3|6|6.7 1|8|7.2 16|10|8.0 10|4|7.6 3 15а|3| 6.3800000000E+00 10|4| 7.6000000000E+00 25а|6| 1.2600000000E+01 3|6| 6.7000000000E+00 Описание программного комплекса
|
||||
Последнее изменение этой страницы: 2021-05-27; просмотров: 57; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.59.69.58 (0.008 с.) |