Главная страница
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.015 c
4-37977
Ertong
2003-11-08 22:01
2004.01.13
Запись HKEY_Current_User другого пользователя в ХР


14-37867
RDA
2003-12-22 12:47
2004.01.13
Прога типа ICQ для локальной сети


1-37734
raidan
2003-12-29 22:25
2004.01.13
Как в listbox узнать номер последней выделенной строки?


14-37889
VictorT
2003-12-22 12:03
2004.01.13
Думаю, Ketmar не обидится...


3-37521
Ренат
2003-12-16 16:08
2004.01.13
Помогите с простым запросом