Разработка алгоритмов и программного обеспечения обработки биологических сигналов на примере реографии в Delphi
Методики использования реографа при исследовании гемодинамических показателей. Математическая обработка кардиографических и реографических данных. Формальное описание программы. Работа с файлами, обработка исключительных ситуаций при открытии файла.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | диссертация |
Язык | русский |
Дата добавления | 24.05.2018 |
Размер файла | 1,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
массивы сигналов ЭКГ, реограммы, ФКГ,
опорный сигнал;
Kalibr_Z0, Kalibr_DZ: Real48 -
значения калибровки;
Глобальные переменные:
Reo1: TReo; -
переменная, в которую заносятся данные из файла
F: file of TReo; -
файловая переменная (п.1.4.)
I1, I2: integer -
размеры изображения по горизонтальной оси. Эти параметры необходимы для пересчёта координат. |I2-I1| - ширина изображения. (п.1.6.)
J1, J2: integer -
размеры изображения по вертикальной оси. Эти параметры необходимы для пересчёта координат. |J2-J1| - высота изображения. (п.1.6.)
ARR: array[1..80] of smallint-
- массив, в который вносятся абсциссы максимумов дифференцированной реограммы (п.1.10.)
h1: smallint; -
сумма модулей глобального максимума и минимума графиков ЭКГ, РЕО и ФКГ
h2 smallint; -
сумма модулей глобальных минимумов графиков ЭКГ, РЕО и глобального максимума ЭКГ
h2: smallint; -
сумма модулей лобальных минимумов графиков ЭКГ, РЕО, ФКГ и глобальных максимумов РЕО и ЭКГ
Константа:
Predel=7000 -
количество точек в массиве
3.2 Работа с файлами
В типизированных файлах данные хранятся в виде структуры, представляющие какой-либо тип. В данном случае - запись. Для начала работы с файлом необходимо инициализировать файловую переменную этого типа (в данной программе она обозначается как F). Файловая переменная задаётся c помощью структуры file of.
F:=file of TReo.
Связывание файловой переменной с именем файла происходит при помощи процедуры AssignFile(<файловая переменная>,<название файла>). Файл открывается с помощью процедуры Reset(<файловая переменная>).
Считывание данных из файла переменной в переменную для сохранения прочитанных данных происходит с помощью переменной Read(<файловая переменная>,<переменная для сохранения непрочитанных данных>). После считывания данных из файла в независимую переменную файл нужно закрыть с помощью метода CloseFile (<файловая переменная>).
3.3 Обработка исключительных ситуаций при открытии файла
Исключительные ситуации в среде программирования Delphi управляются с помощью нескольких операторов. В данной программе использовался оператор try…except.
Так как при открытии файла могут возникать различные исключительные ситуации, то был применён базовый класс исключений Exception.
try
AssignFile(F,OpenDialog1.FileName); ////Открытие файла
Reset(F);
Read(F,Reo1); ////Чтение данных из файла в переменную
CloseFile(F); ////Закрытие файла
except
on E:Exception do ShowMessage(E.Message); /// вызов сообщения об ошибке
end;
end;
Сообщение об ошибке изображено на иконке
При нажатии на кнопку ОК, окошко ошибки закрывается и основная программа снова становится доступна. Программа имеет вид, представленный на рис. 16-18.
Рис.20. Окно программы до открытия файла.
Рис.21. Окно программы после нажатия на кнопку Данные
Рис. 22. Окно программы после нажатия на кнопку Разместить
3.4 Работа с канвой принтера
Для работой с принтером необходимо подключить модуль Printers. Начало и окончание печати сигнализируются операторами BeginDoc и EndDoc.
Для вывода текста применяются метод канвы принтера TextOut(X,Y:integer; Текст:string). Для печати графиков применяются методы MoveTo и LineTo. Их действие описано в п.2.3.
Пересчёт координат с экрана на лист осуществляется с помощью специальных функций.
Result:=GetDeviceCaps(Printer.Canvas.Handle, VertRes) - получение высоты страницы в пикселях, заданной в свойствах принтера. Метод Handle берёт эту информацию из API Windows. Аналогично действует получение ширины страницы, но вместо параметра VertRes используется HorzRes.
Result:=round(GetDeviceCaps(printer.Handle,LogPixelsX)/25.4*x) - преобразование координат по оси Х с экрана на бумагу по формуле: , где PPI - количество пикселей на дюйм. Т.к. в русской системе предпочтительнее использовать миллиметры, то значение PPI надо разделить на количество миллиметров в дюйме - 25.4 мм. LogPixelsX возвращает PPI по оси Х. Аналогично происходит пересчёт координат заменой Х на Y.
Выводы к главе 3
Приведены сведения по работе с программой по оцифровыванию реографического аналогового сигнала и иллюстрации интерфейса программного продукта.
Заключение
Составлен обзор реографической методики и видов реографии. Сделан вывод о перспективности реографии в исследовании центральной и местной гемодинамики, как о точном методе.
Разработаны алгоритмы совместной обработки физиологических параметров реограммы и кардиограммы различными математическими методами.
Приведены сведения по работе с программой по оцифровыванию реографического аналогового сигнала и иллюстрации интерфейса программного продукта.
Список литературы
1. Инструментальные методы исследования сердечно-сосудистой системы /Под ред. Т.С. Виноградовой. - М.: Медицина, 1996.
2. Полищук В.И., Терехова Л.Г. Техника и методика реографии и реоплетизмографии. - М.: Медицина, 1993.
3. Яруллин Х.Х. Клиническая реоэнцефалография. М., Медицина, 1993, 270 С.
4. Ремизов А.Н. Медицинская и биологическая физика.- М.: Высш. шк., 1987.
5. Сапин М.Р., Билич Г.Л. Анатомия человека. - М.: Высш. шк., 1989
6. Попечителев Е.П. Инженерные аспекты медико-биологических исследований. - Л.: ЛЭТИ, 1985.
7. Г.П. Матвейков, С.С. Пшоник. Клиническая реография. Минск, «Беларусь», 1986.-175 С.
8. Информационно-измерительная техника и технологии: Учеб. для ву-
зов/В.И. Калашников, С.В. Нефедов, А.Б. Путилин и др./Под ред. Г.Г. Раннепа. -- М.: Высшая школа, 2002. -- 454 с.
9. Медицинские приборы. Разработки и проектирование. -- М.: Меди-
цинская книга, 2004. -- 720 с.
10. Эман А.А. Биофизические основы измерения артериального давле-
ния.--Л.: Медицина, 1983. -- 126 с.
11.Сергиенко А.Б. Цифровая обработка сигналов. - СШ.: Пинтер, 2002.-608 с.
12. Яковлев П.В., Яковлев В.М. Клинико-патофизиологическая интерпретация электрокардиограмм. - Н.Новгород: Изд-во НГМА, Москва: Медицинская книга, 1999. - 100 с.
13. Колпаков Ф.Ф. Ультразвуковые измерительные преобразователи медицинских диагностических систем: Консп. лекций по курсу "Биомедицинские измерительные преобразователи". - Х.: Гос. аэрокосм. ун-т «Харьк. авиац. ин-т», 2000.
14. Мустецов Н.П. Инструментальные методы медико-биологических исследований: Учеб. пособие. - Х.: ХТУРЭ, 1999.
15. Олейник В.П., Кулиш С.Н., Овчаренко В.Е. Методы медико-биологических исследований: Учеб. пособие. - Х.: Нац. аэрокосм. ун-т «Харьк. авиац. ин-т», 2003.
16. Олейник В.П., Олейник В.Н., Кулиш С.Н. Методы медико-биологических исследований: Учеб. пособие по лаб. практикуму. - Х.: Гос. аэрокосм. ун-т «Харьк. авиац. ин-т», 1999.
17. Цегельникова А.Л. Методические указания по выполнению лабораторных работ. Реография. Обработка сигнала и расчёт гемодинамических показателей в системе Delphi. - M.:МИРЭА, 2004. - 20 с.
18. Полуавтоматическая и автоматическая расшифровка реограмм. Метод. рекомен. МЗ Составители: Молоканов Н.Я., Милягин В.А., Стельмах В.М. Смоленск,1988. 21 С.
19. Комплексная оценка функционального состояния систем кровообращения и дыхания методом интегральной реографии тела. Метод. рекомен. МЗ Российской Федерации. Составители: Волков Ю.Н., Большов В.М., Сингаевский С.Б., Земцовский Э.В., Гуссейнов Б.А. М., 1989. 21С.
20. Комплексная оценка функционального состояния гемодинамики методом импедансной электроплетизмографии и импедансометрии. Метод. рекомен. МЗ Российской Федерации. Составители: Е.А, Лужников, А.И. Ишмухаметов, Л.Г. Костомарова, А.С. Савина, К.К. Ильяшенко, А.А. Цветков, М., 1985, 33 С.
21. Методические рекомендации по определению основных параметров гемодинамики и тонуса сосудов методом тетраполярной, трансторакальной, импедансной реоплетизмографии. Метод. рекомен. МЗ Украины. Составители: Б.М, Щепотин, С.В. Волосюк, М.И. Гуревич, А.Г. Карцева, Л.П. Литовченко, А.И. Соловьев, Л.Д. Фесенко, Л.Б. Доломан. Киев, Наукова думка, 1980, 19 С.
22. Применение импедансной плетизмографии для оценки состояния центральной гемодинамики. Метод. рекомен. МЗ Белоруссии. Составители: Л.З. Полонецкий, В.М. Альхимович. Минск. 1985. 23 С.
23. Мальцев А. И. Основы линейной алгебры. М.: Наука, 1970.
24. Кетков Ю., Кетков А., Шульц М. MATLAB 6.x: программирование численных методов. СПб.: БХВ_Петербург, 2004.
25. Стечкин C. Б., Субботин Ю. Н. Сплайны в вычислительной математике. М. Наука. 1986. -248 с.
26. Неинвазивная диагностика нарушений периферического и церебрального кровообращения. Метод. рекомен. ЛОО при СМ. Составители: К.И. Овчаренко, В.П. Седов. Москва, 1990. - 47 С.
27. В.В. Карпенко, Е.А. Евдокимов Интегральная реография в оценке функции системы кровообращения. Лекция ЦОЛИУВ. Москва, 1985. -24 С.
28. http://lainslav.narod.ru/ - Медицина - Реография.
29. Язык программирования Delphi
ПРИЛОЖЕНИЕ
Листинг основной программы.
unit Unit1;
interface
uses
Windows, Classes, ActnList, Dialogs, Menus, StdCtrls, Controls, ExtCtrls,
Printers, Messages, SysUtils, Variants, Graphics, Forms,
Buttons, Grids;
Type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
PopupMenu1: TPopupMenu; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; OpenDialog1: TOpenDialog; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; N7: TMenuItem; N8: TMenuItem; N9: TMenuItem; ActionList1: TActionList; Action1: TAction; Image1: TImage; Action2: TAction; Action3: TAction; Action4: TAction; procedure Action1Execute(Sender: TObject); procedure Action2Execute(Sender: TObject); procedure Action3Execute(Sender: TObject); procedure Action4Execute(Sender: TObject); procedure MaxR; procedure MaxM; procedure GelZ; procedure PrintGrafik; procedure PrintZ; procedure PrintR; procedure PrintM; private { Private declarations } public { Public declarations } end; function WidthX: Integer; function HeightY: Integer; function II(x:smallint):integer; function JJ(y,y1,y2:smallint):integer;const Predel=7000;type TReo=record RegNumber:smallint; Da_ta,Name:shortstring; Distance,Perimetr:smallint; Leng_s,Weight:smallint; Sist_BP,Diast_BP:smallint; B:array[1..4,1..Predel] of smallint; Kalibr_Z0,Kalibr_DZ:Real48; end;var Form1: TForm1; Reo1: TReo; F:file of TReo; I1,I2,J1,J2:integer; ARR:array[1..80] of smallint; h1,h2,h3:smallint;implementation{$R *.dfm}////процедура при нажатии на кнопке Открытьprocedure TForm1.Action1Execute(Sender: TObject); begin OpenDialog1.Filter:='Файлы данных (*.dat)|*.dat|Все файлы|*.*'; OpenDialog1.FilterIndex:=1; OpenDialog1.Title:='Выбор файла'; if OpenDialog1.Execute then begin try AssignFile(F,OpenDialog1.FileName); ////Открытие файла Reset(F); Read(F,Reo1); ////Чтение данных из файла в переменную CloseFile(F); ////Закрытие файла Button2.Enabled:=True; Button3.Enabled:=True; Button4.Enabled:=True; N3.Enabled:=True; N4.Enabled:=True; N5.Enabled:=True; N7.Enabled:=True; N8.Enabled:=True; N9.Enabled:=True; except ////Обработка исключительных ситуаций on E:EInOutError do ShowMessage(E.Message); end; end;end;////Нахождение минимального значения ЭКГfunction MinEKG:smallint;var j:integer;begin Result:=Reo1.B[1,1]; for j:=1 to Predel do if Reo1.B[1,j]<Result then Result:=Reo1.B[1,j];end;////Нахождение максимального значения ЭКГfunction MaxEKG:smallint;var j:integer;begin Result:=Reo1.B[1,1]; for j:=1 to Predel do if Reo1.B[1,j]>Result then Result:=Reo1.B[1,j]end;////Нахождение минимального значения дифференцированной реограммыfunction MinReo:smallint;var j:integer;begin Result:=Reo1.B[2,1]; for j:=1 to Predel do if Reo1.B[2,j]<Result then Result:=Reo1.B[2,j];end;////Нахождение максимального значения дифференцированной реограммыfunction MaxReo:smallint;var j:integer;begin Result:=Reo1.B[2,1]; for j:=1 to Predel do if Reo1.B[2,j]>Result then Result:=Reo1.B[2,j]end;////Нахождение минимального значения ФКГfunction MinFKG:smallint;var j:integer;begin Result:=Reo1.B[3,1]; for j:=1 to Predel do if Reo1.B[3,j]<Result then Result:=Reo1.B[3,j];end;////Нахождение максимального значения ФКГfunction MaxFKG:smallint;var j:integer;begin Result:=Reo1.B[3,1]; for j:=1 to Predel do if Reo1.B[3,j]>Result then Result:=Reo1.B[3,j]end;////функция пересчёта координат по оси Хfunction II(x:smallint):integer;var x1,x2:integer;begin x1:=1; x2:=1000; II:=I1+Trunc((x-x1)*(I2-I1)/(x2-x1));end;////функция пересчёта координат по оси Yfunction JJ(y,y1,y2:smallint):integer;begin JJ:=J2+Trunc((y-y1)*(J1-J2)/(y2-y1));end;////процедура при нажатии на кнопке Данные - ввод информации в поля TEdit и построение графикаprocedure TForm1.Action2Execute(Sender: TObject);var j:integer; A:array[0..30] of char;begin Image1.Picture:=nil; ////Очистка TImage1 Edit1.Text:=IntToStr(Reo1.RegNumber); ////Ввод данных в TEdit Edit2.Text:=Reo1.Da_ta; OemToChar(StrPCopy(A,Reo1.Name),A); ////Перекодировка строки из DOS в Win-1251 Edit3.Text:=A; Edit4.Text:=IntToStr(Reo1.Distance); Edit5.Text:=IntToStr(Reo1.Perimetr); Edit6.Text:=IntToStr(Reo1.Leng_s); Edit7.Text:=IntToStr(Reo1.Weight); Edit8.Text:=IntToStr(Reo1.Sist_BP); Edit9.Text:=IntToStr(Reo1.Diast_BP); I1:=0; ////Ввод координат, в пределах которых будет происходить построение графиков I2:=Image1.Width; J1:=0; J2:=Round(Image1.Height)-30; h1:=Abs(MaxEKG)+Abs(MinEKG)+Abs(MaxFKG)+Abs(MinFKG)+Abs(MaxReo)+Abs(MinReo); h2:=Abs(MaxEKG)+Abs(MinEKG)+Abs(MinReo);h3:=Abs(MaxEKG)+Abs(MinEKG)+Abs(MaxReo)+Abs(MinReo)+Abs(MinFKG); Image1.Canvas.Pen.Color:=clRed; Image1.Canvas.MoveTo(II(1),JJ(Reo1.B[1,1],0,h1)); for j:=1 to 1000 do ////Построение графиков begin Image1.Canvas.LineTo(II(j+1),JJ(Reo1.B[1,j+1],0,h1)); end; Image1.Canvas.Pen.Color:=clBlue; Image1.Canvas.MoveTo(II(1),JJ(Reo1.B[2,1]+h2,0,h1)+5); for j:=1 to 1000 do begin Image1.Canvas.LineTo(II(j+1),JJ(Reo1.B[2,j+1]+h2,0,h1)+5); end; Image1.Canvas.Pen.Color:=clBlack; Image1.Canvas.MoveTo(II(1),JJ(Reo1.B[3,1]+h3,0,h1)+5); for j:=1 to 1000 do begin Image1.Canvas.LineTo(II(j+1),JJ(Reo1.B[3,j+1]+h3,0,h1)+5); end;end;////нахождение порогового значения (для поиска R-зубцов)function PorogR:smallint;var j:integer; sum,max:smallint;begin sum:=0; for j:=1 to Predel do sum:=sum+Reo1.B[1,j]; max:=Reo1.B[1,1]; for j:=1 to Predel do if Reo1.B[1,j]>max then max:=Reo1.B[1,j]; Result:=Round(sum/Predel+max/2);end;////нахождение порогового значения (для поиска M-зубцов)function PorogM:smallint;var j:integer; sum,max:smallint;begin sum:=0; for j:=1 to Predel do sum:=sum+Reo1.B[2,j]; max:=Reo1.B[2,1]; for j:=1 to Predel do if Reo1.B[2,j]>max then max:=Reo1.B[2,j]; Result:=Round(sum/Predel+max/2);end;////нахождение R-зубцовprocedure TForm1.MaxR;var j,Rx,Ry,p,p1,p2,k:integer;begin Image1.Canvas.Brush.Style:=bsClear; Image1.Canvas.Font.Color:=clBlack; Image1.Canvas.Pen.Color:=clBlack; for j:=1 to 1000 do if Reo1.B[1,j]<PorogR then begin if PorogR<Reo1.B[1,j+1] then begin p1:=j+1; for k:=p1 to 1000 do if Reo1.B[1,k]>PorogR then if Reo1.B[1,k+1]<PorogR then begin p2:=k; Rx:=p1; Ry:=Reo1.B[1,p1]; for p:=p1 to p2 do if Reo1.B[1,p]>Ry then begin Ry:=Reo1.B[1,p]; Rx:=p; end; Image1.Canvas.MoveTo(II(Rx),JJ(Ry,0,h1)-7); Image1.Canvas.LineTo(II(Rx),JJ(Ry,0,h1)); end; end; end;end;////нахождение максимумов дифференцированной реограммыprocedure TForm1.MaxM;var a,i,Mx,My,r,r1,r2,m:integer;begin Image1.Canvas.Brush.Style:=bsClear; Image1.Canvas.Pen.Color:=clRed; ARR[1]:=1; a:=2; for i:=1 to 1000 do if Reo1.B[2,i]<PorogM then begin if PorogM<=Reo1.B[2,i+1] then begin r1:=i+1; for m:=r1 to 1000 do if Reo1.B[2,m]>=PorogM then if Reo1.B[2,m+1]<PorogM then begin r2:=m; Mx:=r1; My:=Reo1.B[2,r1]; for r:=r1 to r2 do if Reo1.B[2,r]>My then begin My:=Reo1.B[2,r]; Mx:=r; end; ARR[a]:=Mx; a:=a+1; ////заполнение массива координатами точек максимума дифференцированной реограммы по оси Х (это нужно для нахождения точек выброса крови из левого жедудочка) Image1.Canvas.MoveTo(II(Mx),JJ(My+h2,0,h1)+5); Image1.Canvas.LineTo(II(Mx),JJ(My+h2,0,h1)-4); Break; end; end; end;end;////Нахождение точек выбрасывания крови из левого желудочка сердцаprocedure TForm1.GelZ;var b,c,Px,Py,t:integer; Max:real;begin Image1.Canvas.Brush.Style:=bsClear; Image1.Canvas.Pen.Color:=clRed; Px:=1; Py:=1; for b:=1 to 80 do if ARR[b]<ARR[b+1] then begin Max:=0.00001; for c:=ARR[b] to ARR[b+1] do begin if (Reo1.B[2,c+1]-Reo1.B[2,c-1])/2>Max then begin Max:=(Reo1.B[2,c+1]-Reo1.B[2,c-1])/2; Px:=c; Py:=Reo1.B[2,c]; end; end; t:=Round(Px-Py/Max); Image1.Canvas.MoveTo(II(t),JJ(Reo1.B[2,t]+h2,0,h1)+20); Image1.Canvas.LineTo(II(t),JJ(Reo1.B[2,t]+h2,0,h1)-6); end else Break;end;////процедура при нажатии на кнопку Разместитьprocedure TForm1.Action3Execute(Sender: TObject);begin MaxR; MaxM; GelZ;end;////функция получения высотры страницы в пикселяхfunction HeightY: Integer;begin Result:=GetDeviceCaps(Printer.Canvas.Handle, VertRes)end;////функция получения ширины страницы в пикселяхfunction WidthX: Integer;begin Result:=GetDeviceCaps(Printer.Canvas.Handle, HorzRes)end;////функция преобразования координат с бумаги по оси Хfunction PrinterCoordX(x:integer):integer;begin Result:=round(GetDeviceCaps(printer.Handle,LogPixelsX)/25.4*x);end;////функция преобразования координат с бумаги по оси Yfunction PrinterCoordY(Y:integer):integer;begin Result:=round(GetDeviceCaps(printer.Handle,LogPixelsY)/25.4*Y);end;////печать графиковprocedure TForm1.PrintGrafik;var j:integer;begin I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2);Printer.Canvas.MoveTo(II(1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[1,1],0,h1)); for j:=1 to 1000 do beginPrinter.Canvas.LineTo(II(j+1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[1,j+1],0,h1)); end;Printer.Canvas.MoveTo(II(1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,1]+h2,0,h1)+5); for j:=1 to 1000 do beginPrinter.Canvas.LineTo(II(j+1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,j+1]+h2,0,h1)+5); end;Printer.Canvas.MoveTo(II(1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[3,1]+h3,0,h1)+5); for j:=1 to 1000 do beginPrinter.Canvas.LineTo(II(j+1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[3,j+1]+h3,0,h1)+5); end;end;////печать R-зубцовprocedure TForm1.PrintR;var j,Rx,Ry,p,p1,p2,k:integer;begin Printer.Canvas.Brush.Style:=bsClear; I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2); for j:=1 to 1000 do if Reo1.B[1,j]<PorogR then begin if PorogR<Reo1.B[1,j+1] then begin p1:=j+1; for k:=p1 to 1000 do if Reo1.B[1,k]>PorogR then if Reo1.B[1,k+1]<PorogR then begin p2:=k; Rx:=p1; Ry:=Reo1.B[1,p1]; for p:=p1 to p2 do if Reo1.B[1,p]>Ry then begin Ry:=Reo1.B[1,p]; Rx:=p; end; Printer.Canvas.MoveTo(II(Rx),PrinterCoordY(10+9*Font.Size)+JJ(Ry,0,h1)-20); Printer.Canvas.LineTo(II(Rx),PrinterCoordY(10+9*Font.Size)+JJ(Ry,0,h1)+30); end; end; end;end;////печать точек выброса крови из левого желудочкаprocedure TForm1.PrintZ;var b,c,Px,Py,t:integer; Max:real;begin Printer.Canvas.Brush.Style:=bsClear; I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2); Px:=1; Py:=1; for b:=1 to 80 do if ARR[b]<ARR[b+1] then begin Max:=1; for c:=ARR[b] to ARR[b+1] do begin if (Reo1.B[2,c+1]-Reo1.B[2,c-1])/2>Max then begin Max:=(Reo1.B[2,c+1]-Reo1.B[2,c-1])/2; Px:=c; Py:=Reo1.B[2,c]; end; end; t:=Round(Px-Py/Max);Printer.Canvas.MoveTo(II(t),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,t]+h2,0,h1)-40);Printer.Canvas.LineTo(II(t),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,t]+h2,0,h1)+40); end else Break;end;////печать максимумов дифференцированной реограммыprocedure TForm1.PrintM;var a,i,Mx,My,r,r1,r2,m:integer;begin Printer.Canvas.Brush.Style:=bsClear; I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2); ARR[1]:=1; a:=2; for i:=1 to 1000 do if Reo1.B[2,i]<PorogM then begin if PorogM<=Reo1.B[2,i+1] then begin r1:=i+1; for m:=r1 to 1000 do if Reo1.B[2,m]>=PorogM then if Reo1.B[2,m+1]<PorogM then begin r2:=m; Mx:=r1; My:=Reo1.B[2,r1]; for r:=r1 to r2 do if Reo1.B[2,r]>My then begin My:=Reo1.B[2,r]; Mx:=r; end; ARR[a]:=Mx; a:=a+1;Printer.Canvas.MoveTo(II(Mx),PrinterCoordY(10+9*Font.Size)+JJ(My+h2,0,h1)-20);Printer.Canvas.LineTo(II(Mx),PrinterCoordY(10+9*Font.Size)+JJ(My+h2,0,h1)+30); Break; end; end; end;end;////процедура при нажатии на кнопку Печатьprocedure TForm1.Action4Execute(Sender: TObject);begin Printer.BeginDoc; Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10),Label1.Caption+' '+Edit1.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(Font.Size/2)),Label2.Caption+' '+Edit2.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(2*Font.Size/2)),Label3.Caption+' '+Edit3.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(3*Font.Size/2)),Label4.Caption+' '+Edit4.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(4*Font.Size/2)),Label5.Caption+' '+Edit5.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(5*Font.Size/2)),Label6.Caption+' '+Edit6.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(6*Font.Size/2)),Label7.Caption+' '+Edit7.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(7*Font.Size/2)),Label8.Caption+' '+Edit8.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(8*Font.Size/2)),Label9.Caption+' '+Edit9.Text); PrintGrafik; PrintR; PrintM; PrintZ; Printer.EndDoc;end;end.
Приложение А. Листинг основной программы
unit Unit1;interfaceuses Windows, Classes, ActnList, Dialogs, Menus, StdCtrls, Controls, ExtCtrls, Printers, Messages, SysUtils, Variants, Graphics, Forms, Buttons, Grids;type TForm1 = class(TForm) MainMenu1: TMainMenu; PopupMenu1: TPopupMenu; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; OpenDialog1: TOpenDialog; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; N7: TMenuItem; N8: TMenuItem; N9: TMenuItem; ActionList1: TActionList; Action1: TAction; Image1: TImage; Action2: TAction; Action3: TAction; Action4: TAction; procedure Action1Execute(Sender: TObject); procedure Action2Execute(Sender: TObject); procedure Action3Execute(Sender: TObject); procedure Action4Execute(Sender: TObject); procedure MaxR; procedure MaxM; procedure GelZ; procedure PrintGrafik; procedure PrintZ; procedure PrintR; procedure PrintM; private { Private declarations } public { Public declarations } end; function WidthX: Integer; function HeightY: Integer; function II(x:smallint):integer; function JJ(y,y1,y2:smallint):integer;const Predel=7000;type TReo=record RegNumber:smallint; Da_ta,Name:shortstring; Distance,Perimetr:smallint; Leng_s,Weight:smallint; Sist_BP,Diast_BP:smallint; B:array[1..4,1..Predel] of smallint; Kalibr_Z0,Kalibr_DZ:Real48; end;var Form1: TForm1; Reo1: TReo; F:file of TReo; I1,I2,J1,J2:integer; ARR:array[1..80] of smallint; h1,h2,h3:smallint;implementation{$R *.dfm}////процедура при нажатии на кнопке Открытьprocedure TForm1.Action1Execute(Sender: TObject); begin OpenDialog1.Filter:='Файлы данных (*.dat)|*.dat|Все файлы|*.*'; OpenDialog1.FilterIndex:=1; OpenDialog1.Title:='Выбор файла'; if OpenDialog1.Execute then begin try AssignFile(F,OpenDialog1.FileName); ////Открытие файла Reset(F); Read(F,Reo1); ////Чтение данных из файла в переменную CloseFile(F); ////Закрытие файла Button2.Enabled:=True; Button3.Enabled:=True; Button4.Enabled:=True; N3.Enabled:=True; N4.Enabled:=True; N5.Enabled:=True; N7.Enabled:=True; N8.Enabled:=True; N9.Enabled:=True; except ////Обработка исключительных ситуаций on E:EInOutError do ShowMessage(E.Message); end; end;end;////Нахождение минимального значения ЭКГfunction MinEKG:smallint;var j:integer;begin Result:=Reo1.B[1,1]; for j:=1 to Predel do if Reo1.B[1,j]<Result then Result:=Reo1.B[1,j];end;////Нахождение максимального значения ЭКГfunction MaxEKG:smallint;var j:integer;begin Result:=Reo1.B[1,1]; for j:=1 to Predel do if Reo1.B[1,j]>Result then Result:=Reo1.B[1,j]end;////Нахождение минимального значения дифференцированной реограммыfunction MinReo:smallint;var j:integer;begin Result:=Reo1.B[2,1]; for j:=1 to Predel do if Reo1.B[2,j]<Result then Result:=Reo1.B[2,j];end;////Нахождение максимального значения дифференцированной реограммыfunction MaxReo:smallint;var j:integer;begin Result:=Reo1.B[2,1]; for j:=1 to Predel do if Reo1.B[2,j]>Result then Result:=Reo1.B[2,j]end;////Нахождение минимального значения ФКГfunction MinFKG:smallint;var j:integer;begin Result:=Reo1.B[3,1]; for j:=1 to Predel do if Reo1.B[3,j]<Result then Result:=Reo1.B[3,j];end;////Нахождение максимального значения ФКГfunction MaxFKG:smallint;var j:integer;begin Result:=Reo1.B[3,1]; for j:=1 to Predel do if Reo1.B[3,j]>Result then Result:=Reo1.B[3,j]end;////функция пересчёта координат по оси Хfunction II(x:smallint):integer;var x1,x2:integer;begin x1:=1; x2:=1000; II:=I1+Trunc((x-x1)*(I2-I1)/(x2-x1));end;////функция пересчёта координат по оси Yfunction JJ(y,y1,y2:smallint):integer;begin JJ:=J2+Trunc((y-y1)*(J1-J2)/(y2-y1));end;////процедура при нажатии на кнопке Данные - ввод информации в поля TEdit и построение графикаprocedure TForm1.Action2Execute(Sender: TObject);var j:integer; A:array[0..30] of char;begin Image1.Picture:=nil; ////Очистка TImage1 Edit1.Text:=IntToStr(Reo1.RegNumber); ////Ввод данных в TEdit Edit2.Text:=Reo1.Da_ta; OemToChar(StrPCopy(A,Reo1.Name),A); ////Перекодировка строки из DOS в Win-1251 Edit3.Text:=A; Edit4.Text:=IntToStr(Reo1.Distance); Edit5.Text:=IntToStr(Reo1.Perimetr); Edit6.Text:=IntToStr(Reo1.Leng_s); Edit7.Text:=IntToStr(Reo1.Weight); Edit8.Text:=IntToStr(Reo1.Sist_BP); Edit9.Text:=IntToStr(Reo1.Diast_BP); I1:=0; ////Ввод координат, в пределах которых будет происходить построение графиков I2:=Image1.Width; J1:=0; J2:=Round(Image1.Height)-30; h1:=Abs(MaxEKG)+Abs(MinEKG)+Abs(MaxFKG)+Abs(MinFKG)+Abs(MaxReo)+Abs(MinReo); h2:=Abs(MaxEKG)+Abs(MinEKG)+Abs(MinReo);3:=Abs(MaxEKG)+Abs(MinEKG)+Abs(MaxReo)+Abs(MinReo)+Abs(MinFKG); Image1.Canvas.Pen.Color:=clRed; Image1.Canvas.MoveTo(II(1),JJ(Reo1.B[1,1],0,h1)); for j:=1 to 1000 do ////Построение графиков begin Image1.Canvas.LineTo(II(j+1),JJ(Reo1.B[1,j+1],0,h1)); end; Image1.Canvas.Pen.Color:=clBlue; Image1.Canvas.MoveTo(II(1),JJ(Reo1.B[2,1]+h2,0,h1)+5); for j:=1 to 1000 do begin Image1.Canvas.LineTo(II(j+1),JJ(Reo1.B[2,j+1]+h2,0,h1)+5); end; Image1.Canvas.Pen.Color:=clBlack; Image1.Canvas.MoveTo(II(1),JJ(Reo1.B[3,1]+h3,0,h1)+5); for j:=1 to 1000 do begin Image1.Canvas.LineTo(II(j+1),JJ(Reo1.B[3,j+1]+h3,0,h1)+5); end;end;////нахождение порогового значения (для поиска R-зубцов)function PorogR:smallint;var j:integer; sum,max:smallint;begin sum:=0; for j:=1 to Predel do sum:=sum+Reo1.B[1,j]; max:=Reo1.B[1,1]; for j:=1 to Predel do if Reo1.B[1,j]>max then max:=Reo1.B[1,j]; Result:=Round(sum/Predel+max/2);end;////нахождение порогового значения (для поиска M-зубцов)function PorogM:smallint;var j:integer; sum,max:smallint;begin sum:=0; for j:=1 to Predel do sum:=sum+Reo1.B[2,j]; max:=Reo1.B[2,1]; for j:=1 to Predel do if Reo1.B[2,j]>max then max:=Reo1.B[2,j]; Result:=Round(sum/Predel+max/2);end;////нахождение R-зубцовprocedure TForm1.MaxR;var j,Rx,Ry,p,p1,p2,k:integer;begin Image1.Canvas.Brush.Style:=bsClear; Image1.Canvas.Font.Color:=clBlack; Image1.Canvas.Pen.Color:=clBlack; for j:=1 to 1000 do if Reo1.B[1,j]<PorogR then begin if PorogR<Reo1.B[1,j+1] then begin p1:=j+1; for k:=p1 to 1000 do if Reo1.B[1,k]>PorogR then if Reo1.B[1,k+1]<PorogR then begin p2:=k; Rx:=p1; Ry:=Reo1.B[1,p1]; for p:=p1 to p2 do if Reo1.B[1,p]>Ry then begin Ry:=Reo1.B[1,p]; Rx:=p; end; Image1.Canvas.MoveTo(II(Rx),JJ(Ry,0,h1)-7); Image1.Canvas.LineTo(II(Rx),JJ(Ry,0,h1)); end; end; end;end;////нахождение максимумов дифференцированной реограммыprocedure TForm1.MaxM;var a,i,Mx,My,r,r1,r2,m:integer;begin Image1.Canvas.Brush.Style:=bsClear; Image1.Canvas.Pen.Color:=clRed; ARR[1]:=1; a:=2; for i:=1 to 1000 do if Reo1.B[2,i]<PorogM then begin if PorogM<=Reo1.B[2,i+1] then begin r1:=i+1; for m:=r1 to 1000 do if Reo1.B[2,m]>=PorogM then if Reo1.B[2,m+1]<PorogM then begin r2:=m; Mx:=r1; My:=Reo1.B[2,r1]; for r:=r1 to r2 do if Reo1.B[2,r]>My then begin My:=Reo1.B[2,r]; Mx:=r; end; ARR[a]:=Mx; a:=a+1; ////заполнение массива координатами точек максимума дифференцированной реограммы по оси Х (это нужно для нахождения точек выброса крови из левого жедудочка) Image1.Canvas.MoveTo(II(Mx),JJ(My+h2,0,h1)+5); Image1.Canvas.LineTo(II(Mx),JJ(My+h2,0,h1)-4); Break; end; end; end;end;////Нахождение точек выбрасывания крови из левого желудочка сердцаprocedure TForm1.GelZ;var b,c,Px,Py,t:integer; Max:real;begin Image1.Canvas.Brush.Style:=bsClear; Image1.Canvas.Pen.Color:=clRed; Px:=1; Py:=1; for b:=1 to 80 do if ARR[b]<ARR[b+1] then begin Max:=0.00001; for c:=ARR[b] to ARR[b+1] do begin if (Reo1.B[2,c+1]-Reo1.B[2,c-1])/2>Max then begin Max:=(Reo1.B[2,c+1]-Reo1.B[2,c-1])/2; Px:=c; Py:=Reo1.B[2,c]; end; end; t:=Round(Px-Py/Max); Image1.Canvas.MoveTo(II(t),JJ(Reo1.B[2,t]+h2,0,h1)+20); Image1.Canvas.LineTo(II(t),JJ(Reo1.B[2,t]+h2,0,h1)-6); end else Break;end;////процедура при нажатии на кнопку Разместитьprocedure TForm1.Action3Execute(Sender: TObject);begin MaxR; MaxM; GelZ;end;////функция получения высотры страницы в пикселяхfunction HeightY: Integer;begin Result:=GetDeviceCaps(Printer.Canvas.Handle, VertRes)end;////функция получения ширины страницы в пикселяхfunction WidthX: Integer;begin Result:=GetDeviceCaps(Printer.Canvas.Handle, HorzRes)end;////функция преобразования координат с бумаги по оси Хfunction PrinterCoordX(x:integer):integer;begin Result:=round(GetDeviceCaps(printer.Handle,LogPixelsX)/25.4*x);end;////функция преобразования координат с бумаги по оси Yfunction PrinterCoordY(Y:integer):integer;begin Result:=round(GetDeviceCaps(printer.Handle,LogPixelsY)/25.4*Y);end;////печать графиковprocedure TForm1.PrintGrafik;var j:integer;begin I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2);Printer.Canvas.MoveTo(II(1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[1,1],0,h1)); for j:=1 to 1000 do beginPrinter.Canvas.LineTo(II(j+1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[1,j+1],0,h1)); end;Printer.Canvas.MoveTo(II(1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,1]+h2,0,h1)+5); for j:=1 to 1000 do beginPrinter.Canvas.LineTo(II(j+1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,j+1]+h2,0,h1)+5); end;Printer.Canvas.MoveTo(II(1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[3,1]+h3,0,h1)+5); for j:=1 to 1000 do beginPrinter.Canvas.LineTo(II(j+1),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[3,j+1]+h3,0,h1)+5); end;end;////печать R-зубцовprocedure TForm1.PrintR;var j,Rx,Ry,p,p1,p2,k:integer;begin Printer.Canvas.Brush.Style:=bsClear; I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2); for j:=1 to 1000 do if Reo1.B[1,j]<PorogR then begin if PorogR<Reo1.B[1,j+1] then begin p1:=j+1; for k:=p1 to 1000 do if Reo1.B[1,k]>PorogR then if Reo1.B[1,k+1]<PorogR then begin p2:=k; Rx:=p1; Ry:=Reo1.B[1,p1]; for p:=p1 to p2 do if Reo1.B[1,p]>Ry then begin Ry:=Reo1.B[1,p]; Rx:=p; end; Printer.Canvas.MoveTo(II(Rx),PrinterCoordY(10+9*Font.Size)+JJ(Ry,0,h1)-20); Printer.Canvas.LineTo(II(Rx),PrinterCoordY(10+9*Font.Size)+JJ(Ry,0,h1)+30); end; end; end;end;////печать точек выброса крови из левого желудочкаprocedure TForm1.PrintZ;var b,c,Px,Py,t:integer; Max:real;begin Printer.Canvas.Brush.Style:=bsClear; I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2); Px:=1; Py:=1; for b:=1 to 80 do if ARR[b]<ARR[b+1] then begin Max:=1; for c:=ARR[b] to ARR[b+1] do begin if (Reo1.B[2,c+1]-Reo1.B[2,c-1])/2>Max then begin Max:=(Reo1.B[2,c+1]-Reo1.B[2,c-1])/2; Px:=c; Py:=Reo1.B[2,c]; end; end; t:=Round(Px-Py/Max);Printer.Canvas.MoveTo(II(t),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,t]+h2,0,h1)-40);Printer.Canvas.LineTo(II(t),PrinterCoordY(10+9*Font.Size)+JJ(Reo1.B[2,t]+h2,0,h1)+40); end else Break;end;////печать максимумов дифференцированной реограммыprocedure TForm1.PrintM;var a,i,Mx,My,r,r1,r2,m:integer;begin Printer.Canvas.Brush.Style:=bsClear; I1:=0; I2:=Round(WidthX); J1:=0; J2:=Round(HeightY/2); ARR[1]:=1; a:=2; for i:=1 to 1000 do if Reo1.B[2,i]<PorogM then begin if PorogM<=Reo1.B[2,i+1] then begin r1:=i+1; for m:=r1 to 1000 do if Reo1.B[2,m]>=PorogM then if Reo1.B[2,m+1]<PorogM then begin r2:=m; Mx:=r1; My:=Reo1.B[2,r1]; for r:=r1 to r2 do if Reo1.B[2,r]>My then begin My:=Reo1.B[2,r]; Mx:=r; end; ARR[a]:=Mx; a:=a+1;Printer.Canvas.MoveTo(II(Mx),PrinterCoordY(10+9*Font.Size)+JJ(My+h2,0,h1)-20);Printer.Canvas.LineTo(II(Mx),PrinterCoordY(10+9*Font.Size)+JJ(My+h2,0,h1)+30); Break; end; end; end;end;////процедура при нажатии на кнопку Печатьprocedure TForm1.Action4Execute(Sender: TObject);begin Printer.BeginDoc; Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10),Label1.Caption+' '+Edit1.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(Font.Size/2)),Label2.Caption+' '+Edit2.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(2*Font.Size/2)),Label3.Caption+' '+Edit3.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(3*Font.Size/2)),Label4.Caption+' '+Edit4.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(4*Font.Size/2)),Label5.Caption+' '+Edit5.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(5*Font.Size/2)),Label6.Caption+' '+Edit6.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(6*Font.Size/2)),Label7.Caption+' '+Edit7.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(7*Font.Size/2)),Label8.Caption+' '+Edit8.Text); Printer.Canvas.TextOut(PrinterCoordX(10), PrinterCoordY(10+Round(8*Font.Size/2)),Label9.Caption+' '+Edit9.Text); PrintGrafik; PrintR; PrintM; PrintZ; Printer.EndDoc;end;end.
Размещено на Allbest.ru
Подобные документы
Обработка прерываний - сигналов о совершении некоторых событий в компьютере. Механизм обработки прерываний. Обработка исключений, описание реакции программы на ошибки выполнения. Общее понятие и виды исключительных ситуаций во время выполнения программы.
реферат [192,2 K], добавлен 10.11.2014Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Описание входной и выходной информации, структура базы данных. Разработка программа автоматизации обработки сведений в отделе Государственной статистики Аскинского района по животноводству в среде Delphi 7. Расчет затрат на создание программного продукта.
курсовая работа [1,2 M], добавлен 10.07.2012Разработка программного обеспечения для работы с информацией и ее обработкой на языке программирования Delphi. Описание алгоритмов процедуры работы со стеком - добавление, удаление элементов, редактирование записи. Инструкция по использованию программы.
курсовая работа [2,9 M], добавлен 06.02.2013Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.
отчет по практике [961,6 K], добавлен 21.04.2012Обзор существующего программного обеспечения для автоматизации выделения границ на изображении. Разработка математической модели обработки изображений и выделения контуров в оттенках серого и программного обеспечения для алгоритмов обработки изображений.
дипломная работа [1,7 M], добавлен 27.03.2013Возможности среды программирования delphi при разработке приложения с визуальным интерфейсом. Отладка программных модулей с использованием специализированных программных средств. Тестирование программного обеспечения. Оптимизация программного кода.
курсовая работа [974,0 K], добавлен 21.12.2016Словесное описание алгоритма программы. Открытие файла процедурой Rewrite, его проверка на наличие ошибок при открытии. Особенности построения диаграммы. Листинг программы, ее тестирование и отладка. Выполнение процедуры CloseFile при закрытии файла.
контрольная работа [17,3 K], добавлен 11.06.2010Создание программного обеспечения, организующего базу данных тренажёрного зала. Описание предметной области; предикаты языка Пролог для работы с БД: ввод/вывод, управление окнами. Разработка структуры базы данных, интерфейс; содержание файла "Zal.ddb".
курсовая работа [821,6 K], добавлен 07.06.2013Виртуальные функции, статические и абстрактные классы, шаблоны: элементы и члены класса, их роль в объектно-ориентированном программировании; механизм осуществления виртуального вызова при выполнении программы; обработка исключительных ситуаций в C++.
реферат [27,2 K], добавлен 06.12.2010