Главная страница
    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.54 MB
Время: 0.011 c
14-37852
VEG
2003-12-22 22:12
2004.01.13
Самый быстрый алгоритм


3-37566
List
2003-12-12 00:01
2004.01.13
Data Module


14-37843
Fredericco
2003-12-23 22:26
2004.01.13
Мультиплатформенность в D7.


1-37763
miracle_fox
2003-12-29 17:00
2004.01.13
клавиша <enter> в Edit - как придать ей особое значение?


14-37845
Undert
2003-12-23 00:53
2004.01.13
Тут как то пролетала тема армии, вот послушайте - не пожалеете!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский