- •Windows -приложение
- •Среда программирования
- •Встроенный отладчик
- •Использование графики
- •Графические данные и палитра
- •Сохранение проекта
- •Структура приложения
- •Структура модуля
- •Простые типы
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Составной оператор
- •Оператор if
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла repeat
- •Пример приложения 6
- •Пример приложения 7
- •Статические массивы
- •Динамические массивы
- •Оператор with
- •Идентичность типов
- •Совместимость типов
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Рекурсия
- •Процедура exit
- •Директивы подпрограммы
- •Класс как объектный тип
- •Наследование
- •Операции is и as
- •Типы ссылки на класс
- •Типизированные файлы
- •Файлы без типа
- •Пример приложения 17
- •Компонент tmainmenii
- •Двунаправленные списки
- •Потоки данных
- •Пример приложения 22
- •Интерфейс drag and drop
- •Пример приложения 24
- •С файлами
- •Пример приложения 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Проблемы синхронизации потоков
Пример приложения 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.