Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Описание программного комплексаСодержание книги
Поиск на нашем сайте
Описание программного комплекса Структура программного комплекса Программа состоит из четырех модулей: главной программы 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; просмотров: 84; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.11 (0.008 с.) |