Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритм+жне+бадарламалау+негіздері.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

Зертханалық жұмыс №6 "Оқиғалар"

Кластың сипатталынуы "Кәдімгі бөлшек" (TDrob).

Қасиеттері – аты, мәні, бөлінді және бөлгіш.

Әдістер:

процедуралар: бөлшекті орынымен ауыстыру (Swap), басқа бөлшектің мәнін қосу (Add);

функциялар: ақпарат (Info);

конструктор (Create).

Оқиғалар:

– бөлшек өзгерді (OnChange), стандарттық;

– бөлгіш нөлге тең (OnZero), параметрлері – ескі мән.

2.3 листингі «TDrobs» класының жариялануынан тұратын DROBS модульі

unit Drobs; 

Interface

uses SysUtils,Classes; 

type

TMyEvent=procedure(Sender:TObject;OldP,OldQ:longint) of Object;

TDrob=class

private

fName:string;

fp,fq:longint;

fOnChange:TNotifyEvent;

fOnZero:TMyEvent;

procedure SetP(NewP:longint);

procedure SetQ(NewQ:longint);

public

constructor Create(aName:string);

procedure Swap;

procedure Add(a:TDrob);

function Info:string;

function GetValue:real;

procedure SetValue(NewValue:real);

procedure SetPQ(NewP,NewQ:longint);

property Name:string read fName write fName;

property Value:real read GetValue write SetValue;

property p:longint read fp write SetP;

property q:longint read fq write SetQ;

property OnChange:TNotifyEvent read fOnChange write fOnChange;

property OnZero:TMyEvent read fOnZero write fOnZero;

end

Implementation

procedure TDrob.SetPQ(NewP, NewQ: longint);

var pp,qq : longint;

begin

if (NewP<>p) or (NewQ<>q) then

begin

pp:=p; qq:=q;

if NewQ<>0

then

begin fp:=NewP; fq:=NewQ; Normalization; end

else

begin fp:=NewP; fq:=1;

if assigned(fOnZero) then OnZero(Self,pp,qq)

end;

if assigned(fOnChange) then OnChange(Self);

end;

end;

constructor TDrob.Create;

begin

inherited Create;

Name:=aName;

SetPQ(1,1);

end;

 

function TDrob.Info: string;

begin

Result:='Дробь '+Name+'= '+IntToStr(p)+'/'+IntToStr(q)+'='+

FloatToStrF(Value,ffFixed,9,5);

end;

 

procedure TDrob.Swap;

begin

SetPQ(q,p);

end;

 

procedure TDrob.Add(a: TDrob);

begin

SetPQ(p*a.q+q*a.p,q*a.q);

end;

 

procedure TDrob.SetP(NewP:longint);

begin

SetPQ(NewP,q);

end;

 

procedure TDrob.SetQ(NewQ: longint);

begin

SetPQ(p,NewQ);

end;

 

function TDrob.GetValue: real;

begin

Result:=p/q;

end;

 

procedure TDrob.SetValue(NewValue: real);

begin

SetPQ(round(NewValue*10000),10000);

end;

end.

Delphi – дегі демонстрациялық бағдарлама

 – Drobs модульі қосылады:

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Drobs

– екі бөлшекке тағайындалған айнымалылар сипатталынады:

var

Form1 : TForm1;

a,b : TDrob; 

– пішінге келесі объектілер орналастырылады:

GroupBox1, GroupBox2

бірінші және екінші бөлшектердің демонстрациясы үшін;

Label1, Edit1

бірінші бөлшектің бөліндісі

Label2, Edit2

бірінші бөлшектің бөлгіші

Label3, Edit3

бірінші бөлшектің мәні

Label4, Edit4

екінші бөлшектің бөліндісі

Label5, Edit5

екінші бөлшектің бөлгіші

Label6, Edit6

екінші бөлшектің мәні

Button1

"Орын ауыстыру"

Button2

"+"

Button3

"INFO" бірінші бөлшек үшін

Button4

"INFO" екінші бөлшек үшін

– үш процедура қосылады – бөлшектерді өңдеу үшін:

  • бірінші бөлшектің өзгеруі:

procedure TForm1.AChange(Sender: TObject);

begin

GroupBox1.Caption:=a.Name;

Edit1.Text:=IntToStr(a.p);

Edit2.Text:=IntToStr(a.q);

Edit3.Text:=FloatToStrF(a.Value,ffFixed,9,5);

end

  • екінші бөлшектің өзгеруі:

procedure TForm1.BChange(Sender: TObject);

begin

GroupBox2.Caption:=b.Name;

Edit4.Text:=IntToStr(b.p);

Edit5.Text:=IntToStr(b.q);

Edit6.Text:=FloatToStrF(b.Value,ffFixed,9,5);

end

  • екі бөлшек үшін бөлгіштің нольге айналуы:

procedure TForm1.ZeroEvent(Sender: TObject; OldP,OldQ:longint);

begin

with sender as TDrob do

if MessageDlg('Дробь '+Name+ ' получила нулевой знаменатель,'+ ' который бы заменен единицей. Восстановить прежнее значение?', mtWarning,[mbYes,mbNo],0) = mrYes then SetPQ(OldP,OldQ);

end

– бөлшектерді басқаруға арналған көрнекілік құрауыштардың өңдеу - процедуралары қосылып жазылады:

  • Form1.OnCreate оқиғасының өңделуі (пішінді құру):

a:=TDrob.Create('a');

a.OnChange:=AChange; a.OnChange(a);

a.OnZero:=ZeroEvent;

b:=TDrob.Create('b');

b.OnChange:=BChange; b.OnChange(b);

b.OnZero:=ZeroEvent; 

  • бөлінді мен бөлгіштің терезелерінде символдық батырмалардың басылуы Edit1, Edit2, Edit4, Edit5 құрауыштары үшін OnKeyPress оқиғасы:

var st:string;

begin

with Sender as TEdit do

begin

st:=text;

if Key='-'

then begin

if st[1]='-' then Delete(st,1,1)

else st:='-'+st;

Text:=st;

end;

if not (Key in ['0'..'9',#8]) then Key:=#0;

if Key=#8 then if Length(st)<2 then Key:=#0;

end;

end

  • бөлінді мен бөлгіштің өзгеруі

Edit1.OnChange: a.p:=StrToInt(Edit1.Text); Edit2.OnChange: a.q:=StrToInt(Edit2.Text); Edit4.OnChange: b.p:=StrToInt(Edit4.Text); Edit5.OnChange: b.q:=StrToInt(Edit5.Text);

  • бөлшектің мәнінің өзгеруі (<ENTER> батырмасын басқанда)

Edit3.OnKeyPress: if Key=#13 then a.Value:=StrToFloat(edit3.Text); Edit6.OnKeyPress: if Key=#13 then b.Value:=StrToFloat(edit6.Text);

  • "Обмен" батырмасының басылуы

Button1.OnClick: a.Swap;

  • "+" батырмасын басу

Button2.OnClick: a.Add(b);

  • бірінші бөлшектің "INFO" батырмасының үстінен тышқанды жылжыту

Button3.OnMouseMove: Button3.Hint:=a.info;

  • екінші бөлшектің "INFO" батырмасының үстінен тышқанды жылжыту

Button4.OnMouseMove: Button4.Hint:=b.info;