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

Вниз

Как можно разбить строку на символы?   Найти похожие ветки 

 
имя   (2003-12-20 23:26) [40]

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


 
Ломброзо ©   (2003-12-20 23:31) [41]

LMD и RTFM


 
имя   (2003-12-20 23:36) [42]

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


 
Ломброзо ©   (2003-12-20 23:45) [43]

Аспейсиба, я не знал.


 
Ломброзо ©   (2003-12-20 23:49) [44]

Подозрительный сайтик. Поместите егой в топку.


 
kaif ©   (2003-12-21 04:17) [45]

z.Evgen (19.12.03 08:45)
Имеется переменная String как ее разбить на символы?


Делением пополам!
Сначала разбиваешь на символы до length div 2 и после length div 2, затем рекурсивно вызываешь эту процедуру для каждой половины. И так, пока не останется один символ. Это самый правильный и крутой метод. Так как все правильные методы используют деление отрезка пополам, а все крутые методы используют рекурсивные вызовы.
К тому же при пошлых и тривиальных решениях тебе пришлось бы резервировать ресурс под переменную для цикла for:

var
i: integer;


Рекурсивный вызов позволяет этого избежать и поэтому экономит минимум 4 байта оперативной памяти, отводимой под эту переменную.
И тебе не придется думать о длине этой переменной! И длине строки тоже!
ИМХО, реализация с рекурсивным вызовом самая универсальная, так как даже с переходом на платформы Win64, Win128 и Win256 исходный код не придется менять.
Существуют объектно-ориентированные языки программирования, в которых вообще нет циклов и все делается вызовом рекурсивных процедур. Так что этот код еще легко будет переводить на такие языки, что делает его универсальным.


 
Knight ©   (2003-12-21 19:59) [46]

Люди... Можно как-то избавиться от объявления типа, но чтобы при этом функция продолжала работать? И вообще, доработайте кто что может. :)


type TStrArr=Array of String;

function Explode(Sep:Boolean; Str:String):TStrArr;
var i,Len:Integer;
S:String;
begin
Result:=nil;
Len:=Length(Str);
if not Sep then begin
SetLength(Result,Len);
for i:=1 to Len do begin
Result[i-1]:=Str[i];
end;
end else if (Sep and (Len>0)) then begin
S:="";
for i:=2 to Len do begin
if (Str[i]=Str[1]) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=S;
S:="";
end else if (i=Len) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=S+Str[i];
end else S:=S+Str[i];
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var A:TStrArr;
i:Integer;
begin
Memo1.Clear;
A:=Explode(false," Имеется переменная String как ее разбить на символы?");
for i:=0 to Length(A)-1 do Memo1.Lines.Append(A[i]);
A:=nil;
end;


 
имя   (2003-12-21 21:20) [47]

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


 
Knight ©   (2003-12-21 21:42) [48]

Немного подправил разбивку по сепаратору... стало немного короче :)
Для тех кто не понял кода... Sep-указывает, что первый символ использовать как разделитель и бить строку по нему, если он False, то строка Str бьётся на символы...


function Explode(Sep:Boolean; Str:String):TStrArr;
var i,k,Len:Integer;
begin
Result:=nil;
Len:=Length(Str);
if not Sep then begin
SetLength(Result,Len);
for i:=1 to Len do begin
Result[i-1]:=Str[i];
end;
end else if (Sep and (Len>0)) then begin
k:=1;
for i:=2 to Len+1 do begin
if (i=Len+1) or (Str[i]=Str[1]) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=Copy(Str,k+1,i-k-1);
k:=i;
end;
end;
end;
end;


 
Knight ©   (2003-12-21 21:56) [49]

Что? Как потрепаться, так народу куча, а как... так никого? :(


 
Nous Mellon ©   (2003-12-21 22:05) [50]


> Что? Как потрепаться, так народу куча, а как... так никого?
> :(

Фишка в том что трепка расслабляет, а когда надо писать код думаешь может лучше полезть в свой незаконченный проект и сделать там что-нибудь полезное чем давать прикольные, но в общем то ненужные советы


 
Knight ©   (2003-12-21 22:37) [51]

>> Nous Mellon © (21.12.03 22:05) [50]
А при чём тут приколы? Я на полном серьёзе... :|
Понадобилась функция, аналогичная Explode в PHP, для разбивки стринга, заодно и сюда закинул.


 
SergP ©   (2003-12-22 02:24) [52]


> Knight © (21.12.03 21:56) [49]
> Что? Как потрепаться, так народу куча, а как... так никого?
> :(


Вот-вот... Стоит задать серьезный вопрос как все начинают его игнорировать... А потрепаться - то все слетаются как мухи на ... мед. Удивляюсь только как это всем не лень приводить такие длинные коды, это же написать такое нужно сначала!!! Причем с целью просто поприкалываться

...Может я свои вопросы неправильно формулирую... Нужно будет попробовать методом сабжа... Тогда и ответов куча будет. (Правда бесполезных) :-(



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

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

Наверх




Память: 0.56 MB
Время: 0.025 c
1-37746
lovres
2003-12-30 08:58
2004.01.13
Где взять новую версию OLE?


7-37953
LAMA3OID
2003-10-29 15:06
2004.01.13
Хук на функцию


1-37765
Оки
2003-12-29 16:23
2004.01.13
Как отправить на выполнение txt


1-37790
AGN
2003-12-29 11:19
2004.01.13
ListBox.Items.Add


14-37934
Юльчик
2003-12-20 09:42
2004.01.13
Экспертные системы