Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Емельянов.doc
Скачиваний:
12
Добавлен:
03.11.2018
Размер:
3.25 Mб
Скачать

Пример приложения 26

Анализ качества продукции на некотором производстве проводится пу­тем измерения при некоторых условиях х некоторого признака у. Пусть оп­ределенная совокупность x,y,My,Dy, состоящая из n= 8 элементов, записа­на в типизированный файл DatPro.dat, причем первоначально My, Dy равны нулю и их предстоит вычислить. Если производство работает нормально, то совокупность точек х, у должна ложиться на прямую линию. Методом наи­меньших квадратов необходимо постоянно контролировать на производстве этот факт, т.е. если ошибка отклонения функции y=f(x) от прямой линии меньше, чем некоторая величина µ то качество выпускаемой продукции в пределах нормы, иначе необходимо принимать меры по изменению, напри­мер, технологического режима. Пусть µ=0,08. В данном случае применяются следующие формулы расчета:

В этих формулах обозначено, например, Расчет ошибки выполняется по следующей формуле: примера представлены на рис. 62.Рис.62

208

209

Исходные данные необходимо записать с помощью отдельной програм­мы в типизированный файл. Все необходимые сведения по работе с ото­бражаемыми файлами приводятся в следующем тексте программы:

unit Unit25;

interface

uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls;

Type TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

BitBtnl: TBitBtn;

Memo2: TMemo;

Label1: TLabel;

Label2: TLabel;

procedure Button1Click(Sender: TObject);

public

hFile:THandle; hFileMapObject: THandle;

PFileMem:Pointer;

end;

datP=record

x,y,My,Dy:real;

end;

const n=8;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

type buf=array of datP;

var FilName:string; r:datP; s:string; i:byte;

ff:file of datP; a,b, Sx, Sy, Sx2, Sxy.-real;

begin

FilName:='DatPro.dat'; {$1-}

AssignFile(ff,FilNaitte);

Reset(ff); {$1+}

if IOResult<>O then begin

Memo1.Lines.Add('Ошибка открытия файла'); Exit;

­end;

for i:=l to n do begin;

210

Read(ff,r);

s:='';

with r do begin s:=FormatFloat('0.00',x)+FormatFloat(' 0.00',y)+

FormatFloat(' 0.00',My)+ FormatFloat(' 0.00',Dy); Memo1.Lines.Add(s);

end;

end;

CloseFile(ff); PFileMem:=nil;

hFile:=CreateFileA(pChar(FilName),GENERIC_READ or GENERICJWRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,

nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

if hFile=INVALID_HANDLE_VALUE then begin

memo2.Lines.Add('Ошибка открытия файла Windows'); Exit; ­end;

hFileMapObject:=CreateFileMapping(hFile, nil,

PAGE_READWRITE, 0,0,'ShareMem');

if hFileMapObject = INVALID_HANDLE_VALUE then begin memo2.Lines.Add('Ошибка открытия файла отображения'); CloseHandle(hFile);

Exit; end;

PFileMem := MapViewOfFile(hFileMapObject,

FILE_MAP_ALL_ACCESS,0, 0,n*Sizeof(datP));

if PFileMem = nil then begin

memo2.Lines.Add('Ошибка открытия отображения в памяти'), CloseHandle(hFileMapObject);

CloseHandle(hFile);

Exit;

end;

s:=’’;

Sx:=0.0;

Sy:=0.0;

Sx2:=0.0;

Sxy:=0.0;

FOR I:=0 TO n-1 DO

with buf(PFileMem)[I] do begin

Sx:=Sx+x;

Sx2:=Sx2+sqr(x);

Sy:=Sy+y;

Sxy:=Sxy+y*x;

end;

a:=(Sy*Sx2-Sxy*Sx)/(n*Sx2-sqr(Sx));

b:=(n*Sxy-Sy*Sx)/(n*Sx2-sqr(Sx));

Sy:=0.0;

FOR I:=0 TO n-1 DO ;

211

with buf(PFileMem)[I] do begin

My:=a+b*x;

Dy:=My-y;

Sy:=Sy+sqr(Dy); end;

Sxy:=sqrt(Sy/(n-l) ) ;

memo2.Lines.Add('Ошибка='+FormatFloat(' 0 . 00000',Sxy));

if Sxy>0.08 then

memo2.Lines.Add('В системе производства сбои...')

else memo2.Lines.Add('B производстве все в порядке!');

if PFileMem<>nil then UnMapViewOfFile (PFileMem) ;

if hFileMapObjeot<>O then CloseHandle(hFileMapObject);

if hFile=0 then CloseHandle(hFile);

AssignFile(ff,FilName);

Reset(ff);

Memo2.Lines.Add(s);

for i:=l to n do begin;

Read(ff,r);

with r do begin

s:=FormatFloat('0.00',x)+FormatFloat(0.00', y)+

FormatFloat(' 0.0000',My)+ FormatFloat(‘ 0.0000',Dy);

memo2.Lines.Add(s) ;

end;

end;

CloseFile(ff) ;

end;

end.

Следует обратить внимание на то, какое преобразование типов было ис­пользовано для работы с выделенной под файл памятью. Самым замечатель­ным является то, что любые изменения в памяти мгновенно отражаются в отображенном файле. Так, если второй раз запустить программу на выпол­нение, то исходные данные (см. рис. 62) будут отражать уже не нулевые зна­чения величин My и Dy.