Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИНФА РАСЧЁТКА.DOC
Скачиваний:
0
Добавлен:
18.09.2019
Размер:
173.06 Кб
Скачать
    1. Инструкция пользователю

Для активации программы, необходимо запустить файл R_I.exe. Данные вводятся заранее в специальные файлы с расширением .DAT. Для навигации по меню используются клавиши стрелок «», «» (по горизонтальному) и «», «» (по вертикальному). Опции главного меню:

Файл – сохранить в файл, загрузить из файла, выход.

Редактирование – добавить запись, изменить запись, удалить запись.

Действия – поиск, сортировка, вывод на экран.

О программе – вывод сведений о программе

Для выбора одной из опций меню или диалога необходимо нажать «Enter. Для выбора списка необходимо загрузить файл, в котором он хранится. Для этого выбираем Файл / Загрузить из файла. Для изменения, добавления, удаления записи необходимо выбрать соответствующую опцию вертикального меню Редактирование. Для сортировки списка, необходимо выбрать опцию Действия / Сортировка. Для поиска записи нужно выбрать Действия / Поиск и далее указать, по какому полю будет вестись поиск. Для вывода списка на экран выбираем Действия / Вывод на экран. Для сохранения списка выбираем Файл / Сохранить в файл.

    1. Заключения, выводы

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

  • разработку алгоритмов простых методов сортировки;

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

  • разработка алгоритмов обработки массивов записей как баз данных;

  • развитие умений работы с выше указанными структурами языка Pascal.

Литература

    1. Фаронов B.B. Турбо Паскаль 7.0 Начальный курс. Учебное пособие. - M.: «Нолидж», 1997г., 616 с., ил.

Приложения

  1. Документированный текст программы

    1. Основная программа

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.