Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Галерея красивого кода   Найти похожие ветки 

 
Igorek ©   (2004-05-18 17:34) [0]

Кидайте кто что красивого видел.

Вот я сегодня такое написал (мне понравилось):
     if not Left then
       if not Top then
         if not Right then
           if not Bottom then
             if not Back then
               if not Straight then
     Error("Помилка при визначенні напрямку руху");


 
Игорь Шевченко ©   (2004-05-18 17:38) [1]


>    if not Left then
>        if not Top then
>          if not Right then
>            if not Bottom then
>              if not Back then
>                if not Straight then


if not (Left or Top or Right or Bottom or Back or Straight) then

?


 
ZrenBy   (2004-05-18 17:42) [2]

Проскальзывало тут когда-то

n[i]=(Z-=(n[i++]=(Z-=(n[i++]=(Z-=(n[i++]=(Z-=(n[i++]=(Z-=(n[i++]=Z/I)*I)/J)*J)/K)*K)/L)*L)/O)*O)


 
Просто Вася   (2004-05-18 17:45) [3]

Красиво и серьезно,но не работает, правда это не delphi
create proc sp_free_file_space @file_name varchar(255)=null,
@file_spec varchar(255)=null,@freespace_limit int =1024
as
--*
--Процедура для оценки свободного пространства в заданном файле (Кбайт)
--*

declare @fs int,@file int
declare @freespace int,@size int
declare @hr int
declare @src varchar(255),@desc varchar(255)
declare @char_freespace varchar(20),@char_freespace_limit varchar(20)

select @fs=null,
@file=null

exec @hr=sp_OACreate "Scripting.FileSystemObject",@fs out

if @hr<>0
begin
exec sp_OAGetErrorInfo @fs,@src out,@desc out
select hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
goto destroy_objects
end

exec @hr=sp_OAmethod @fs,"GetFile",@file out,@file_spec

if @hr<>0
begin
exec sp_OAGetErrorInfo @fs,@src out,@desc out
select hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
goto destroy_objects
end

exec @hr=sp_OAGetProperty @file,"Size",@size out

if @hr<>0
begin
exec sp_OAGetErrorInfo @fs,@src out,@desc out
select hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
goto destroy_objects
end

set  @freespace=@size/1024-(select fileproperty(@file_name,"SpaceUsed")*8)
set @char_freespace=cast(@freespace as varchar(20))
set @char_freespace_limit=cast(@freespace_limit as varchar(20))

if (@freespace<@freespace_limit)
raiserror(60002,10,1,@file_spec,@char_freespace,@char_freespace_limit)
with log
destroy_objects:
if @file is not null
begin
exec @hr=sp_OAGetErrorInfo @file,@src out,@desc out
select hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
end

if @fs is not null
begin
exec @hr=sp_OADestroy @fs

if @hr<>0
begin
exec sp_OAGetErrorInfo @fs,@src out,@desc out
select hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
end
end
return(0)
go


 
Ega23 ©   (2004-05-18 17:49) [4]

Игорь Шевченко ©   (18.05.04 17:38) [1]
Может AND, а не OR?


 
Соловьев ©   (2004-05-18 17:54) [5]


> 4] Ega23 ©   (18.05.04 17:49)

not or = and


 
Ega23 ©   (2004-05-18 17:56) [6]

Соловьев ©   (18.05.04 17:54) [5]
Точно... not я впереди как-то не заметил... сорри за "наезд"


 
Aldor ©   (2004-05-18 21:34) [7]

Из красивого: функция возвращает количество бит в двоичной записи числа


int BitCount(int num)
{
 for (int count = 0; num; count++)
   num &= num - 1  
}


 
nikkie ©   (2004-05-18 21:46) [8]

>Aldor
а может, проще сразу num = 0? и точку с запятой поставить. и return какой-нибудь.


 
Игорь Шевченко ©   (2004-05-18 21:52) [9]

Ega23 ©   (18.05.04 17:49)

Вообще-то теорема Де Моргана...


 
nikkie ©   (2004-05-18 22:07) [10]

>[7] Aldor
сообразил... нужен
return count;
да, красиво. но медленно... :))
а можно быстро, но очень некрасиво :))


 
Aldor ©   (2004-05-18 22:28) [11]

Aldor ©   (18.05.04 21:34) [7]
В описании ошибка:
Из красивого: функция возвращает количество единиц в двоичной записи числа

nikkie ©
да, return count забыл.

Если честно, до сих пор руки не доходят разобрать почему результом является количество бит - это ж надо до такого додуматься.

