forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   Полезные функции (http://forum.boolean.name/showthread.php?t=425)

pax 14.12.2005 22:41

Вот пара функций, как напишу еще обязательно сюда пришлю.

1. Функция заменяющая в строке Str символы Chr1 на симвлолы Chr2
Код:

Function Repl(Str:String;Chr1,Chr2:Char):String;
var i:integer;
Begin
        For i:=0 to Length(Str)-1 do
 *If GetChar(str,i)=Chr1 then Str:=SetChar(str,Chr2,i)
 *Repl:=Str;
End;

2. Функция возвращающая строку длинной Num из символов Chr
Код:

Function CreateCharStr(Chr:Char;Num:integer):String;
var i:integer;
 *s:string;
Begin
        S:='';
        For i:=1 to Num do
 *S:=S+Chr;
 *CreateCharStr:=S;
End;


pax 14.12.2005 22:42

Вот две функции возвращающие знак числа:

Код:

Function ISgn(Val:Integer):Integer;
Begin
        if val=0 then ISgn:=1 else
 ISgn:=Val/Abs(Val);
End;

Код:

Function RSgn(Val:Real):Real;
Begin
        if val=0 then RSgn:=1 else
 RSgn:=Val/RAbs(Val);
End;


pax 15.12.2005 21:06

Ну вроде написал функции преобразования типа Real в тип String и обратно :).
Правда работают немного не точно :( даж не знаю почему... если найдете ошибку, то исправьте пожалуйста.

1. Эта для того чтобы была :)
Код:

Function IntToReal(Val:Integer):Real;
Begin
        IntToReal:=Val;
End;

2. X в положительной целочисленной степени
Код:

Function XStepY(X:Real;Y:Integer):Real;
var i:integer;
 s:Real;
Begin
s:=1;
        If Y>0 then
 for i:=1 to Y do s:=s*x
        else
 If Y=0 then
        S:=1
 else
  for i:=-1 downto Y do S:=S/X;
       
        XStepY:=S;
End;

3. X в целочисленной степени
Код:

Function XStepY(X:Real;Y:Integer):Real;
var i,s:integer;
Begin
s:=1;
        If Y>0 then
 *for i:=1 to Y do s:=s*x
        else
 *If Y=0 then
 *        s:=1
 *else
 * * for i:=-1 downto Y do s:=s/x;;
       
        XStepY:=s;
End;

4. Вещественное число в строку
Код:

Function RealToString(Val:Real):String;
Var I,N:Integer;
        A,B:real;
        S,Sgn:string;
Begin
        S:='';

        If Val>0 then
 Sgn:=''
 else
 Begin
        Sgn:='-';
        Val:=-Val;
 End;

        A := Val-Frac(Val);
        B := Val-A;
       
        S:=Sgn + IntegerToString(Trunc(A))+ '.';

        For I:=1 to 5 do
 Begin
        A:=B*XStepPY(10,I);
        A:=A-Frac(A);
        S:=S+IntegerToString(Trunc(A));
        A:=A/XStepPY(10,I);
        B:=B-A;
 end;
       
        RealToString:=S;
end;

5. Строку в вещественное число
Код:

Function String2Real(Val:String):Real;
Var P,i,Sgn,C:Integer;
 *A,B:real;
 *S,S1:string;
Begin
        A:=0;B:=0;        C:=0;
        S:=Repl(Val,',','.');
        P:=Pos(S,'.');
       
        if (GetChar(S,0)<>'-') then Sgn:=1 else Begin        Sgn:=-1;        C:=1;        end;
       
        If P>=0 Then
 *Begin
 *        S1:=Copy(S,C,P);
 *        for i:=Length(S1) downto 0 do
 * *A:=A+StringToInteger(GetChar(S1,I))*IntToReal(XStepPY(10,Length(S1)-I-1));
 *       
 *        S1:=Copy(S,P+1,Length(S));
 *        for i:=0 to Length(S1) do
 * *B:=B+StringToInteger(GetChar(S1,I))/IntToReal(XStepPY(10,I+1));
 *        String2Real:=(A+B)*Sgn;
 *End
        else
 *Begin
 *        S1:=Copy(S,C,Length(S));
 *        for i:=Length(S1) downto 0 do
 * *A:=A+StringToInteger(GetChar(S1,I))*IntToReal(XStepPY(10,Length(S1)-I-1));
 *        String2Real:=A*Sgn;
 *End;
end;

8)

pax 15.12.2005 21:31

Положительный X в любой степени :)

Код:

Function RXStepY(X:Real;Y:Real):Real;
var s:Real;
Begin
        If X<0 then
 S:=-1
        else
 If X=0 then
        S:=1
 else
  S:=exp(Y*log(X));
       
        RXStepY:=S;
End;


SubZer0 16.12.2005 02:23

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

вот накидал тут прогу:

Код:

program fff;

var str:string;
    i:integer;


function s2r(sval:string):real;

var p:integer;
i,svall:integer;
s,s1,ind:real;

begin

 p:=pos(sval,'.');
 s:=0;
 ind:=1;
 svall:=length(sval);
 
 for i:=0 to p do begin
 s:=s+StringToInteger(GetChar(sval,p-i-1))*ind;
 ind:=ind*10;
 end;
 
 ind:=10;
 for i:=p+1 to svall do begin
 s:=s+StringToInteger(GetChar(sval,i))/ind;
 ind:=ind*10;
 end;
 
 
 
 s2r:=s;

end;


begin
        str:='564.36';
        SetColor(255, 255, 255);
        FillRect(0, 0, GetWidth, GetHeight);
        SetColor(0, 0, 0);
        drawText('Source: '+str, 0, 0);
        drawText('Target: '+S2R(str), 0, 20);
        repaint; 
        delay(50000);
