- •Постановочная часть
- •Теоретическое введение
- •Пользовательский интерфейс
- •Анализ технического задания
- •Входные данные, форма представления результатов
- •Спецификация на разрабатываемую программу в целом
- •Разработочная часть
- •Обоснование структуры программы
- •Модульная структура программы
- •Блок схемы алгоритма шейкерной сортировки:
- •Спецификация на программные модули
- •2.2.1 Интерфейсная часть
- •2.2.2 Обрабатывающая часть
- •Результативная часть
- •3.1 Результаты тестирования
- •Описание пользовательского интерфейса
- •Инструкция пользователю
- •Заключения, выводы
- •Литература
- •Приложения
- •Документированный текст программы
- •Основная программа
- •1.2 Модули
Инструкция пользователю
Для активации программы, необходимо запустить файл R_I.exe. Данные вводятся заранее в специальные файлы с расширением .DAT. Для навигации по меню используются клавиши стрелок «», «» (по горизонтальному) и «», «» (по вертикальному). Опции главного меню:
Файл – сохранить в файл, загрузить из файла, выход.
Редактирование – добавить запись, изменить запись, удалить запись.
Действия – поиск, сортировка, вывод на экран.
О программе – вывод сведений о программе
Для выбора одной из опций меню или диалога необходимо нажать «Enter. Для выбора списка необходимо загрузить файл, в котором он хранится. Для этого выбираем Файл / Загрузить из файла. Для изменения, добавления, удаления записи необходимо выбрать соответствующую опцию вертикального меню Редактирование. Для сортировки списка, необходимо выбрать опцию Действия / Сортировка. Для поиска записи нужно выбрать Действия / Поиск и далее указать, по какому полю будет вестись поиск. Для вывода списка на экран выбираем Действия / Вывод на экран. Для сохранения списка выбираем Файл / Сохранить в файл.
Заключения, выводы
Данная программа полностью соответствует техническому заданию. На примере программы показаны приемы работы с такими структурами данных как записи, массивы и модули в языке Pascal. Реализован пользовательский интерфейс, значительно упрощающий работу пользователя с программой, а также структурирующий сам процесс программирования (за счет использования отдельного модуля). Пользовательский интерфейс реализован в текстовом режиме. Программа разрабатывалась поэтапно, были разделены процессы программирования обработки записей (запись новых, удаление, изменение записей в массиве и т.п.), пользовательского интерфейса и алгоритмов основной обработки (сортировка и выборка). На каждом этапе проводилось тестирование отдельных процедур, проверка правильности их совместной работы, а также всей программы в целом. Результаты тестирования показали устойчивую работу программы во всех режимах. Параллельно было сделано исследование в области алгоритмов сортировок, в ходе которого были выяснены основные принципы и аспекты эффективности сортировок. Таким образом, была проделана большая работа, основными результатами которой можно считать:
разработку алгоритмов простых методов сортировки;
разработку модуля пользовательского интерфейса, который может применяться и в проектирование многих других программ;
разработка алгоритмов обработки массивов записей как баз данных;
развитие умений работы с выше указанными структурами языка Pascal.
Литература
Фаронов B.B. Турбо Паскаль 7.0 Начальный курс. Учебное пособие. - M.: «Нолидж», 1997г., 616 с., ил.
Приложения
Документированный текст программы
Основная программа
Program _Main;
Uses
Menu,Types,Cursor;
Var
N:Word;
List:TList;
Begin
N:=0;
MainMenu(N,List);
ShowCursor
End.
1.2 Модули
Unit Types;
Interface
Const
N_Max=500;
Type
TRange=1..N_Max;
TCar=Record
Number:String[10]; {номер машины}
Mark:String[20];{марка машины}
Error:String[45] {неисправность машины}
End;
TList=Array[TRange] Of TCar;{список машин}
Procedure OutLine;
Procedure WaitForNextAction;
Function NextOut(Num:Byte):Boolean;
Implementation
Uses
Crt;
Function NextOut(Num:Byte):Boolean;
Var
WaitInput:Boolean;
C:Char;
Begin
GoToXY(1,Num);OutLine;
TextColor(LightGray+Blink);
Write('Следующая страница: <пробел>; Отмена: ESC');
While WaitInput Do Begin
While Not KeyPressed Do;
C:=Readkey;
WaitInput:=Not(C In [#32,#27])
End;
NextOut:=C=#32
End;
Procedure OutLine;
Var
I:Byte;
Begin
TextColor(LightGray);
For I:=1 To 80 Do Write('-');
End;
Procedure WaitForNextAction;
Begin
OutLine;
Write('Для продолжения нажмите любую клавишу');
While Not KeyPressed Do;
While KeyPressed Do ReadKey
End;
End.
Unit Cursor;
Interface
Procedure ShowCursor;
Procedure HideCursor;
Implementation
Uses
Crt,Dos;
Procedure SetCursorSize(Start,Finish:Byte);
Var
Reg:Registers;
Begin
With Reg Do Begin
AH:=$01;
CH:=Start;
CL:=Finish
End;
Intr($10,Reg)
End;
Procedure ShowCursor;
Var
SE:Word;
Begin
If LastMode>=Font8x8 Then
SE:=$0507
Else
If LastMode=Mono Then
SE:=$0B0C
Else
SE:=$0607;
SetCursorSize(Hi(SE),Lo(SE))
End;
Procedure HideCursor;
Begin
SetCursorSize(32,0)
End;
End.
Unit Files;
Interface
Uses
Types;
Procedure DoSave(N:Word;Var List:TList);
Procedure DoLoad(Var N:Word;Var List:TList);
Implementation
Uses
Crt,Cursor;
Procedure SaveToFile(FileName:String;N:Word;Var List:TList);
Var
F:File;
I:Word;
Begin
Assign(F,FileName);
ReWrite(F);
BlockWrite(F,N,SizeOf(N)); {запоминам число записей}
For I:=1 To N Do {запоминаем сами записи}
BlockWrite(F,List[I],SizeOf(TCar));
Close(F)
End;
Procedure DoSave(N:Word;Var List:TList);
Var
FName:String;
Begin
ShowCursor;
TextBackGround(Blue);
ClrScr;TextColor(LightGray);
GoToXY(30,1);WriteLn('Сохранение:');
OutLine;
TextColor(White);
WriteLn('Введите имя файла в который нужно сохранить данные');
TextColor(Yellow);ReadLn(FName);
SaveToFile(FName,N,List);
OutLine;
TextColor(Brown);WriteLn('Данные успешно записаны в файл ',FName);
WaitForNextAction
End;
Procedure LoadFromFile(FileName:String;Var N:Word;Var List:TList);
Var
F:File;
I:Word;
Begin
Assign(F,FileName);
ReSet(F);
BlockRead(F,N,SizeOf(N));
For I:=1 To N Do
BlockRead(F,List[I],SizeOf(TCar));
Close(F)
End;
Procedure DoLoad(Var N:Word;Var List:TList);
Var
FName:String;
Begin
ShowCursor;
TextBackGround(Blue);
ClrScr;TextColor(LightGray);
GoToXY(30,1);WriteLn('Загрузка');
OutLine;
TextColor(White);
WriteLn('Введите имя файла из которого нужно прочитать данные');
TextColor(Yellow);ReadLn(FName);
LoadFromFile(FName,N,List);
OutLine;
TextColor(Brown);WriteLn('Данные успешно прочитаны из файла ',FName);
WaitForNextAction
End;
End.
Unit Menu;
Interface
Uses
Types;
Function WorkWithMenu:Byte;
Procedure MainMenu(Var N:Word;Var List:TList);
Implementation
Uses
Crt,Cursor,Files,Actions;
Procedure OutMenu(Active:Byte;Finish:Boolean);
Type
TMenuItems=Array[1..2] Of String;
Const
ItemsMenu:TMenuItems=('По виду неисправности',
'По номеру');
Var
I,J:Byte;
Begin
For I:=1 To 2 Do Begin {вывод пунктов меню}
GoToXY(1,I+4);
If Active=I Then {если текщий выводимый элемент выбран}
TextBackGround(White)
Else
TextBackGround(Blue);
TextColor(Black);
Write(I,'. ');
If (Active=I) And (Not Finish) Then {если текущий выводимый элемент выбран}
TextColor(Black+Blink);
Write(ItemsMenu[I]);
J:=Length(ItemsMenu[I]);
While J<77 Do Begin
Inc(J);
Write(' ')
End
End
End;
Function WorkWithMenu:Byte;
Var
CurSelected:Byte;
Begin
CurSelected:=1; (*по умолчанию выделяем первый пункт*)
While True Do Begin {безконечный цикл}
OutMenu(CurSelected,False);
While Not KeyPressed Do;
Case ReadKey Of
#0: {управляющая клавиша (с двойным кодом)}
Case ReadKey Of
#72:CurSelected:=1; {вверх}
#80:CurSelected:=2; {вниз}
End;
#13: {клавиша Enter}
Begin
WorkWithMenu:=CurSelected; (*запоминаем что выбрали*)
Break {выход из безконечного цикла}
End
End
End;
OutMenu(CurSelected,True);
WriteLn;
TextColor(LightGray); (*восстанавливаем прежную*)
TextBackGround(Blue) (* цветовую схему *)
End;
Procedure MainMenu(Var N:Word;Var List:TList);
Var
CurSelected:Byte;
SelectedSub:Byte;
Executing:Boolean;
ExecMenu,ExecSubMenu:Boolean;
OutSubMenu:Byte;
Procedure OutMainMenu(ForExec:Byte);
Const
MenuItems:Array[1..4] Of String=
('Файл','Редактирование','Действия','О программе');
MenuSubItems:Array[1..3,1..3] Of String=
(('Сохранить в файле','Загрузить из файла','Выход'),
('Добавить запись','Изменить запись','Удалить запись'),
('Поиск','Сортировка','Вывод на экран'));
Var
I,J:Byte;
MaxStr:Byte;
S:String;
SubItemsBegin:Byte;
Begin
HideCursor;
TextBackGround(Black);
ClrScr;
For I:=1 To 4 Do Begin
If I=CurSelected Then
Begin
TextBackGround(Green);
TextColor(Black);
End
Else Begin
TextBackGround(LightGray);
TextColor(Black);
End;
Write(' ',MenuItems[I],' ');
End;
TextBackGround(LightGray);
TextColor(Black);
While WhereX<69 Do Write(' ');
TextColor(Red);
Write('version: 1.1');
TextBackGround(Black);
If ForExec In [1..3] Then Begin
If ForExec>1 Then
For I:=1 To Pred(ForExec) Do
For J:=1 To Length(MenuItems[I])+4 Do
Write(' ');
If ForExec=1 Then
SubItemsBegin:=1
Else
SubItemsBegin:=WhereX+1;
TextBackGround(LightGray);
MaxStr:=Length(MenuSubItems[ForExec,1]);
For I:=2 To 3 Do
If Length(MenuSubItems[ForExec,I])>MaxStr Then
MaxStr:=Length(MenuSubItems[ForExec,I]);
MaxStr:=MaxStr+3;
For I:=1 To 3 Do Begin
If SelectedSub=I Then
Begin
TextBackGround(Brown);
TextColor(Black);
End
Else Begin
TextBackGround(LightGray);
TextColor(Black);
End;
GoToXY(SubItemsBegin,I+1);
S:=' '+MenuSubItems[ForExec,I];
While Length(S)<MaxStr Do
S:=S+' ';
Write(S);
End;
End
End;
Procedure MoveInMenu;
Var
C:Char;
Begin
While Not KeyPressed Do;
C:=ReadKey;
Case C Of
#13: {Enter}
If Not ExecMenu Then
Begin
ExecMenu:=True;
SelectedSub:=0;
End
Else
ExecSubMenu:=True;
#27:
Executing:=False;
#0: {стрелки}
Begin
C:=ReadKey;
Case C Of
#75:
Begin {<-}
If CurSelected>1 Then
Dec(CurSelected);
ExecMenu:=False;
End;
#77: {->}
Begin
If CurSelected<4 Then
Inc(CurSelected);
ExecMenu:=False;
End;
#72: {Up}
If ExecMenu Then Begin
If SelectedSub>1 Then
Dec(SelectedSub)
End;
#80: {Down}
If ExecMenu Then Begin
If SelectedSub<3 Then
Inc(SelectedSub)
End
End;
End;
End;
End;
Procedure ExecuteActions(Var N:Word;Var List:TList);
Begin
Case CurSelected Of {выделен пункт меню}
1:{файл}
Case SelectedSub of
1:{сохранить в файле}
DoSave(N,List);
2:{загрузить из файла}
DoLoad(N,List);
3:{выход}
Executing:=False
End;
2:{редактирование}
Case SelectedSub of
1:{добавить}
AddDataFromKeyBoard(N,List);
2:{изменить}
DoEdit(N,List);
3:{удалить}
DoDel(N,List)
End;
3: {действия}
Case SelectedSub of
1:{поиск}
Find(N,List);
2:{сортировка}
Sorting(N,List);
3:{вывод на экран}
OutListToScreen(N,List)
End;
4: {о программе}
AboutProgram
End;
CurSelected:=1;
SelectedSub:=1;
OutSubMenu:=0;
ExecMenu:=False;
ExecSubmenu:=False;
End;
Begin
Executing:=True;
CurSelected:=1;
SelectedSub:=1;
OutSubMenu:=0;
ExecMenu:=False;
ExecSubmenu:=False;
OutMainMenu(OutSubMenu);
While Executing Do Begin
MoveInMenu;
If ExecMenu Then
OutSubMenu:=CurSelected
Else
OutSubMenu:=0;
If (ExecSubMenu) Or (ExecMenu And (CurSelected=4)) Then
ExecuteActions(N,List);
OutMainMenu(OutSubMenu);
End;
End;
End.
Unit Actions;
Interface
Uses
Types;
Procedure AboutProgram;
Procedure AddDataFromKeyBoard(Var N:Word;Var List:TList);
Procedure OutListToScreen(N:Word;Var List:TList);
Procedure DoEdit(Var N:Word;Var List:TList);
Procedure DoDel(Var N:Word;Var List:TList);
Procedure Find(N:Word;Var List:TList);
Procedure Sorting(N:Word;Var List:TList);
Implementation
Uses
Crt,Cursor,Menu;
Procedure AboutProgram;
Begin
TextBackGround(Blue);
ClrScr;TextColor(LightGray);
GoToXY(30,1);WriteLn('О программе:');
OutLine;
TextColor(White);
WriteLn('Программа создана Итунином Д.Л.');
WriteLn('студентом группы ПЭ-04');
WriteLn('2005г');
WaitForNextAction
End;
Procedure AddDataFromKeyBoard(Var N:Word;Var List:TList);
Function ContinueInput:Boolean;
Var
C:Char;
Result,WaitInput:Boolean;
Begin
TextColor(LightGray);Write('Продолжить ввод записей? (Y/N) ');
WaitInput:=True;
While WaitInput Do Begin
While Not KeyPressed Do;
C:=Readkey;
WaitInput:=False;
Case C Of
'Y','y','н','Н':Result:=True;
'N','n','Т','т':Result:=False;
Else WaitInput:=True
End
End;
If Result Then
Write('Y')
Else
Write('N');
Delay(2345);
ContinueInput:=Result
End;
Var
CanNextRecord:Boolean;
CurN:Word;
Begin
ShowCursor;
TextBackGround(Blue);
CurN:=N;CanNextRecord:=True;
While CanNextRecord Do Begin
Inc(CurN);
ClrScr;
GoToXY(29,1);TextColor(LightGray);WriteLn('Ввод данных с клавиатуры');
OutLine;
TextColor(Brown);WriteLn('Запись '#252,CurN,
' (свободно для ',Succ(N_Max-CurN),' записей)');
OutLine;
TextColor(White);Write('Номер машины: ');
TextColor(Yellow);ReadLn(List[CurN].Number);
TextColor(White);Write('Марка машины: ');
TextColor(Yellow);ReadLn(List[CurN].Mark);
TextColor(White);Write('Неисправность (Enter - нет неисправности): ');
TextColor(Yellow);ReadLn(List[CurN].Error);
OutLine;
CanNextRecord:=ContinueInput
End;
N:=CurN
End;
Procedure OutListToScreen(N:Word;Var List:TList);
Var
I:Word;
Num:Byte;
Procedure OutTitle;
Begin
ClrScr;
GoToXY(33,1);TextColor(LightGray);WriteLn('Вывод данных:');
OutLine;
TextColor(Yellow);
Num:=3;
End;
Begin
TextBackGround(Blue);
OutTitle;
For I:=1 To N Do Begin
GoToXY(1,Num);Write(List[I].Number);
GoToXY(12,Num);Write(List[I].Mark);
GoToXY(33,Num);Write(List[I].Error);
Inc(Num);
If Num>23 Then
If NextOut(Num) Then
OutTitle
Else
Break;
End;
If I=N Then Begin
WriteLn;
WaitForNextAction
End
End;
Procedure DeleteRecord(Var N:Word;Var List:TList;NumDel:Word);
Begin
Move(List[NumDel+1],List[NumDel],(N-NumDel)*SizeOf(TCar));
Dec(N)
End;
Procedure ChangeRecord(N:Word;Var List:TList;NumEdit:Word);
Begin
TextBackGround(Blue);
ClrScr;
GoToXY(29,1);TextColor(LightGray);WriteLn('Редактирование записи');
OutLine;
TextColor(Brown);WriteLn('Запись '#252,NumEdit);
OutLine;
TextColor(White);Write('Номер машины: ');
TextColor(Yellow);ReadLn(List[NumEdit].Number);
TextColor(White);Write('Марка машины: ');
TextColor(Yellow);ReadLn(List[NumEdit].Mark);
TextColor(White);Write('Неисправность (Enter - нет неисправности): ');
TextColor(Yellow);ReadLn(List[NumEdit].Error);
OutLine;
TextColor(Brown);WriteLn('Запись изменена ');
WaitForNextAction;
End;
Procedure DoEdit(Var N:Word;Var List:TList);
Var
ForEdit:Word;
WaitInput:Boolean;
Begin
ShowCursor;
TextBackGround(Blue);
ClrScr;
WaitInput:=True;
While WaitInput Do Begin
WaitInput:=False;
ClrScr;
GoToXY(30,1);TextColor(LightGray);WriteLn('Редактирование:');
OutLine;
TextColor(White);Write('Номер записи котурую нужно изменить (1-',N,') ');
ReadLn(ForEdit);
WaitInput:=ForEdit>N
End;
ChangeRecord(N,List,ForEdit);
End;
Procedure DoDel(Var N:Word;Var List:TList);
Var
ForDel:Word;
WaitInput:Boolean;
Begin
ShowCursor;
TextBackGround(Blue);
ClrScr;
WaitInput:=True;
While WaitInput Do Begin
WaitInput:=False;
ClrScr;
GoToXY(36,1);TextColor(LightGray);WriteLn('Удаление:');
OutLine;
TextColor(White);Write('Номер записи котурую нужно удалить (1-',N,') ');
ReadLn(ForDel);
WaitInput:=ForDel>N
End;
DeleteRecord(N,List,ForDel);
WriteLn;
OutLine;
TextColor(Brown);WriteLn('Запись была успешно удалена');
WaitForNextAction
End;
Procedure Sorting(N:Word;Var List:TList);
{шейкерная сортировка:}
Procedure DoSort(FieldForSort:Byte);
Var
Num,I,J:Word;
Buf:TCar;
Function CompareItems(Item1,Item2:TCar):Boolean;
Begin
Case FieldForSort Of
1: (*по виду неисправности*)
CompareItems:=Item1.Error>Item2.Error;
2: (*по номеру*)
CompareItems:=Item1.Number>Item2.Number
End
End;
Begin
Num:=1;
While Num>0 Do Begin
Write('.');
Num:=0;
For I:=1 To N-1 Do
If CompareItems(List[I],List[I+1]) Then Begin
Move(List[I],Buf,SizeOf(TCar));
Move(List[I+1],List[I],Sizeof(TCar));
Move(Buf,List[I+1],SizeOf(TCar));
Num:=I
End;
For I:=N-1 DownTo 1 Do
If CompareItems(List[I],List[I+1]) Then Begin
Move(List[I],Buf,SizeOf(TCar));
Move(List[I+1],List[I],Sizeof(TCar));
Move(Buf,List[I+1],SizeOf(TCar));
Num:=I
end
End
End;
{-----}
Var
SelectedCompare:Byte;
Begin
TextBackGround(Blue);
ClrScr;
GoToXY(37,1);TextColor(LightGray);WriteLn('Сортировка:');
OutLine;
WriteLn('Выбирите поле по которому следует отсортировать список:');
SelectedCompare:=WorkWithMenu;
DoSort(SelectedCompare);
WriteLn;
OutLine;
TextColor(Brown);Write('Данные отсортированы по ');
Case SelectedCompare Of
1:WriteLn('виду неисправности!!!');
2:WriteLn('номеру!!!')
End;
WaitForNextAction
End;
Procedure Find(N:Word;Var List:TList);
Var
SelectedFind:Byte;
ForFind:String;
I:Word;
Num:Byte;
Function Eqv(Item:TCar):Boolean;
Begin
Case SelectedFind Of
1: (*вид неисправности*)
Eqv:=Item.Error=ForFind;
2: (*номер*)
Eqv:=Item.Number=ForFind
End
End;
Begin
TextBackGround(Blue);
ClrScr;
GoToXY(37,1);TextColor(LightGray);WriteLn('Поиск:');
OutLine;
WriteLn('Выбирите поле по которому следует отсортировать список:');
SelectedFind:=WorkWithMenu;
TextColor(White);
ShowCursor;
Write('Введите ');
Case SelectedFind Of
1: Write('неисправность: ');
2: Write('номер: ')
End;
TextColor(Brown);
ReadLn(ForFind);
OutLine;
Num:=WhereY;
TextColor(Yellow);
For I:=1 To N Do Begin
If Eqv(List[I]) Then begin
GoToXY(1,Num);Write(List[I].Number);
GoToXY(12,Num);Write(List[I].Mark);
GoToXY(33,Num);Write(List[I].Error);
Inc(Num);
If Num>23 Then
If NextOut(Num) Then
Begin
ClrScr;
Num:=1;
End
Else
Break;
End
End;
If I=N Then Begin
WriteLn;
WaitForNextAction
End
End;
End.