> а можно быстро, но очень некрасиво :))

 ??! В этой реализации количество операций равно числу единиц в битовом предствлении - куда уж быстрее?


 
Gero ©   (2004-05-18 22:33) [12]


> да, красиво. но медленно... :))

Красота требует жертв :)


 
nikkie ©   (2004-05-18 22:41) [13]

??! В этой реализации количество операций равно числу единиц в битовом предствлении - куда уж быстрее?
гы... :)
добро пожаловать в ветку "Как можно в байте биты поменять местами?"
http://delphimaster.net/view/1-1084882106/


 
nikkie ©   (2004-05-18 22:53) [14]

Если честно, до сих пор руки не доходят разобрать почему результом является количество бит
на самом деле просто все... если у num последний двоичный разряд 1, то
num &= num - 1;
его обнуляет. если num в двоичном виде выглядит как ...10000, то num - 1 будет ...01111. и опять
num &= num - 1;
обнуляет последний значащий бит.


 
Sergey Masloff   (2004-05-18 22:57) [15]

nikkie ©   (18.05.04 22:41) [13]
>добро пожаловать в ветку "Как можно в байте биты поменять >местами?"
Добро пожаловать в книгу Hacker"s Delight by Henry Warren. И байты местами менять и количество единичных и еще пара тысяч подобных алгоритмов. Слово хакер тут в первоначальном смысле а не из области малолетних придурков которых сейчас так почему-то называть стали. Я слышал ее сейчас на русский перевели


 
Aldor ©   (2004-05-19 06:08) [16]

nikkie ©   (18.05.04 22:41) [13]
> http://delphimaster.net/view/1-1084882106/ [14] ?
   :)))))))


 
Dmitriy O. ©   (2004-05-19 09:11) [17]

А вот мой красивый код.

procedure TMyform.AzakExecute(Sender: TObject);
begin

tstrelka.First;
tstrelkan.Value;
while not tstrelka.Eof do begin // найдем пересечения
if (tstrelkay1.Value>=list1.Top-idiag1.Top)and (tstrelkay5.Value<=list1.Top-idiag1.Top)
and (tstrelkavid.Value=7)  // ест пер на кор стр
then begin
idiag1.Canvas.TextOut(tstrelkax4.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2) ,list1.Top-idiag1.Top-8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
idiag1.Canvas.TextOut(tstrelkax4.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2), list1.Top-idiag1.Top+8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
end;
if (tstrelkay1.Value<=list1.Top-idiag1.Top)and (tstrelkay3.Value>=list1.Top-idiag1.Top)
and ((tstrelkavid.Value=4) or (tstrelkavid.Value=5) or(tstrelkavid.Value=6)or(tstrelkavid.Value=11)or(tstrelkavid.Value=9)or(tstrelkavid.Value=8)) // ест пер на кор стр
then begin
idiag1.Canvas.TextOut(tstrelkax2.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2), list1.Top-idiag1.Top-8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
idiag1.Canvas.TextOut(tstrelkax2.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2), list1.Top-idiag1.Top+8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
end;

if (tstrelkay1.Value>=list2.Top-idiag1.Top)and (tstrelkay5.Value<=list2.Top-idiag1.Top)
and (tstrelkavid.Value=7)  // ест пер на кор стр
then begin
idiag1.Canvas.TextOut(tstrelkax4.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2) ,list2.Top-idiag1.Top-8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
idiag1.Canvas.TextOut(tstrelkax4.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2), list2.Top-idiag1.Top+8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
end;
if (tstrelkay1.Value<=list2.Top-idiag1.Top)and (tstrelkay3.Value>=list2.Top-idiag1.Top)
and ((tstrelkavid.Value=4) or (tstrelkavid.Value=5) or(tstrelkavid.Value=6)or(tstrelkavid.Value=11)or(tstrelkavid.Value=9)or(tstrelkavid.Value=8)) // ест пер на кор стр
then begin
idiag1.Canvas.TextOut(tstrelkax2.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2), list2.Top-idiag1.Top-8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
idiag1.Canvas.TextOut(tstrelkax2.Value-trunc(idiag1.Canvas.TextWidth(tstrelkaobiect.Value+inttostr(tstrelkan.Value))/2), list2.Top-idiag1.Top+8,tstrelkaobiect.Value+inttostr(tstrelkan.Value));
end;

tstrelka.Next;
end;// while

end;


 
Gero ©   (2004-05-19 09:22) [18]


> Dmitriy O. ©   (19.05.04 09:11)

Круто. Но мне кажется, что так он будет еще красивее выглядеть:


