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.
Дадите?)

SubZer0 31.03.2006 18:48

Цитата:

Originally posted by [Sp]@31.3.2006, 15:28
Функция преобразования из real в string не работает, нужна функция B*XStepPY.
Дадите?)

ты ее сам там в посте несколько раз процитировал ;)

[Sp] 31.03.2006 19:10

Цитата:

Originally posted by SubZer0+31.3.2006, 14:48--><div class='quotetop'>ЦИТАТА(SubZer0 @ 31.3.2006, 14:48)</div><div class='quotemain'><!--QuoteBegin-[Sp
,31.3.2006, 15:28]Функция преобразования из real в string не работает, нужна функция B*XStepPY.
Дадите?)

ты ее сам там в посте несколько раз процитировал ;)
[/b][/quote]
XStepPY ???... блин, вот хоть убейте, но в упор не вижу :(( вижу XStepY

SubZer0 31.03.2006 19:15

Цитата:

Originally posted by [Sp]+31.3.2006, 16:10--><div class='quotetop'>ЦИТАТА([Sp] @ 31.3.2006, 16:10)</div><div class='quotemain'>
Цитата:

Originally posted by SubZer0@31.3.2006, 14:48
<!--QuoteBegin-[Sp
Цитата:


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



ты ее сам там в посте несколько раз процитировал ;)

XStepPY ???... блин, вот хоть убейте, но в упор не вижу :(( вижу XStepY
[/b][/quote]

точно... за мной косяк... :pardon: :pardon: ща стукну PAX'y в аську... :)

[Sp] 31.03.2006 19:24

Фух) а я то думал что у мя что то с глазами или головой :o

pax 02.04.2006 12:27

Это я ошибся (точнее переименовать забыл), функция которую вы ищите - под номером 3, только сокращенная (хотел повысить быстродействие).
Код:

Function XStepPY(X:Integer;Y:Integer):Integer;
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;

XStepPY:=s;
End;


satan 20.02.2007 15:29

Re: Полезные функции
 
Продолжу тему, мож пригодица, разбиение строки по определённому символу( в данном случае по ',')

Код:


program Splitting;
var
  StrArr : array[1..255] of string;
  str, smb : string;
  n, i: integer;
 
begin
 
 str := 'Вася,Петя,Коля';
 n := 1;
 
 for i := 0 to Length(str) -1 do
begin
smb := GetChar(str,i);
 
 if smb <> ',' then
 begin
    StrArr[n] := StrArr[n] + smb;
end
else
begin
n := n + 1;
end;
end;
 
for
i:=1 to n do drawText(StrArr[i],0,i*10 -10);
 
repaint;
delay(5000);
end.


cHeRsAnYa 10.01.2008 22:03

Ответ: Полезные функции
 
Как программу splitting сделать функцией? Ведь возвращаемое функцией значение не может быть массивом.

ViNT 11.01.2008 00:03

Ответ: Полезные функции
 
Массивом не может быть значение функции в библиотеке
на java, внутри программы это реализовать можно:
Код:

type
arr=array[1..255]of string;

function splitting:arr;
begin
...
end;


cHeRsAnYa 12.01.2008 11:15

Ответ: Полезные функции
 
Спасибо. P.S.: как на форуме плюсы ставить?

ViNT 12.01.2008 12:39

Ответ: Полезные функции
 
Кнопкой "Полезно".

Kn793 30.08.2008 20:12

FloatToStr
 
Преобразует из real в string нормально(без нулей в конце)
Код:

function FloatToStr(r:Real):String;
var
        s:string;
begin
        s := '' + r;
        If pos(s,'.') <> - 1 then while getchar(s,length(s)-1) = '0' do s := copy(s,0,length(s)-1);
        FloatToStr := s;
end;


SkyLine777 22.11.2008 17:35

Ответ: Полезные функции
 
Преобразует из real в string ещё нормальней(без нулей и точек в конце)


function FloatToStr(r:Real):String;
var
s:string;
begin
s := '' + r;
If pos(s,'.') <> - 1 then while getchar(s,length(s)-1) = '0' do s := copy(s,0,length(s)-1);
FloatToStr := s;


if pos(s,'.')=length(s)-1 then FloatToStr:=copy(s,0,length(s)-1);
end;


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

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