
- •Негосударственное образовательное учреждение высшего профессионального образования «Технологический институт «вту»»
- •Содержание
- •1. Описание метода решения задачи многомерного статического анализа.
- •2. Выбор и обоснование инструментальных средств программирования.
- •3. Разработка иерархических модулей программного продукта.
- •4. Разработка алгоритмов решения задачи и его программного кода.
- •5. Тестирование разработанного программного продукта.
- •Заключение
- •Список используемых источников
- •Приложение а Листинг программы
Заключение
В результате выполнения расчетно-графического задания было разработано программное средство, позволяющее произвести анализ статистических данных.
Приложение выполнено на языке Object Pascal, в среде программирования Delphi 7.
Для приложения реализован кластерный анализ с использованием агломиративного (иерархического) метода .
Работоспособность программы проверена на тестовом наборе данных. Разработанное приложение выполняет все поставленные перед ним задачи, следовательно, можно сказать, что цель расчетно-графического задания выполнена.
Список используемых источников
1 Вендров А.М. Проектирование программного обеспечения экономических информационных систем: Учебник. – М.: Финансы и статистика, 2000. – 352 с.: ил.
2 Зубкова Т.М. Технология разработки программного обеспечения: Учебное пособие. – Оренбург: ГОУ ОГУ, 2004. – 101 с.
3 Delphi 7/Под общ. Ред. А.Д.хомоненко.-СПб.:БХВ-Петербург,2004.-1216с.:ил.
4 Кэнту М. Delphi 7 для профессионалов. – Спб.: Питер, 2005. – 670 с.
5 Смирнова Г. Н. и др. Проектирование экономических информационных систем: Учебник. – М.: Финансы и статистика, 2001. – 512 с.
6 Технология разработки программного обеспечения. Учебное пособие. / С. Орлов. – Спб.: Питер, 2003. – 480 с.
7 Унифицированный язык моделирования (UML - Unified Modeling Language) - http://www.rational.com.
8 Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов — СПб.: Питер, 2004. – 640 с.: ил.
9 Конопка Р. Создание оригинальных компонент в среде Delphi/Пер. с англ. Рей Конопка. – К.: НИПФ «ДиаСофтЛтд», 1996.
Приложение а Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ComCtrls, Menus;
type
THackGrid = class(TStringGrid);
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
Save1: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button6: TButton;
UpDown1: TUpDown;
UpDown2: TUpDown;
Button7: TButton;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Memo4: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
procedure UpDown2Click(Sender: TObject; Button: TUDBtnType);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
mas:array[1..20,1..20] of Double;
z:array[1..20,1..20] of Double;
d:array[1..20,1..20] of Double;
sig:array[1..20] of Double;
mas_i:array[1..20] of Double;
n:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
// производим нормировку в массиве
for i := 1 to StringGrid1.ColCount-1 do
for j:=1 to StringGrid1.RowCount-1 do
z[i,j]:=(mas[i,j]-mas_i[i])/sig[i];
// переносим все в таблицу
with StringGrid1 do
for i := 1 to ColCount-1 do
for j := 1 to RowCount-1 do
Cells[i,j]:= FloatToStr(z[i,j]);
ShowMessage('Нормировка выполнена');
Memo3.Visible:=true;
Button4.Visible:=true;
end;
procedure refre();
begin
Form1.Memo2.Visible:=false;
Form1.Button1.Visible:=false;
Form1.memo3.Visible:=false;
Form1.button4.Visible:=false;
Form1.memo4.Visible:=false;
Form1.button5.Visible:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j,k:integer;
sum:double;
begin
with StringGrid1 do
for i := 1 to ColCount-1 do
for j := 1 to RowCount-1 do
begin
if Cells[i,j]='' then
begin
ShowMessage('В поле ввода пусто.'#13#10'Введите число');
exit;
end;
end;
with StringGrid1 do
for i := 1 to ColCount-1 do
for j := 1 to RowCount-1 do
mas[i,j] :=StrToFloat(Cells[i,j]);
// вычисление Xi
for k:=1 to StringGrid1.ColCount-1 do
begin
sum:=0;
for i:=1 to StringGrid1.RowCount-1 do
sum:=sum+mas[k,i];
mas_i[k]:=sum/(StringGrid1.RowCount-1);
end;
// вычисление сигмы i
for j := 1 to StringGrid1.ColCount-1 do
begin
sum:=0;
for i:=1 to StringGrid1.RowCount-1 do
sum:=sum+(mas[j,i]-mas_i[j])*(mas[j,i]-mas_i[j]);
sig[j]:=Sqrt(sum/(StringGrid1.RowCount-1));
end;
ShowMessage('Вычисления произведены');
Memo2.Visible:=true;
Button1.Visible:=true;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,k:integer;
begin
end;
procedure TForm1.Button4Click(Sender: TObject);
var i,j,k:integer;
sum,a,b,c:double;
begin
for i:=1 to StringGrid1.RowCount-1 do
begin
for j:=1 to StringGrid1.RowCount-1 do
if (i=j) then d[i,j]:=0
else
begin
sum:=0;
for k:=1 to StringGrid1.ColCount-1 do
begin
a:=z[k,i];
b:=z[k,j];
sum:=sum+(a-b)*(a-b);
end;
d[i,j]:=Sqrt(sum);
end;
end;
// выводим получившиеся
StringGrid1.ColCount:=StringGrid1.RowCount;
StringGrid1.Refresh;
with StringGrid1 do
for i := 1 to ColCount-1 do
for j := 1 to RowCount-1 do
Cells[i,j]:= FloatToStr(d[i,j]);
n:=StringGrid1.RowCount-1;
ShowMessage('Данные проклассифицированы');
memo4.Visible:=true;
button5.Visible:=true;
for i:=1 to 5 do
StringGrid1.Cells[i,0]:=IntToStr(i);
end;
// удаление заданной строки из переданной таблицы
procedure GridDeleteRow(RowNumber: Integer; Grid: TstringGrid);
var
i: Integer;
begin
Grid.Row := RowNumber;
if (Grid.Row = Grid.RowCount - 1) then
{ On the last row}
Grid.RowCount := Grid.RowCount - 1
else
begin
{ Not the last row}
for i := RowNumber to Grid.RowCount - 1 do
Grid.Rows[i] := Grid.Rows[i + 1];
Grid.RowCount := Grid.RowCount - 1;
end;
end;
// удаление заданного столбца из переданной таблицы
procedure GridDeleteCol(ColNumber: Integer; Grid: TstringGrid);
var
i: Integer;
begin
Grid.Col := ColNumber;
if (Grid.Col = Grid.ColCount - 1) then
{ On the last row}
Grid.ColCount := Grid.ColCount - 1
else
begin
{ Not the last row}
for i := ColNumber to Grid.ColCount - 1 do
Grid.Cols[i] := Grid.Cols[i + 1];
Grid.ColCount := Grid.ColCount - 1;
end;
end;
// процедура поиска сохранения минимума
procedure dd(SG:TstringGrid;ii:integer;jj:integer);
var i,j:integer;
begin
for i:=1 to SG.RowCount do
begin
if SG.Cells[ii,i]< SG.Cells[jj,i] then SG.Cells[ii,i]:=SG.Cells[jj,i];
if SG.Cells[i,ii]< SG.Cells[i,jj] then SG.Cells[i,ii]:=SG.Cells[i,jj];
SG.Cells[i,i]:=IntToStr(0);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var i,j,ii,jj:integer;
min:double;
begin
while (StringGrid1.RowCount-1 >2) do
begin
min:=1000;
for i:=1 to (StringGrid1.RowCount-1) do
for j:=1 to (StringGrid1.RowCount-1) do
if (d[i,j]<min)and (i<>j) then
begin
min:=d[i,j];
ii:=i;
jj:=j;
end;
if (jj<=(StringGrid1.RowCount-1)) and (StringGrid1.RowCount>2) then
begin
dd(StringGrid1,ii,jj);
StringGrid1.Cells[ii,0]:=StringGrid1.Cells[ii,0]+'-'+StringGrid1.Cells[jj,0];
GridDeleteRow(jj,StringGrid1);
GridDeleteCol(jj,StringGrid1);
StringGrid1.Refresh;
end;
end;
ShowMessage('Матрица построена');
end;
procedure TForm1.N1Click(Sender: TObject);
begin
end;
// Save a TStringGrid to a file
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
i, k: Integer;
begin
AssignFile(f, FileName);
Rewrite(f);
with StringGrid do
begin
// Write number of Columns/Rows
Writeln(f, ColCount);
Writeln(f, RowCount);
// loop through cells
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Writeln(F, Cells[i, k]);
end;
CloseFile(F);
end;
procedure TForm1.Save1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
SaveStringGrid(StringGrid1, OpenDialog1.FileName);
end;
// Load a TStringGrid from a file
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
iTmp, i, k: Integer;
strTemp: String;
begin
AssignFile(f, FileName);
Reset(f);
with StringGrid do
begin
// Get number of columns
Readln(f, iTmp);
ColCount := iTmp;
// Get number of rows
Readln(f, iTmp);
RowCount := iTmp;
// loop through cells & fill in values
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
begin
Readln(f, strTemp);
Cells[i, k] := strTemp;
end;
end;
CloseFile(f);
end;
procedure TForm1.N3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
LoadStringGrid(StringGrid1, OpenDialog1.FileName);
end;
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
Button6.caption:='Строка '+ IntToStr(UpDown1.Position);
end;
procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType);
begin
Button7.caption:='Столбец '+ IntToStr(UpDown2.Position);
end;
procedure TForm1.Button6Click(Sender: TObject);
var i,k:integer;
begin
StringGrid1.RowCount:=UpDown1.Position+1;
with StringGrid1 do
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Cells[i, k] := '';
refre();
end;
procedure TForm1.Button7Click(Sender: TObject);
var i,k:integer;
begin
StringGrid1.ColCount:=UpDown2.Position+1;
with StringGrid1 do
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Cells[i, k] := '';
refre();
end;
procedure TForm1.N2Click(Sender: TObject);
begin
label1.Visible:=true;
label2.Visible:=true;
Button6.Visible:=true;
Button7.Visible:=true;
UpDown1.Visible:=true;
UpDown2.Visible:=true;
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if ((key<'0')or (key>'9'))and(Key<>'VK_BACK')and(Key<>',')then key:=#0;
end;
end.