Реферат
Курсова робота, 28 с., 2 мал., три джерела.
Розв’язок задачі про призначення мінімального вибору.
У роботі описані процес і результати розробки програмного засобу. В процесі розробки програмного засобу отримана цілком працездатна програма.
Робота програмного засобу можлива в операційній системі MS DOS на IBMPC-сумісних комп’ютерах.
Програмний засіб повинен визначати оптимальний варіант об’єднання ЕОМ в мережі, щоб час розв’язку був мінімальним.
Зміст
Вступ
Аналіз задачі, що вирішується
Вхідні дані
Вихідні дані
Вибір мови програмування
Опис роботи програми
Опис творчого процесу рішення задачі
Опис процедур
Лістинг програми
Керівництво користувача
Технічні вимоги до використання
Висновок
Довідкова література
Вступ
Розвиток і широке поширення засобів обчислювальної техніки в останні десятиліття послужило поштовхом до розробки програмного забезпечення різного рівня складності та різного за призначенням.
Для придбання вмінь та навичок розробки програмного забезпечення в процесі навчання вивчається предмет “Алгоритмічні мови та програмування”. Курсова робота є підсумком отриманих знань під час навчання.
Курсова робота “Розв’язок задачі про призначення” розроблена на алгоритмічній мові програмування Turbo Pascal з використанням графічного інтерфейсу та методів математичної обробки інформації.
Програма використовується для знайдення оптимального розподілу задачі по мережі, таким чином, щоб час розв’язку був мінімальним.
Отже, тема курсової роботи “Розв’язок задачі про призначення” носить практичний характер і є досить актуальною.
Аналіз задачі, що вирішується
Розробка розв’язку задачі про призначення мінімального вибіру.
Потрібно, щоб програма призначила кандидатів таким чином, щоб сумарна збитковість була мінімальною.
Одержуючи від користувача певну дію, програма повинна зчитати дані з файлу або вони повинні бути введені користувачем. Після введення користувач повинен вибрати: записувати результат у файл чи виводити його на екран.
Для рішення цієї задачі був обраний угорський метод та мова програмування Pascal.
Вхідні дані
Вхідними даними для даного програмного засобу є матриця вагів, яка зчитується з файлу, або кожен елемент якої вводиться власноруч.
Вихідні дані
Програма обчислює розподіл задач в мережі об’єднання між машинами ЕОМ, а також рахує і виводить на екран оптимальний варіант.
Вибір мови програмування
В даний час ми є свідками бурхливого розвитку обчислювальної техніки і її упровадження в багатьох сферах людської діяльності. Особливо чітко ці тенденції виявляються, коли мова заходить про персональний ЕОМ.
Інтерес до персональних комп'ютерів постійно росте, а коло їх користувачів безупинно розширюється. У число користувачів ПЕОМ втягують як новачки в комп'ютерній справі, так і фахівці з інших класів ЕОМ.
Хоча на ПЕОМ можуть використовуватись багато різних мов програмування (Бейсік, Паскаль, C++, Асемблер), використання мови програмування Турбо Паскаль найбільш еффективне.
Мова Бейсік входить до складу програмного забезпечення майже усіх ПЕОМ, що випускаються в дійсний час. Розроблювачі ПЕОМ, як правило, включають у реалізовану версію мови засоби, що дозволяють використовувати всі можливості, надані апаратурою конкретної ПЕОМ. Завдяки цьому для користувача, який не є професійним програмістом (а таких користувачів ПЕОМ більшість), Бейсік виконує роль базової мови, подібно мові Асемблер для професійного програміста.
Мова C++ - універсальна мова загального призначення, область додатків якої - програмування систем у самому широкому змісті. Крім цього С++ успішно використовується як у багатьох додатках, так і в могутніх операційних системах. Реалізація C++ здійснена для машин у діапазоні від найпростіших персональних комп'ютерів до самих могутніх суперкомп'ютерів і для всіх операційних систем.
Мова Асемблер - мова, найбільш близька до машинної. Вона дозволяє програмісту найближче познайомитися з машиною (на відміну від мов програмування високого рівня), і тому вивчення Асемблера означає також вивчення самого мікропроцесора 8086. Як правило програма, написана на Асемблері, виконується набагато швидше програми, написаної на будь-якій іншій мові. Звичайно програми на Асемблері виконуються в 2-3 рази швидше, ніж еквівалентні програми С++ чи Паскаля, і в 15 і більше разів швидше, ніж програми, покроково інтерпритуємі Бейсіком. Асемблерні програми також значно менші за розміром.
Програми на Асемблері відкривають програмісту повний доступ до можливостей комп'ютера.
Мова Турбо Паскаль - це одна з найпоширеніших мов програмування. Вона розроблена фірмою "Борланд" як діалект стандартної мови Паскаль, але завдяки своїй популярності сама стала стандартом мови програмування.
Найважливішими перевагами мови Турбо Паскаль є невеликий розмір компілятора, висока ступінь відповідності стандартному Паскалю, дуже швидка компіляція програм, об'єднання компілятора з інтерактивним екранним редактором, попередження про помилки на рівні вихідної програми, велика бібліотека підпрограм і корисні розширення, що спрощують системне програмування.
Але найголовнішим є те, що мова Турбо Паскаль підходить для навчання починаючих програмістів гарному стилю програмування.
Опис роботи програми
Програма розроблена у середовищі програмування Турбо Паскаль. Вона призначена для свого використання операційною системою 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);
end;
end;
End;
{додати пункт до меню}
Procedure TMenu.AddItem(Caption: String; Action: ProcedurePointer);
begin
If ItemsCount < MaxMenuItems then
begin
ItemsCount := ItemsCount + 1;
Items[ItemsCount].Caption := Caption;
If ItemsCount = 1 Then
Items[ItemsCount].Selected := True
Else Items[ItemsCount].Selected := False;
Items[ItemsCount].Action := Action;
end;
end;
{встановити потрiбний текстовий режим та знайти ширину i висоту екрану}
Procedure ScreenInitialization;
Begin
CheckBreak := False;
OriginalMode := LastMode;
TextMode( Lo(LastMode) + Font8x8);
ScreenWidth := Lo(WindMax) + 1;
ScreenHeight := Hi(WindMax) + 1;
TextBackground(Black);
TextColor(White);
End;
{процедура виходу}
Procedure ExitProc;
begin
Halt;
end;
{вивiд допомоги}
Procedure PrintHelp;
var s: file of char;
buffer:char;
begin
CreateTextWindow(1, 7, ScreenWidth, ScreenHeight, Black, White);
assign(s, 'help.txt');
reset(s);
while not eof(s) do
begin
read(s, buffer);
write(buffer);
end;
end;
{запит з клавiатури значення (1)}
Function InputValue(Comment: String): Integer;
Var Temp: Integer;
Len: Integer;
I, J: Integer;
begin
Len:= Length(comment);
J := 1;
While J <> 0 do
begin
CreateTextWindow( ScreenWidth div 2 - Len div 2 - 2,
ScreenHeight div 2 - 6 div 2,
ScreenWidth div 2 + Len div 2+ 2,
ScreenHeight div 2 + 6 div 2,
Blue, White);
TextColor(Yellow);
GotoXY( 3, 3); Write(Comment);
TextColor(White);
Window( ScreenWidth div 2 - Len div 2,
ScreenHeight div 2 + 2 div 2,
ScreenWidth div 2 + Len div 2,
ScreenHeight div 2 + 4 div 2);
TextColor(White);
{$I-}
Readln(Temp);
{$I+}
If IOResult <> 0 then J:=1 Else J:=0;
end;
CreateTextWindow(1, 7, ScreenWidth, ScreenHeight, Black, White);
InputValue := Temp;
end;
Procedure ASSIGMENTPROBLEM(N: Integer; C: MyArray);
var I, J0,m,m0,h2, I0,j1,last,up,low, J, k, cnt, s, ss: Integer;
V, u, d: MySimpleArray;
VJ, v0,h, dj, min,z : Real;
x,y, Col, free, lab: array[1..MaxN] of Integer;
label 41, 50, 43, 60, 55, 70, 80, 999;
begin
For I:=1 to N do
X[i] := 0;
For J0:=1 to N do
begin
J:=N - J0 + 1;
VJ := C[j,1];
I0 := 1;
For I:= 2 To N do
If C[i,j] < vj Then begin vj := C[i,j]; I0 := i; end;
V[j] := vj;
Col[j] := j;
If X[i0] = 0 then begin x[i0]:=j; y[j]:=i0; end
else begin x[i0] := -1 * ABS( X[i0] ); y[j]:=0; end;
end;
m:=0;
For I:=1 to N do
begin
If x[i] = 0 then
begin
m:=m+1;
free[m]:=i;
break;
end; {if}
If x[i] < 0 then
x[i]:=-1*x[i]
else
begin
j1:=x[i]; min:=Huge;
For J:=1 to N do
begin
If j = j1 then break;
If c[j,i] - v[j] < min then Min := c[j,i] - v[j];
end; {for}
v[j1] := v[j1] - min;
end;{else}
end;
Cnt:=0;
If m = 0 then goto 999;
41:
m0:=m; k:=1; m:=0;
50:
i:=free[k]; k:=k+1;
v0 := c[1, i] - v[1];
j0:=1; vj:=Huge;
For j:=2 to N do
begin
h:=c[j,i] - v[j];
If H < vj then
begin
if H >= v0 then
begin vj := h; j1 := j; end
else begin vj:=v0; v0 := h; j1:=j0; j0:=j; end;
end;
end;
i0:=y[j0];
if v0 < vj then
v[j0] := v[j0] - vj + v0
else
begin
if i0 = 0 then goto 43;
j0:=j1; i0 := y[j1];
end;
if i0 = 0 then goto 43;
if v0 < vj then
begin
k := k - 1;
free[k]:=i0;
end else
begin
m:=m+1;
free[m]:=i0;
end;
43:
x[i] := j0;
y[j0] := i;
if k <= m0 then goto 50;
cnt := cnt + 1;
if (m > 0) AND (cnt < 2) then Goto 41;
m0 := m;
For M:=1 to M0 do
begin
i0:=free[m];
For J:=1 to N do
begin
d[j]:=c[j,i0] - v[j];
lab[j]:=i0;
end;
up:=1;
low := 1;
60:
last:=low - 1;
min := d[col[up]];
up := up+1;
for k:=up to n do
begin
j := col[k];
dj := d[j];
if dj <=min then
begin
if dj < min then begin min:=dj; up:=low; end;
col[k]:=col[k];
col[up] := j;
up := up+1;
end;
end;
for h2:=low to up - 1 do
begin
j:=col[h2];
if y[j] = 0 then Goto 70;
end;
55:
j0:=col[low];
low:=low+1;
i:=y[j0];
h:=c[j0, i] - v[j0] - min;
for k:=up to n do
begin
j:=col[k];
vj:=c[j,i] - v[j] - h;
if vj < d[j] then
begin
d[j] := vj;
lab[j]:=i;
if vj = min then
begin
if y[j] = 0 then Goto 70;
col[k]:=col[up];
col[up]:=j;
up:=up+1;
end;
end;
end;
if low = up then goto 60;
goto 55;
70:
for k:=1 to last do
begin
j0 := col[k];
v[j0] := v[j0] + d[j0] - min;
end;
80:
i:=lab[j];
y[j]:=i;
k:=j;
j:=x[i];
x[i]:=k;
if i0 <> i then Goto 80;
end;
999:
z := 0;
For I:=1 to N do
begin
u[i]:=c[x[i],i] - v[x[i]];
z:=z+c[x[i],i];
end;
Writeln;
TextColor(LightBlue);
For I:=1 to N do begin
Writeln(' ДЛя комп"ютера ', I, ' задача ', y[i], ' найкраще пiдiйде.');
end;
end;
procedure PROG;
var i, j: integer;
si, sj: string;
begin
Num:=InputValue('Введiть кiлькiсть комп"ютерiв:');
For I:=1 to Num do
For J:=1 to Num do
begin
str(i, si);
str(j, sj);
Input[I,J]:=InputValue('Коефiцiєнт ' + si + '-ї задачi на комп"ютерi ' + sj);
end;
ASSIGMENTPROBLEM(num, input);
end;
procedure priklad;
var
FC: File of Char;
I, J: Integer;
BUFFER: Char;
begin
CreateTextWindow(1, 7, ScreenWidth, ScreenHeight, Black, White);
Assign(FC, 'EXAMPLET.TXT');
Reset(FC);
While not EOF(FC) do
begin
Read(FC, BUFFER);
Write(Buffer);
end;
close(FC);
Num:=5;
Input[1,1]:=9; Input[2,1]:=20; Input[3,1]:=60; Input[4,1]:=15; Input[5,1]:=21;
Input[1,2]:=38; Input[2,2]:=71; Input[3,2]:=69; Input[4,2]:=49; Input[5,2]:=60;
Input[1,3]:=28; Input[2,3]:=13; Input[3,3]:=80; Input[4,3]:=28; Input[5,3]:=34;
Input[1,4]:=58; Input[2,4]:=34; Input[3,4]:=13; Input[4,4]:=37; Input[5,4]:=25;
Input[1,5]:=30; Input[5,5]:=3; Input[2,5]:=53; Input[3,5]:=20; Input[4,5]:=21;
ASSIGMENTPROBLEM(num, input);
end;
begin
{встановлюємо екран}
ScreenInitialization;
{додаємо до меню пунктики}
With Menu do
begin
AddItem('Prog', @PROG);
AddItem('Справка', @printHelp);
AddItem('Пример', @priklad);
AddItem('Выход', @exitProc);
Activate;
end;
end.
Керівництво користувача
Дана програма призначена для використання в операційній системі MS DOS.
Для запуску програми потрібно запустити файл Lena.exe. Після запуску програми на екрані з’являється меню, яке містить три пункти – “Данные”, “Результат” та “?”. Пункт меню “Данные” складається з підпунктів “Из файла”, “Вручную”, “Выход”. Вибравши “Из файла”, ви вводите матрицю вагів, збережену в якомусь файлі. Вибравши “Выход”, програма закривається. “Результат” має підпункти “На экран” і “В файл”. Вибравши один з цих підпунктів, ви або виводите результат на екран, або відповідно зберігаєте його у файл. Пункт меню “?” має підпункт “Справка”.
Технічні вимоги до використання
Для запуску даної програми необхідна наявність персонального комп’ютера IBM PC.
Мінімальні вимоги до ПК:
Intel Pentium 100 мГц;
операційна система MS DOS;
пам’ять 288 байт;
дисковод або CD ROM;
клавіатура.
Висновок
У цій курсовій роботі вирішена задача про призначення.
Розроблено алгоритм рішення поставленої задачі.
Програма складена і налагоджена у середовищі програмування Турбо Паскаль.
У процесі налагодження була отримана цілком працездатна програма.
Проведено тестування програми. Аналіз результатів показав, що задача успішно виконана.
Довідкова література
1. Б.Іванов “Дискретная математика. Алгоритмы и программы”.
2. Н.Вірт “Алгоритми + Структури даних = Програма”.
3. Т.Рюттен, Г.Франкен “Турбо Паскаль 6.0”.