PRoCEdURE TMYfORm.aZakeXECUTe(SEnDer: tOBJeCt);beGin tSTrElka.fIRst; TstrelKAn.vALue;
WhILE noT TStrElKa.Eof DO BeGiN if (tstRelKaY1.VAlUE>=liSt1.toP-iDIAG1.ToP)aND (TstrELKAy5.vaLuE<=lIsT1.TOP-IDiAg1.TOp)
and (tsTRelkaViD.vAlUE=7)  thEN bEGIN
IdiaG1.CANvAs.TExTOUT(tSTreLKax4.value-trUNC(iDiaG1.CaNVas.texTwIdTh(tstRElKAObiEct.VaLue+INTtoSTr(tstRElkAN.vALUe))/2) ,lisT1.TOP-IdiAG1.tOP-8,TstRELKaObieCt.VALue+iNTtOstr(tStRELkaN.VALue)); IDIag1.CanvAs.tExtOUt(tsTrELKAx4.vaLUE-tRUNc(iDIAg1.CAnvas.tEXtWiDtH(TsTrelKaObIECT.VALUe+iNtTOsTr(tStrElKaN.VaLue))/2),  LIst1.toP-idIag1.TOp+8,tsTrELKaoBIECt.vaLue+InTtostr(tstRElKan.valUE)); enD;
iF (tSTReLKAY1.VALUE<=LiST1.tOP-iDiAG1.toP)AND (TStRElkaY3.vAlue>=lisT1.tOP-idIAG1.TOP)
AnD ((TsTreLKaVid.vaLue=4) OR (TsTRELkAVId.ValuE=5) OR(TSTRelKAvId.vAlUe=6)oR(tsTRELkaVid.vaLue=11)Or(tSTrELKaViD.Value=9)Or(tStRelKAvId.VAlUE=8)) tHen BEGIn
IdiAG1.caNvAs.TExTouT(tstRElkaX2.vALue-TrUNc(iDIaG1.CaNvAS.TExTwidTh(tStRElkAOBiect.VAlUe+inttOSTR(tSTReLkan.valUE))/2),  lISt1.tOp-IDiAG1.toP-8,tSTRELKaObIECT.vaLUe+inTtoStR(TSTreLKan.vaLuE)); IdIag1.CanvAs.TeXToUT(TSTRElKAx2.VALUe-trUNc(IdiAg1.CANVAS.texTWiDTH(tSTreLKaObIeCT.ValUE+InTToStR(tSTRELKaN.valuE))/2),  LIsT1.top-IdIAg1.toP+8,tStRelkAobIECt.VALuE+INtTOsTr(TSTReLKan.Value)); enD;If (tStRelKAY1.vAlUE>=lisT2.top-IdIAg1.TOp)anD (TstRelkay5.VAlUe<=lISt2.top-IDiaG1.toP)AND (tSTReLkAvId.valUE=7)  TheN bEGiN
IdIAg1.CanvaS.TextOUT(TstRElkaX4.VaLUe-TRUnc(IDiag1.cAnVAs.tExTwIDth(TStRElkaoBIECt.vAlUE+iNTtostR(tStRELKaN.VAluE))/2) ,lIsT2.Top-iDIAG1.TOp-8,tStReLkAobIeCt.vAlUE+intTOStR(tstRElKan.VALuE)); IdiaG1.CaNVas.TEXtout(tsTreLKaX4.VAlUE-TRuNc(IdiaG1.CANVaS.TEXTWIDtH(TsTRElkAoBiect.ValUE+InTtoStr(tsTRelKan.VaLuE))/2),  LIst2.Top-iDiaG1.Top+8,TStrelKaobieCT.VAlUe+InTtostR(tstRElkaN.ValUE));
End; iF (tStrelKay1.vALUe<=lisT2.toP-iDiag1.top)And (tsTrELKaY3.vALUE>=LIsT2.top-IdiaG1.TOp) AND ((TsTRELkAVID.vaLUe=4) or (tSTrELkaVID.VALUe=5) or(TsTRELKaVID.VaLue=6)oR(TstRELKaVid.vaLUe=11)OR(tstRelkAVid.valUe=9)oR(TsTrelkAViD.VALue=8)) BEGIN
IDiAG1.CaNvAs.tExTOut(tstrelkaX2.vALUE-TrUNC(IDIaG1.CANvaS.TEXtwIdTH(TstreLKaObIeCT.valuE+INttOSTr(tStReLkAn.VAluE))/2),  LIsT2.toP-idiaG1.TOP-8,tSTRelKaoBIECt.Value+InTTosTr(tSTRelkan.VaLue)); iDIAg1.CaNvAs.textoUT(tsTRELKAx2.vaLue-TRUnc(idIaG1.cANVAs.textwidTh(TSTRElKAObiEct.VaLuE+inTTostR(TstRElKan.vaLuE))/2),  liST2.TOp-IDiag1.TOp+8,TsTrElKaObIEcT.VaLuE+inttosTr(tStreLKAn.ValuE));ENd;TstReLKA.neXT;eND;enD;