end.

и что ты думаешь? вот ставлю последнюю 6, результат идет 59... ставлю 5, идет 49...

:)

pax 16.12.2005 10:56

Цитата:

и что ты думаешь? вот ставлю последнюю 6, результат идет 59... ставлю 5, идет 49...
Вот и я не знаю... :unsure:

А вот эта строчка меня заинтересовала...
Код:

drawText('Target: '+S2R(str), 0, 20);
тоесть получается, что не надо было писать функцию преобразования RealToString...

А я старался :lol:

pax 16.12.2005 11:14

И еще, когда я делал свою фунцию, то столкнулся с проблемой: если передать в функцию целое число, то все вычисления будут неверными... надо бы в твоей такую проверку сделать... и еще надо сделать проверку на отрицательные числа... т.к. паскаль в функции StringToInteger(GetChar(sval,p-i-1))*ind при первом минусе вернет 0...

вот пока такие рассуждения :)

pax 17.12.2005 09:22

Короче выход такой... надо (мне по крайней мере) достать Java SDK и писать расширение на чистой яве и подключать к паскалю как модуль... другого выхода я пока не вижу... может на яве будет правильно работать...

PS: скачать с нета 50 метров думаю крутовато будет... хотя посмотрим...

SubZer0 17.12.2005 16:23

да, решение видишь правильное, но только к 50 метрам SDK тебе еще надо будет среду программирования гденить скачать... :)

pax 17.12.2005 17:20

Ну редактор есть в VS.Net 2003, а компилить буду через коммандную строку... как это описано в справке по мидлетпаскалю...

SubZer0 17.12.2005 17:34

если будешь писать либы, то цены тебе не будет! :rolleyes:

pax 17.12.2005 17:44

Цитата:

Originally posted by SubZer0@Dec 17 2005, 05:34 PM
если будешь писать либы, то цены тебе не будет! :rolleyes:
Да, но 50 метров...

SubZer0 17.12.2005 18:02

Цитата:

Originally posted by PAX@Dec 17 2005, 04:44 PM
Да, но 50 метров...
а что? всего 5 минут закачки... :P


ЗЫ флуд вообщето в FAQ мастдай... я потом все это почищу... :)

pax 17.12.2005 19:15

Стирай стирай, потом в аське поболтаем ;)

[Sp] 31.03.2006 18:28

Цитата:

Originally posted by PAX@15.12.2005, 18:06
Ну вроде написал функции преобразования типа Real в тип String и обратно :).
Правда работают немного не точно :( даж не знаю почему... если найдете ошибку, то исправьте пожалуйста.

1. Эта для того чтобы была :)
Код:

Function IntToReal(Val:Integer):Real;
Begin
        IntToReal:=Val;
End;

2. X в положительной целочисленной степени
Код:

Function XStepY(X:Real;Y:Integer):Real;
var i:integer;
 s:Real;
Begin
s:=1;
        If Y>0 then
 for i:=1 to Y do s:=s*x
        else
 If Y=0 then
        S:=1
 else
  for i:=-1 downto Y do S:=S/X;
       
        XStepY:=S;
End;

3. X в целочисленной степени
Код:

Function XStepY(X:Real;Y:Integer):Real;
var i,s:integer;
Begin
s:=1;
        If Y>0 then
 for i:=1 to Y do s:=s*x
        else
 If Y=0 then
        s:=1
 else
  for i:=-1 downto Y do s:=s/x;;
       
        XStepY:=s;
End;

4. Вещественное число в строку
Код:

Function RealToString(Val:Real):String;
Var I,N:Integer;
        A,B:real;
        S,Sgn:string;
Begin
        S:='';

        If Val>0 then
 Sgn:=''
 else
 Begin
        Sgn:='-';
        Val:=-Val;
 End;

        A := Val-Frac(Val);
        B := Val-A;
       
        S:=Sgn + IntegerToString(Trunc(A))+ '.';

        For I:=1 to 5 do
 Begin
        A:=B*XStepPY(10,I);
        A:=A-Frac(A);
        S:=S+IntegerToString(Trunc(A));
        A:=A/XStepPY(10,I);
        B:=B-A;
 end;
       
        RealToString:=S;
end;

5. Строку в вещественное число
Код:

Function String2Real(Val:String):Real;
Var P,i,Sgn,C:Integer;
 A,B:real;
 S,S1:string;
Begin
        A:=0;B:=0;        C:=0;
        S:=Repl(Val,',','.');
        P:=Pos(S,'.');
       
        if (GetChar(S,0)<>'-') then Sgn:=1 else Begin        Sgn:=-1;        C:=1;        end;
       
        If P>=0 Then
 Begin
        S1:=Copy(S,C,P);
        for i:=Length(S1) downto 0 do
  A:=A+StringToInteger(GetChar(S1,I))*IntToReal(XStepPY(10,Length(S1)-I-1));
       
        S1:=Copy(S,P+1,Length(S));
        for i:=0 to Length(S1) do
  B:=B+StringToInteger(GetChar(S1,I))/IntToReal(XStepPY(10,I+1));
        String2Real:=(A+B)*Sgn;
 End
        else
 Begin
        S1:=Copy(S,C,Length(S));
        for i:=Length(S1) downto 0 do
  A:=A+StringToInteger(GetChar(S1,I))*IntToReal(XStepPY(10,Length(S1)-I-1));
        String2Real:=A*Sgn;
 End;
end;

8)

Функция преобразования из real в string не работает, нужна функция B*XStepPY.
Дадите?)


Часовой пояс GMT +4, время: 08:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot