|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Из строки в список
Прошу помощи:
Как из строки типа: [A-C][EF][K-PSZ] получить список "слов": AEK AEL AEM AEO AEP AES AEZ AFK AFL AFM AFO AFP AFS AFZ BEK BEL BEM и так далее? Я создал массив и заполнил его алфавитом: Код:
i := 0; for c := 'A' to 'Z' do begin i := i+1; spAlfawEN[i] := c; end; Потом делал циклами с поиском, в итоге получалась пирамида циклов... , в общем так программа не работает!!! Последний раз редактировалось lkz_07, 19.12.2014 в 22:54. |
#2
|
||||
|
||||
А так не проще?
Код:
const s1 = 'ABC'; s2 = 'EF'; s3 = 'KLMNOPSZ'; procedure TForm1.Button1Click(Sender: TObject); var i1, i2, i3: integer; begin for i1:= 1 to Length(s1) do for i2:= 1 to Length(s2) do for i3:= 1 to Length(s3) do Memo1.Lines.Add(s1[i1] + s2[i2] + s3[i3]); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Код:
str := StringReplace(str,'[','',[rfReplaceAll]); str := StringReplace(str,']',#13#10,[rfReplaceAll]); memo1.lines.text := str; Не эффективно, зато просто. |
#4
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Цитата:
Да, сам дурак, не внимательно прочитал задачу. Единственное, тут есть маленькая проблемка. Алеган дал решение для конкретной строки. Вопрос - как сделать для любой подобной строки. Надо более точно знать задание. Например, допустимы ли только заглавные латинские буквы или могут быть строчные русские буквы, например, или цифры. |
#6
|
|||
|
|||
Цитата:
Это да - для конкретного кол-ва скобок. Их может быть неопределнное кол-во: 2 или 4 или 6 и т.д. Я взял для примера - 3. Пока только для прописных (заглавных) букв, один язык английский. А строчные потом можно сделать из созданного списка: типа со 2-ого буквы и до конца слова переводить в нижний регистр. Главное как создать список? Alegun может и правильно подсказал начало: Код:
s1 = 'ABC'; s2 = 'EF'; s3 = 'KLMNOPSZ'; Если будет 4 скобки или больше - как сделать конкретное кол-во циклов для введенной строки? |
#7
|
||||
|
||||
Для данной конкретной строки получился вот такой бред - компиляция из всего вышеприведённого кода
Код:
procedure TForm1.Button1Click(Sender: TObject); function wr(c1,c2: char): string; var c: char; begin Result:=''; for c := 'A' to 'Z' do begin if c = c1 then Result:= c1 else if Length(Result) > 0 then Result:= Result + c; if c = c2 then exit; end; end; var c: char; s: string; sl: TStrings; i,j,i1,i2,i3: integer; begin s:= Edit1.Text; // '[A-C][EF][K-PSZ]'; s:= StringReplace(s,'[','',[rfReplaceAll]); s:= StringReplace(s,']',#13#10,[rfReplaceAll]); sl:= TStringList.Create; sl.Text:= s; for i := 0 to sl.Count -1 do if Pos('-', sl[i]) > 0 then begin s:= ''; j:= 1; while j < Length(sl[i]) do begin s:=s+sl[i][j]; if (j+1 < Length(sl[i])) and (sl[i][j+1] = '-') then begin Delete(s,Length(s),1); s:= s + wr(sl[i][j], sl[i][j+2]); inc(j,2); end; inc(j); end; s:=s+sl[i][j]; sl[i]:=s; end; Memo1.Clear; for i1:= 1 to Length(sl[0]) do for i2:= 1 to Length(sl[1]) do for i3:= 1 to Length(sl[2]) do Memo1.Lines.Add(sl[0][i1] + sl[1][i2] + sl[2][i3]); sl.Free; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 22.12.2014 в 07:08. |
#8
|
||||
|
||||
Забавная задачка. Так устроит?
Код:
procedure TForm28.Button1Click(Sender: TObject); var i,j: Integer; CharSet: String; SL: TStringList; procedure Eval(S: String; Level: Integer); var i: Integer; begin if Level > SL.Count - 1 then Exit; for i := 1 to Length(SL.Strings[Level]) do begin Eval(S + SL.Strings[Level][i], Level+1); if Level = SL.Count - 1 then Memo1.Lines.Add(S + SL.Strings[Level][i]); end; end; begin Memo1.Clear; SL := TStringList.Create; SL.Delimiter := '['; SL.DelimitedText := Edit1.Text; SL.Delimiter := ']'; SL.DelimitedText := SL.Text; for j := 0 to SL.Count - 1 do begin i := 1; CharSet := ''; while i <= Length(SL.Strings[j]) do begin if SL.Strings[j][i] in ['A'..'Z'] then CharSet := CharSet + SL.Strings[j][i] else begin Inc(i); while SL.Strings[j][i] <> CharSet[Length(CharSet)] do CharSet := CharSet + Succ(CharSet[Length(CharSet)]); end; Inc(i); end; SL.Strings[j] := CharSet; end; Eval('', 0); end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
Да уж, многоувж. товарищ Страдалецъ - браво!
Двое суток въезжал в твой пример: торжество рекурсии и разработчиков класса TStringList, мне пока, вот так сходу, такое не доступно, спсб за науку Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
lkz_07 (23.12.2014)
|
#10
|
|||
|
|||
Цитата:
Огромное Вам СПАСИБО. Буду тестировать и дорабатывать под свою задачу. |