Практичні аспекти створення програмного забезпечення
Практичні аспекти створення програмного забезпечення
27 Реферат Курсова робота, 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”.
|