Прекрасно, не правда ли?


 
Nikolay M. ©   (2004-05-19 09:28) [19]


> Dmitriy O. ©   (19.05.04 09:11) [17]

Прекрати глумиться :)))))
Может, ты скоро будешь писать посты в духе "а фот ищо десйать строк майего супер-красиффово кода"? Хотя, конечно, извращения над бедным Паскалем не так режут глаза, как выворачивание наизнанку многострадального русского. Но если бы это видел бедный Никлаус Вирт...
:)


 
panov ©   (2004-05-19 09:55) [20]

Удалено модератором


 
panov ©   (2004-05-19 09:56) [21]

Удалено модератором
Примечание: Не публикуй без спроса (Adder)


 
Jeer ©   (2004-05-19 10:16) [22]

panov ©   (19.05.04 09:56) [21]
Ага, это из разряда "Написать-то я написал и даже работает, но как ?":)))


 
Игорь Шевченко ©   (2004-05-19 10:19) [23]

/*
* Program to compute an approximation of pi
* by Brian Westley, 1988
* (requires pcc macro concatenation; try gcc -traditional-cpp)
*/

#define _ -F<00||--F-OO--;
int F=00,OO=00;
main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
           _-_-_-_
      _-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_
           _-_-_-_
}


 
wicked ©   (2004-05-19 12:16) [24]


> Игорь Шевченко ©   (19.05.04 10:19) [23]

гых.... додуматься же до такого... :)


> panov ©   (19.05.04 09:56) [21]

хммм... код красив...
но вместо
>  *Text++=CONVERT[*Buffer >> 4];
желательно бы писать
>  *Text++=CONVERT[(*Buffer >> 4) & 0x0f];

иначе на настройках компилятора по умолчанию и *Buffer > 0x80 мы получим прекрасный вылет за границы массива CONVERT...


 
panov ©   (2004-05-19 12:22) [25]

>wicked ©   (19.05.04 12:16) [24]
*Buffer >> 4 не может быть больше 0x0F в любом случае, что не превышает размерности массива.


 
Романов Р.В. ©   (2004-05-19 12:36) [26]

Такое впечатление что на паскале нельзя написать красивый код


 
wicked ©   (2004-05-19 12:42) [27]

> panov ©   (19.05.04 12:22) [25]

может, поскольку по умолчанию в си тип char является signed... поэтому если *Buffer > 0x80 (или *Buffer < 0, что более правильно в данном случае), то всякий порядочный компилятор поставит там команду sar, а не shl - а арифметический сдвиг копирует значения старшего бита... например (signed)0xa0 >> 1 будет равно (signed)0xd0, а (unsigned)0xa0 >> 1 будет равно (unsigned)0x50...
код красивый, и 100% рабочий при условии, что компилятору сказано, что тип char является unsigned - у борландовских компиляторов есть такая опция....

вот такие мои соображения...


 
Игорь Шевченко ©   (2004-05-19 12:51) [28]

Романов Р.В. ©   (19.05.04 12:36)

Можно. Например, операция in выглядит красиво по сравнению с ее имитацией на других языках.

if C in ["A..N","P..Z"]


 
panov ©   (2004-05-19 13:14) [29]

>wicked ©   (19.05.04 12:42) [27]
Спасибо за замечание... КОд-то как раз нужно использовать в промышленной программе, поэтому надо исправить-)


 
pasha_golub ©   (2004-05-19 14:02) [30]

Игорь Шевченко ©   (19.05.04 10:19) [23]
Елы-палы, да объясните мне что это за код.  :-)
ЗЫ Слышал, что алгоритмом Монте-Карло зовется. Так ли это?


 
[lamer]Barmaglot ©   (2004-05-19 14:06) [31]

И мои 3 копейки, мне понравился вот этот мой код...


function GetFullFileName(FileName: string): string;
var
  ppshf : IShellFolder;
  lpItemID : PItemIDList;
  NumChars : Cardinal;
  Flags : Cardinal;
  s : array[0..MAX_PATH] of Char;
  P : PWideChar;
