Кластың сипатталынуы "Қос мәнді теріс емес бүтін сан" (TN2).
Қасиет – аты, мәні, тақтық, бірінші сан, екінші сан.
Әдістер:
– процедуры: мәнді орнату (SetN2), сандарды ауыстыру (Swap);
– функциялар: басқа санға қарағанда кіші (LessThen), ақпарат (Info);
– конструктор (Create).
Листинг 2.2 «TN2» класын жүзеге асыратын бағдарламаның демонстрациясы
program Class_TN2;
{$APPTYPE CONSOLE} {Компилятор директивасы – бағдарламаның жұмыс істеу режимінің тапсырмасы.}
{MS-DOS режиміне тәріздес мәтіндік режимнің эмуляторы құрылады}
uses SysUtils;
type
TN2 = class
fName: String;
fVal: integer;
constructor Create(aName: String);
procedure Swap;
function Info: String;
function LessThen(aNum: TN2): Boolean;
procedure SetVal(Value:Integer);
function GetOdd:string;
function GetD1:byte;
procedure SetD1(Value:byte);
function GetD2:byte;
procedure SetD2(Value:byte);
property Name:string read fName;
property Odd:string read GetOdd;
property Val:integer read fVal write SetVal;
property D1:byte read GetD1 write SetD1;
property D2:byte read GetD2 write SetD2;
end;
constructor TN2.Create(aName: String);
begin
fName:=aName;
fVal:=1;
end;
procedure TN2.Swap;
begin
SetVal(D2*10+D1);
end;
function TN2.Info: String;
begin
Result:='Naturalnoe dvuznachnoe '+odd+
' chislo '+Name+'='+IntToStr(Val)+#10#13+' first number='
+IntToStr(D1)+' second number='+IntToStr(D2);
end;
procedure TN2.SetVal(Value: Integer);
begin
if (Value>=0) and (Value<=99) then fVal:=Value;
end;
function TN2.LessThen(aNum: TN2): boolean;
begin
Result:= Val
end;
function TN2.GetOdd: string;
begin
if (val mod 2=1) then Result:='nechetnoe'
else Result:='chetnoe';
end;
function TN2.GetD1: byte;
begin
Result:=Val div 10;
end;
procedure TN2.SetD1(Value: byte);
begin
if Value in [0..9] then SetVal(Value*10+D2)
end;
function TN2.GetD2: byte;
begin
Result:=Val mod 10;
end;
procedure TN2.SetD2(Value: byte);
begin
if Value in [0..9] then SetVal(D1*10+Value)
end;
var a,b : TN2;
begin
a:= TN2.Create(' a ');
b:= TN2.Create(' b '); { Бағдарламаның орындалуының нәтижесі
b.Val:= 23; {
Writeln(a.Info); {
Writeln(b.Info); {
b.swap; {
a.D1:= 5; {
a.D2:= 8; {
Writeln(a.Info); {
Writeln(b.Info); {
a.Free; {
b.Free; {
Readln; {
end.
Өз бетінше орындауға арналған тапсырма
Кластың сипатталынуы "Жазықтықтағы нүкте" (TDot).
Қасиеттер – аты, декарттық координаталар, полярлық координаталар,
жазықтықтың нөмірі (егер оське тиісті болса, онда 0-ге тең), оське тиісті ме?
Әдістер:
– процедуралар: басқа нүктеге дейінгі ара қашықтық (RoFrom), векторға көшу (dx,dy) (MoveRel); координаталар басына қарағанда симметриялық бейнелеу (SimmZero), x=y осіне қарағанда симметриялық бейнелеу (SimmXY);
– функциялар: ақпарат (Info);
– конструктор (Create).
Практикалық жұмыс №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);
бөлшектің мәнінің өзгеруі ( батырмасын басқанда)
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);
Button3.OnMouseMove: Button3.Hint:=a.info;
екінші бөлшектің "INFO" батырмасының үстінен тышқанды жылжыту
Button4.OnMouseMove: Button4.Hint:=b.info;
Өз бетінше орындауға тапсырма
– берілген (TDrob) класына қосу керек:
Қасиеттер:
– Simple, қарапайымдылық (числитель меньше знаменателя), оқуға;
– Changable, өзгертуге рұқсат етіледі, оқу мен жазуға арналған.
Әдістер:
– процедуралар: басқа бөлшекпен"–" (Sub), "*" (Mult), "/" (Div) амалдары; басқа бөлшектің ақпараттық өрістерінің көшірмесін жасайтын - Assign(d:TDrob) процедурасы;
– Compare(d:TDrob) функциясы, ағымды бөлшекті басқа бөлшекпен салыстырады (Self=d, Self>d, Self
Оқиға:
– OnChanging (бөлшек өзгереді), өңдеу – процедурасының интерфейсіде (аналогия бойынша с var Accept: Boolean OnDragOver оқиғасы үшін) буль айнымалысы орналасады, ол жаңа мәннің корректілігін анықтайды: (үнсіздік TRUE, FALSE жағдайында алдыңғы мән қайта қалпына келеді). Берілген мүмкіншілкті қолдана отырып бір бөлшекке модульі бойынша 100-ден аспайтын мән қабылдауға, ал екіншісіне жұп бөлгіш қабылдауға рұқсат етілмейді.
2>
Достарыңызбен бөлісу: |