Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Описание класса Обыкновенная дробь (TDrob).

Читайте также:
  1. II. ОПИСАНИЕ УСТАНОВКИ И МЕТОДА ИЗМЕРЕНИЯ
  2. II. Теория метода и описание установки
  3. Автокорреляционная функция ЛЧМ-сигнала. Сечения функции неопределенности ЛЧМ-сигнала. Выбор класса зондирующих сигналов для РЛС.
  4. Библиографическое описание архивных материалов
  5. Библиографическое описание документа
  6. БИБЛИОГРАФИЧЕСКОЕ ОПИСАНИЕ КНИГ
  7. В Пиратском Манчкине нам становятся доступны 3 класса: Пират, Флотский и Торговец. У каждого свои плюшки и каждый по своему хорош!

Лабораторная работа №2 "События ".

Свойства – имя, значение, числитель и знаменатель.

Методы – процедуры: обратить дробь (Swap), добавить значение другой дроби (Add);
– функции: информация (Info);
– конструктор (Create).

События – дробь изменилась (OnChange), стандартное;
– знаменатель стал равен нулю (OnZero), параметры - старое значение.

 

Модуль:

 

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;

 

– прописываются процедуры–обработчики визуальных компонент для управления дробями:

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;

 

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;

 

a.Swap;

 

a.Add(b);

 

Button3.Hint:=a.info;

 

Button4.Hint:=b.info;

 

Задание для самостоятельной работы:

– добавить к данному классу (TDrob).

Свойства – Simple, простота (числитель меньше знаменателя), для чтения;

– Changable, разрешение на изменение, для чтения и записи.

Методы – процедуры: операции "–" (Sub), "*" (Mult), "/" (Div) с другой дробью;
– процедура Assign(d:TDrob), копирующая информационные поля другой дроби;
– функция Compare(d:TDrob), сравнивающая текущую дробь с другой (результат 0, +1, –1 для случаев Self=d, Self>d, Self<d, соответственно).

Событие – OnChanging (дробь будет изменена), в интерфейсе процедуры-обработчика которого (по аналогии с var Accept: Boolean для события OnDragOver) находилась булевская переменная, которая определяла бы корректность нового значения: (по умолчанию TRUE, в случау FALSE восстанавливается предыдущее значение). Используя данную возможность запретить одной дроби принимать значения большие 100 по модулю, а другой – четный знаменатель.

Слайд 1


Дата добавления: 2015-11-26; просмотров: 118 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.013 сек.)