Исходные данные для расчета:
предполагаемое число операторов (q) - 800;
коэффициент сложности программы (C) - 1,4;
коэффициент коррекции программы (p) - 0,1;
коэффициент увеличения затрат труда вследствие недостаточного описания задачи (B) - 1,3;
коэффициент квалификации программиста (K) - 0,8
заработная плата программиста - 20 грн/час;
стоимость машинного времени, необходимого для отладки программы на ЭВМ - 9 грн./час.
Трудоемкость можно рассчитать по формуле:
человеко-часов, (3.1)
где to - затраты труда на подготовку и описание поставленной задачи (принимается = 50);- затраты труда на исследование алгоритма решения задачи;- затраты труда на разработку блок-схемы алгоритма;п - затраты труда на программирование по готовой блок-схеме;отл - затраты труда на отладку программы на ЭВМ;д - затраты труда на подготовку документации.
Составляющие затраты труда определяются исходя из условного числа операторов в разрабатываемом ПО.
Условное число операторов:
, (3.2)
- предполагаемое число операторов (q = 800).- коэффициент сложности программы. Коэффициент сложности задачи С характеризует относительную сложность программы по отношению к так называемой типовой задаче, реализующей стандартные методы решения, сложность которой принята равной единице (величина С лежит в пределах от 1,25 до 2). Для данного программного продукта, с учетом большого количества и разнообразия обрабатываемой информации и сложности составления отчетов, коэффициент сложности задачи возьмем 1,4.
р - коэффициент коррекции программы в ходе ее разработки. Коэффициент коррекции программы p - увеличение объема работ за счет внесения изменений в алгоритм или программу по результатам уточнения постановок. В данном случае программа не требовала многочисленных доработок. С учетом этого возьмем коэффициент равный 0,1.=800 *1,4*(1+0,1)=1232
Затраты труда на изучение описания задачи
определяется с учетом уточнения описания и квалификации программиста.
, (3.3)
- коэффициент увеличения затрат труда вследствие недостаточного описания задачи. Коэффициент увеличения затрат труда в зависимости от сложности задачи принимается от 1,2 до 1,5, вследствие недостаточного описания решения задачи примем B = 1,3.
K - коэффициент квалификации программиста, определяемый от стажа работы по данной специальности. Коэффициент составляет: для работающих до двух лет - 0,8; от двух до трех лет - 1,0; от трех до пяти лет - 1,1 - 1,2; от пяти до семи - 1,3 - 1,4; свыше семи лет - 1,5 - 1,6. Поэтому примем К = 0,8.
t u =(1232*1,3)/(80*0,8)=25 чел.-часов.
Затраты труда на разработку алгоритма решения
задачи:
, (3.4)
a=1232/(22,5*0,8)=68,4 чел.-часов.
Затраты на составление программы по готовой
блок-схеме:
, (3.5)
n=1232/(22,5*0,8)=68,4 чел.-часов.
Затраты труда на отладку программы при условии
автономной отладки одного задания:
, (3.6)
отл =1232/(4,5*0,8)=342,2 чел.-часов.
Затраты труда на отладку программы при условии комплексной отладки задания:
к отл =1,5*t отл , (3.7)
к отл=1,5*342,2=513,3 чел.-часов.
Затраты на подготовку документации:
, (3.8)
где tдр - трудоемкость подготовки материалов и рукописи;до - трудоемкость редактирования, печати и оформления документации.
Трудоемкость подготовки материалов и рукописи
определяется по формуле:
, (3.9)
др=1232/(17,5*0,8)=88 чел.-часов.
Трудоемкость редактирования, печати и оформления
документации:
, (3.10)
до=0,75*88=66 чел.-часов.
Затраты на подготовку документации составят:д = 88 + 66 = 154 чел.-часов.
Получаем трудоемкость разработки ПО:= 50+25+68,4+68,4+513,3+154 = 879,2 чел.-часов
Таким образом, трудоемкость разработки
программного обеспечения составляет 879,2 чел.-часов.
3.2 Затраты на
создание программного обеспечения
Затраты на создание ПО (Кпо) включают затраты на
заработную плату разработчиков программы (Зз/п), определяемую умножением
суммарной трудоемкости разработки ПО (t) на среднюю заработную плату
программиста с начислениями и стоимости машинного времени на отладку.
(3.11)
Заработная плата разработчиков определяется по
формуле:
, (3.12)
где t - общая трудоемкость, чел.-часов.пр - средняя часовая заработная плата программиста, грн/час.пр = 20 грн./час.
З зп=879,2 *20=17584 грн.
Стоимость машинного времени, необходимого для
отладки программы на ЭВМ:
, (3.13)
где tотл - трудоемкость отладки программы на ЭВМ, ч.
Смч - стоимость машинного времени ЭВМ грн/ч.
З мв= 513,3*9=4620 грн.
Затраты на создание программного обеспечения составят:
Кпо= 17584 + 4620 = 22204 грн.
Определенные таким образом затраты на создание программного обеспечения являются одноразовыми капитальными затратами на создание АС.
Ожидаемый период создания ПО:
мес., (3.14)
где Bk - число разработчиков;- месячный фонд рабочего времени (при 40 часовой рабочей неделе Fp=176 часов).
Т=879,2/(1*176)=5 мес.
Таким образом, ожидаемая длительность разработки
составит 5 месяцев, а затраты на создание программного обеспечения - 22204 грн.
Выводы
В данном дипломном проекте разрабатывается
программное обеспечение для учета перевозок в карьере горно-обогатительного
комбината. Затраты на создание программного обеспечения составили 22204 грн,
длительность разработки - 5 месяцев.
Выводы
В данной бакалаврской работе была разработана система учета перевозок руды и вскрышных пород являющаяся частью системы управления всего карьера ГОК.
Разработанное программное обеспечение предназначено для получения аналитической и статистической информации о наблюдаемых транспортных процессах и формирования текстовых и графических отчетов.
Актуальность разработанной системы определяется насущной потребностью перехода украинских предприятий на максимальное использование местных полезных ископаемых, таких как уголь, руда и др. Это позволит предприятиям менее зависеть от внешних поставок.
Практическая значимость данного программного продукта заключается в возможности своевременного решения задач оперативного управления работой карьера, что позволяет минимизировать расход энергоресурсов и добиться повышения производительности труда и улучшения качества работы.
Разработанное программное обеспечение имеет дружественный пользователю интерфейс и невысокую стоимость.
Программное обеспечение было разработано в среде Embarcadero Delphi 2010 с использованием СУБД Firebird 2.5 и является полностью готовым к использованию программным продуктом.
В экономическом разделе дипломного проекта
определена трудоемкость, длительность разработки и выполнена оценка затрат на
создание программного продукта
Список литературы
1. Р. Сигнор, О. Стегман. Использование ODBC для доступа к базам данных. - М.: БИНОМ, Научная книга, 1998. - 384 с.
2. Проектирование, разработка и анализ программного обеспечения систем реального времени. Сергей Зыль., БХВ-Петербург, 2010 г., 336 стр.
. Базы данных (7-е изд.). Фуфаев Э.В., Фуфаев Д.Э., Академия, 2012.- 320 стр.
. Объектно-ориентированное программирование. Концепции разработки. Б.Майер, Русская Редакция, 2004 г., 600 стр.
. Технологии объектно-ориентированного программирования (2-е издание). Павел Хорев, Академия, 2008 г., 448 стр.
. Delphi. Профессиональное программирование. Дмитрий Осипов, Символ-Плюс, 2006г., 1056 стр.
7. Firebird
руководство разработчика баз данных
<#"896757.files/image038.jpg">
Отчет о работе машин
Отчет по экскаваторам
Отчет о транспортных расстояниях
Отчет по горным массам
Приложение Б
unit gok_pass, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, DBCtrls, Unit1, Grids, DBGrids, Mask, DBCtrlsEh;= class(TForm): TEdit;: TDBLookupComboBox;: TButton;: TLabel;: TLabel;ButtonVhodClick(Sender: TObject);FormActivate(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrPass;
{$R *.dfm}gok_move;
procedure TFrPass.ButtonVhodClick(Sender: TObject);
beginEdPass.text<>dm.DSetDisp.Fields[2].Value then begin.MessageBox('Пароль введен неверно','Вход в систему',MB_ICONERROR);.Text:='';.Visible:=true;.Visible:=false;.Disp.Text:=dm.DSetDisp.Fields[0].Value;.DispPass.Text:=dm.DSetDisp.Fields[2].Value;;
procedure TFrPass.FormActivate(Sender: TObject);
begin.DSetDisp.Refresh;;
end.gok_chpass
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Unit1, StdCtrls, Mask, DBCtrls, Grids, DBGrids, Buttons;= class(TForm): TDBEdit;: TDBEdit;: TDBEdit;: TDBEdit;: TEdit;: TLabel;: TBitBtn;: TLabel;: TEdit;: TLabel;BitBtn1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrChPass;
implementation
{$R *.dfm}TFrChPass.BitBtn1Click(Sender: TObject);
begindbeditpass.Text<>editpassold.Text then begin.MessageBox('Пароли не совпадают','Изменение данных',MB_ICONERROR);;;.DSetForDispPass.Edit;.DSetForDispPass.Fields[4].Value:=EditPass.Text;.DSetForDispPass.Post;.MessageBox('Пароль изменен','Изменение данных',MB_ICONINFORMATION);;
end.gok_drivers
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Grids, DBGrids, Unit1, ExtCtrls, DBCtrls;= class(TForm): TDBGrid;
{ Private declarations }
{ Public declarations };: TFrDrivers;
implementation
{$R *.dfm}.gok_brig
interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Unit1, StdCtrls, Mask, DBCtrls, Grids, DBGrids, Buttons;= class(TForm): TDBEdit;: TDBEdit;: TLabel;: TLabel;: TDBGrid;: TDBEdit;: TDBEdit;: TLabel;: TLabel;: TDBGrid;: TDBEdit;: TDBEdit;: TLabel;: TLabel;: TDBGrid;: TDBEdit;: TDBEdit;: TLabel;: TLabel;: TDBGrid;: TBitBtn;: TDBEdit;: TDBEdit;: TDBEdit;: TDBEdit;: TLabel;: TDBLookupComboBox;: TLabel;: TLabel;: TEdit;: TDBEdit;BitBtn2Click(Sender: TObject);BitBtn1Click(Sender: TObject);FormActivate(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrBrig;
{$R *.dfm}gok_move;
procedure TFrBrig.BitBtn2Click(Sender: TObject);
begin.DSetBrig1.Edit;.DSetBrig1.Fields[4].Value:=dm.DSetDisp.Fields[0].Value;.DSetBrig1.Fields[7].Value:=dm.DSetDisp.Fields[1].Value;.DSetBrig1.Post;.DSetBrig1.Close;.DSetBrig1.Open;.Disp.Text:=dm.DSetDisp.Fields[0].Value;('Замена диспетчера' + dm.DSetBrig1.Fields[7].Value + 'диспетчером' + dm.DSetDisp.Fields[1].Value);;
procedure TFrBrig.BitBtn1Click(Sender: TObject);
beginEditNumBrig.Text<>''then begin.Disp.Text:=dm.DSetDisp.Fields[0].Value;.brig.Text:=editnumbrig.Text;
{showmessage(dm.DSetBrig1.Fields[4].Value);(dm.DSetBrig1.Fields[7].Value);(dm.DSetDisp.Fields[1].Value);}('Выполнена замена бригады на текущую смену. Диспетчер: ' + editdisp.text + ' бригада № ' + EditNumBrig.Text);.MessageBox('Не выбрана бригада','Назначение диспетчера',MB_ICONERROR)
end;TFrBrig.FormActivate(Sender: TObject);
begin.DSetDisp2.Close;.DSetDisp2.Parameters[0].Value:=StrToInt(FrMap.Disp.Text);.DSetDisp2.Open;;
end.gok_dcar
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Unit1, StdCtrls, Buttons, Grids, DBGrids, DBCtrls;= class(TForm): TDBGrid;: TBitBtn;: TBitBtn;: TDBLookupComboBox;: TDBLookupComboBox;: TLabel;: TLabel;: TButton;BitBtnDCarYesClick(Sender: TObject);BitBtn1Click(Sender: TObject);Button1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrDCar;
implementation
{$R *.dfm}gok_move;TFrDCar.BitBtnDCarYesClick(Sender: TObject);
beginApplication.MessageBox('Подтвердить данное назначение на текущую смену?','Назначение водителей',MB_YESNO+MB_ICONQUESTION)=IDNO then exit;;
procedure TFrDCar.BitBtn1Click(Sender: TObject);
begin.DSetDCar.Edit;.DSetDCar.Fields[2].Value:=dm.DSetDrForSp.Fields[0].Value;.DSetDCar.Post;.DSetDCar.Close;.DSetDCar.Open;;
procedure TFrDCar.Button1Click(Sender: TObject);
begin.DSetDCar.Edit;.DSetDCar.Fields[1].Value:=dm.DSetCar.Fields[0].Value;.DSetDCar.Post;.DSetDCar.Close;.DSetDCar.Open;;.Reports, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Mask, DBCtrlsEh, Unit1, DBCtrls, ExtCtrls, Buttons;= class(TForm): TDBLookupComboBox;: TDBLookupComboBox;: TLabel;: TLabel;: TLabel;: TBitBtn;: TBitBtn;: TLabel;: TPanel;: TPanel;: TLabel;: TBitBtn;: TBitBtn;: TBitBtn;: TBitBtn;: TBitBtn;: TBitBtn;: TPanel;: TLabel;: TPanel;: TLabel;: TButton;: TButton;: TLabel;: TMaskEdit;: TLabel;: TLabel;: TMaskEdit;: TBitBtn;: TButton;: TButton;: TPanel;: TLabel;: TBitBtn;Button1Click(Sender: TObject);BitBtn1Click(Sender: TObject);BitBtn2Click(Sender: TObject);BitBtn3Click(Sender: TObject);BitBtn4Click(Sender: TObject);BitBtn6Click(Sender: TObject);BitBtn8Click(Sender: TObject);Button2Click(Sender: TObject);BitBtn11Click(Sender: TObject);Button3Click(Sender: TObject);Button4Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrReports;
implementationRep1, Rep2,Rep4, Rep5, Rep6, graf1, graf2, unit2, graffuel;
{$R *.dfm}TFrReports.Button1Click(Sender: TObject);
begin.DSRep1.Close;.DSRep1.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSRep1.Parameters[1].Value:=dm.DSetCar.Fields[0].Value;.DSRep1.Open;.Show;.frxReport1.ShowReport;
//showmessage(dm.DSetCar.Fields[0].Value);
//FrRep1.frxReport1.Print;;
procedure TFrReports.BitBtn1Click(Sender: TObject);
begin.DSRep1.Close;.DSRep1.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSRep1.Parameters[1].Value:=dm.DSetCar.Fields[0].Value;.DSRep1.Open;.Show;.frxReport1.ShowReport;;
procedure TFrReports.BitBtn2Click(Sender: TObject);
begin.DSRep1.Close;.DSRep1.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSRep1.Parameters[1].Value:=dm.DSetCar.Fields[0].Value;.DSRep1.Open;.Show;.frxReport1.Print;;
procedure TFrReports.BitBtn3Click(Sender: TObject);
begin.DSetRep2.Close;.DSetRep2.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSetRep2.Open;.Show;.frxReport2.ShowReport;;
procedure TFrReports.BitBtn4Click(Sender: TObject);
begin.DSetRep2.Close;.DSetRep2.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSetRep2.Open;.Show;.frxReport2.Print;;
procedure TFrReports.BitBtn6Click(Sender: TObject);
begin.DSetRep4.Close;.DSetRep4.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSetRep4.Open;.Show;.frxReport4.ShowReport;;
procedure TFrReports.BitBtn8Click(Sender: TObject);
begin.DelQueryRep5.ExecSQL;.AddQueryRep5.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.AddQueryRep5.ExecSQL;.DSetRep5.Close;
//dm.DSetRep5.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSetRep5.Open;.Show;.frxReport5.ShowReport;;TFrReports.Button2Click(Sender: TObject);(MaskEdit1.text <>'01.09.11') then.MessageBox('Неправильно указан период','Итоговые отчеты',MB_ICONERROR).Show;;
procedure TFrReports.BitBtn11Click(Sender: TObject);
begin.DelQueryRep5.ExecSQL;.AddQueryRep5.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.AddQueryRep5.ExecSQL;.DSetRep6.Close;
//dm.DSetRep5.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSetRep6.Open;.Show;.frxReport5.ShowReport;;
procedure TFrReports.Button3Click(Sender: TObject);
begin(MaskEdit1.text <>'01.09.11')then.MessageBox('Неправильно указан период','Итоговые отчеты',MB_ICONERROR).Show;;
procedure TFrReports.Button4Click(Sender: TObject);
begin.DSetGrafFuel.Close;.DSetGrafFuel.Parameters[0].Value:=dm.DSetShift.Fields[0].Value;.DSetGrafFuel.Parameters[1].Value:=dm.DSetCar.Fields[0].Value;.DSetGrafFuel.Open;.Show;;.
Тексты SQL-запросов
Формирование данных для полей со списком «Пользователь» и «Диспетчер»tWorkers.CodeWorker, [WorkerSurname] & " " & Left([WorkerName],1) & "." & " " & Left([WorkerPatronymic],1) & "." AS FIO, tWorkers.WorkerPasstWorkers(((tWorkers.WorkerDisp)=True));
Формирование данных для поля со списком «Водители»tWorkers.CodeWorker, [WorkerSurname] & " " & Left([WorkerName],1) & "." & " " & Left([WorkerPatronymic],1) & "." AS FIO, tWorkers.WorkerPasstWorkers(((tWorkers.WorkerDisp)=False));
Формирование данных для поля со списком «Машины»tCars.CodeCar, tCars!CarModel & " " & tCars!CarNumberIn AS PPtCars INNER JOIN tCarType ON tCars.CodeCarType = tCarType.CodeCarType(((tCarType.CarTypeFlgEks)=False))
Формирование данных для формы «Экскаваторы»
SELECT tCars.CodeCar, tCars!CarModel & "-" & tCars!CarNumberIn AS PP, tCars.CarFileSP, tCars.CarFilePR, tCars.CarFileRP
FROM tCars INNER JOIN tCarType ON tCars.CodeCarType = tCarType.CodeCarType(((tCarType.CodeCarType)=2));
Формирование данных для формы «Назначение на смену»
SELECT tDCar.*, tCars!CarModel & " " & tCars!CarNumberIn AS CarM, [WorkerSurname] & " " & tWorkers!WorkerName & " " & tWorkers!WorkerPatronymic AS FIO, tWorkers.WorkerTabNum
FROM (tDCar INNER JOIN tWorkers ON tDCar.CodeWorker = tWorkers.CodeWorker) INNER JOIN tCars ON tDCar.CodeCar = tCars.CodeCar(((tCars.CodeCarType)<>2) AND ((tWorkers.WorkerDisp)=False));
Добавление данных о сотрудниках и машинах, работающих в данную смену
INSERT INTO tDriverCar ( CodeShift, CodeCar, CodeWorker, CodeWorker2 )
SELECT Forms!FrDo!spshift AS Shift, tDcar2.CodeCar, tDcar2.CodeWorker, tDcar2.CodeWorker2tDcar2(((tDcar2.DCar2Brig)=:b));
Добавление данных о рейсах машинINTO tTrip ( CodeShift, CodeCar, CodeCarPP, CodeUnload, TripTimeBegin, TripTimeEnd, TripMass, TripDistance, TripCounterFuel, TripFuel, TripPathTime )
SELECT Forms!FrDo!spshift AS smena, Forms!FrDo!spcar AS car, Forms!FrDo!speks AS pp, Forms!FrDo!sppr AS pr, IIf((Round(Forms!FrDo!fplusbegin,0)+Minute([TripTimeEnd]))>=60,Hour([TripTimeEnd])+1 & ":" & Minute([TripTimeEnd])+Round(Forms!FrDo!fplusbegin,0)-60,Hour([TripTimeEnd]) & ":" & Minute([TripTimeEnd])+Round(Forms!FrDo!fplusbegin,0)) AS timebegin, IIf((Round(Forms!FrDo!fpathtime,1)+Forms!FrDo!fplusbegin+Minute([TripTimeEnd]))>=60,Hour([TripTimeEnd])+1 & ":" & Minute([TripTimeEnd])+Round(Forms!FrDo!fpathtime,1)+Forms!FrDo!fplusbegin-60,Hour([TripTimeEnd]) & ":" & Minute([TripTimeEnd])+Round(Forms!FrDo!fpathtime,1)+Forms!FrDo!fplusbegin) AS timeend, tCars!CarGP AS gp, Forms!FrDo!fdist AS dist, Round(tTrip!TripCounterFuel-(tCars!CarFuel/100*Forms!FrDo!fdist),1) AS fuel, Round(tCars!CarFuel/100*Forms!FrDo!fdist,2) AS rashod, Round(Forms!FrDo!fpathtime,1) AS pathtimetCarType INNER JOIN (tTrip INNER JOIN tCars ON tTrip.CodeCar = tCars.CodeCar) ON tCarType.CodeCarType = tCars.CodeCarType(((tTrip.CodeTrip)=GetLastTrip()));