Практичні аспекти створення програмного забезпечення
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
?ис роботи програми
Програма розроблена у середовищі програмування Турбо Паскаль. Вона призначена для свого використання операційною системою MS DOS. До неї підключені стандартні бібліотеки Турбо Паскаля: crt, graph та dos.
На початку роботи програми на екрані зявляється головне меню, яке містить кнопки “Данные”, “Результат” и “?”. При натисненні кнопки “Данные” на екрані зявляються підпункти “Из файла”, “Вручную” та “Выход”. Користувач обирає метод введення матриці вагів зчитування її з файлу Input.txt чи введення власноруч. Користувач виходить з програми, вибравши підпункт “Выход”. “Результат” складається з підпунктів “На экран” та “В файл”. Обравши один з цих підпунктів, користувач автоматично обирає, як саме виводити результати на екран чи записавши їх у файл Output.txt відповідно. Пункт меню “?” містить лише підпункт “Справка”, який містить довідку про програму та її автора.
Опис творчого процесу рішення задачі
Користувач може керувати програмою за допомогою меню. Структурна схема меню представлена на мал.1.
Мал.1.
Алгоритм роботи програми приведений на мал.2.
Мал.2.
Опис процедур
procedure Init
Ініціалізація кнопки меню.
Вхідін дані - координати кнопки.
procedure Show
Виведення на екран кнопки меню.
Вхідні дані - колір.
procedure ChoiceMein
Вибір в головному меню.
Вхідні дані - номер виділеної кнопки.
procedure Mein
Виведення на екран головного меню.
procedure ShowAll
Виведення підменю.
Вхідні дані - номер підменю.
procedure ChoiceM
Вибір у підменю.
procedure PHelp
Виведення допомоги.
procedure MsgError
Виведення повідомлення про помилку.
Вхідні дані - рядок повідомлення.
procedure InitMatrix
Ініціалізація масиву з координатами кнопок.
Вхідні дані - потрібний пункт меню.
procedure ChoiceResult
Перевірка натиснутої кнопки меню і виконання відповідної дії.
Вхідні дані - номер кнопки меню.
Лістинг програми:
Program Lenna;{iм"я програми}
Uses crt, dos, graph ;{пiдключаємо модулi}
Const MaxMenuItems = 10;{максимальна кiлькiсть пунктiв меню}
GM = MAXINT;{"нескiнченно велике число"}
MAXN = 10;{максимальна кiлькiсть комп"ютерiв у мережi}
Const Huge = MaxInt;{те саме що i ГМ}
Type MyArray = Array[1..MaxN, 1..MaxN] of Real; {тип масиву для розрахункiв}
MySimpleArray = Array[1..MaxN] of Real; {тип масиву для розрахункiв}
Type ProcedureType = Procedure;{процедурний тип}
Type ProcedurePointer = ^ProcedureType; {покажчик на процедурний тип (для меню) }
Type TMenuItem = Record{тип пункту меню}
Caption : String;{текст пункту (назва) }
Action : ProcedurePointer; {покажчик на процедуру}
Selected: Boolean;{пункт видiленоi}
end;
{загальний опис структури меню та короткий довiдник}
Type TMenu = Object {об"єкт меню}
Items: Array [ 1..MaxMenuItems ] of TMenuItem;{пукти}
ItemsCount: Integer;{кiлькiсть пунктiв}
Active: Boolean;{меню активнеi взагалi це поле не вик.}
Procedure AddItem(Caption: String; Action: ProcedurePointer); {метод. додати пукт до меню}
Procedure ExecuteAction;{виконати дiю: передати керування процедурi на яку вказує покажчик видiленого пункту}
Function getMaximalWidth: Integer; {знайти найширший пункт}
Procedure Print;{вивести меню на екран}
procedure Activate;{передати керування у меню}
end;
var Num: Integer;
Input: MyArray;
i, j: integer;
OriginalMode : Word; {для перемикання текстових режимiв}
ScreenWidth : Integer;{ширина екрану}
ScreenHeight : Integer;{висота екрану}
CharBuffer : Char;{непотрiбно :)}
Menu: TMenu;{об"єкт меню}
{процедура створення текстового вiкна з параметрами кольору фону та тексту}
Procedure CreateTextWindow( X, Y, Width, Height: Integer;
BackgroundColor, ForegroundColor: Integer);
begin
If (X + Width) > ScreenWidth then Width := ScreenWidth - X;
If (Y + Height) > ScreenHeight then Height := ScreenHeight - Y;
Window(X, Y, Width, Height);
TextBackground(BackgroundColor);
TextColor(ForegroundColor);
ClrScr;
end;
{активацiя меню}
Procedure TMenu.Activate;
var CommandKey: Char;
I: Integer;
begin
{виводимо меню}
Print;
{читаємо команди}
Repeat
CommandKey := ReadKey;
{Enter -- виконати}
Case Ord(CommandKey) Of
13: ExecuteAction;
{вибрати наступний униз}
75: Begin
For i := 1 to ItemsCount do
If items[i].selected then break;
Items[I].Selected := False;
If i = 1 then I := ItemsCount Else
I:=I-1;
Items[I].Selected := True;
End;
{вибрати наступний угору}
77: Begin
For I:=1 to ItemsCount do
If Items[i].selected then break;
Items[i].Selected := False;
If I = Itemscount then I:=1 else I:=I+1;
Items[I].Selected := True;
end;
end;
{надрукувати меню на екран}
Print;
{якщо Еск -- вийти}
Until Ord(CommandKey) = 27;
end;
{вивiд меню на екран}
Procedure TMenu.Print;
var i:integer;
width: integer;
Position: Integer;
TempText: String;
begin
{тiльки якщо пункти є}
If ItemsCount > 0 then
Begin
Width:=getMaximalWidth + 4;
{ робимо заголовок}
TempText:=ЗАДАЧА О НАЗНАЧЕНИЯХ;
CreateTextWindow(1, 1, 80, 4, LightGray, Black);
GotoXY(ScreenWidth div 2 - Length(TempText) div 2, 2);
Write(TempText);
{робимо меню i друкуємо його}
CreateTextWindow(1, 4, 80, 6,green, White);
For I:=1 to ItemsCount do
begin
GotoXY( Width * I - Width div 2 - Length(Items[i].Caption) div 2, 2);
If Items[I].Selected then TextColor(Yellow) Else TextColor(White);
Write(Items[I].Caption);
end;
End;
end;
{знайти найширший пункт}
Function TMenu.getMaximalWidth: Integer;
var max: integer;
i: integer;
begin
if ItemsCount > 0 then
begin
max := Length(Items[1].Caption);
For I:=1 to ItemsCount do
begin
If Length(Items[i].Caption) > max then
Max := Length(Items[i].Caption);
end;
end;
getMaximalWidth := max;
end;
{виконати дiю}
Procedure TMenu.ExecuteAction;
Var N: Integer;
Begin
if ItemsCount > 0 then
begin
For N:=1 to ItemsCount do
begin
If Items[N].Selected Then ProcedureType(Items[N].Action