begin
  NumChars:=Length(FileName);
  Flags:=SFGAO_FILESYSTEM;
  SHGetDesktopFolder(ppshf);
  P:=StringToOleStr(FileName);
  ppshf.ParseDisplayName(Application.Handle,nil,P,NumChars,lpItemID,Flags);
  ShGetPathFromIDList(lpItemID, s);
  SetString(Result,s,StrLen(s));
  GlobalFreePtr(lpItemID);
end;


 
Rule   (2004-05-19 14:15) [32]

//panov ©   (19.05.04 09:55) [20]
//
//Удалено модератором

во прикол, модераторы сами себя рубят :)


 
Alx2 ©   (2004-05-19 18:27) [33]

>Примечание: Не публикуй без спроса (Adder)
Было бы чего...


 
YurikGl ©   (2004-05-19 19:26) [34]

if FTimeD.wDay<10 then st2:=#9+"0"+IntToStr(FTimeD.wDay)+"."
                         else st2:=#9+IntToStr(FTimeD.wDay)+".";
       if FTimeD.wMonth<10 then st2:=St2+"0"+IntToStr(FTimeD.wMonth)+"."
                         else st2:=St2+IntToStr(FTimeD.wMonth)+".";
       if FTimeD.wYear<10 then st2:=St2+"0"+IntToStr(FTimeD.wYear)+" "
                         else st2:=St2+IntToStr(FTimeD.wYear)+" ";
       if FTimeD.wHour<10 then st2:=St2+"0"+IntToStr(FTimeD.wHour)+":"
                         else st2:=St2+IntToStr(FTimeD.wHour)+":";
       if FTimeD.wMinute<10 then st2:=St2+"0"+IntToStr(FTimeD.wMinute)+#9
                         else st2:=St2+IntToStr(FTimeD.wMinute)+#9;


 
Igorek ©   (2004-05-19 19:37) [35]

Вот еще один мой кусок:
   AItem.Enabled :=
       (AIndex = cEditPageEditor) or
       (AIndex = cEditRouter) or
       (AIndex = cEditNewPage) or
       (AIndex = cEditDefault) or
       ((AIndex = cEditSelectAllPages) and (PageCount > 0)) or
       ((AIndex = cEditTest) and (GetParentForm(Wizard) <> nil)) or
       ((AIndex = cEditDeleteCurrent) and (CurrentPage <> nil)) or
       (AIndex = cEditFirst) or
       (AIndex = cEditLast) or
       (
           (AIndex = cEditPrevious) or (AIndex = cEditNext)) and
           (CurrentPage <> nil) and
           (PageCount > 1) and
           (
               ((AIndex = cEditPrevious) and (CurrentPageIndex <> 0)) or
               ((AIndex = cEditNext) and (CurrentPageIndex <> PageCount - 1)
           )
       );


 
Adder ©   (2004-05-19 19:39) [36]

>Alx2 ©   (19.05.04 18:27) [33] Вот именно - ничего, что стоило бы показывать.


 
wicked ©   (2004-05-19 19:46) [37]

хмм... а может кому то нравится, что любимая женщина делает, а?....
всё, молчу, молчу... :)


 
Mim1 ©   (2004-05-19 20:00) [38]

Всегда жутко хочется запихнуть в case строки, ан ниизя :(


 
Verg ©   (2004-05-19 20:05) [39]


> [37] wicked ©   (19.05.04 19:46)
> хмм... а может кому то нравится, что любимая женщина делает,
> а?....


Нет, конечно, большинство ненавидят, что любимая женщина делает.
Ну всякое бывает, и извращенцы всякие, которым нравится....

А вообще... ты сам-то понял что сказал?


 
wicked ©   (2004-05-19 20:12) [40]


> Verg ©   (19.05.04 20:05) [39]

каждый думает в меру своей распущенности...
я не считаю, что сказал что-то неприличное, а если так сочтет Adder, то пусть она и упрекнет...



Страницы: 1 2 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.045 c
1-1085642307
Valeri
2004-05-27 11:18
2004.06.06
TDBImage, TImage


6-1082358148
djordj
2004-04-19 11:02
2004.06.06
Как отправить email в HTML формате с картинками


3-1084792882
It
2004-05-17 15:21
2004.06.06
Редактирование наборов данных в БД


6-1082525592
Anvar Turakulov
2004-04-21 09:33
2004.06.06
Сокети


3-1084854673
AVP_opck
2004-05-18 08:31
2004.06.06
как сделать чтоб поле calculated один раз расчиталось запомнило