Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2007, 16:50   #1
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
Вопрос Перебор заглавных букв в слове

Как перебрать все возможные варианты заглавных букв в слове? Например, слово "привет":
Привет
пРивет
прИвет
...
ПРивет
ПрИвет
ПриВет
...
ПРИВЕТ

Результаты занести в мемо
=LeonZone= вне форума Ответить с цитированием
Старый 28.10.2007, 17:52   #2
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Для начала устанавливается соответствие между буквами прописными и заглавными- создаешь 2 массива, в одном идут попорядку аски коды алфавита(прописные) а,б,в; во втором идут попорядку аски коды заглавных букв.
Далее начинаешь перебирать. Всего у тебя будет n^2 комбинаций, где n-длина слова.
Перебор осуществляешь побуквенно, просто меняя букву на заглавную.
Для этого есть функция chr(u:integer), которая выдает символ с кодом u.
Заносить в мемо- memo1.lines.add(s:string). Хотя можно заносить и подругому.
bill вне форума Ответить с цитированием
Старый 28.10.2007, 19:31   #3
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

2 bill:
А можно подробнее? Желательно уже набросанный примерчик...
=LeonZone= вне форума Ответить с цитированием
Старый 31.10.2007, 20:38   #4
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию код

Ок. Вот реализация того что я говорил. Думаю сам сможешь остальное доработать(или подправить):
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,sharemem;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;n:string;

implementation

{$R *.dfm}
function zamena(s:string;f:integer):string;
var a,b:array[1..33] of byte;i,z:integer;c:char;t,t1:string;
begin
// здесь забьешь аски-значения прописных букв поочердно в массив а, в массив в-значения заглавных.
for i:=1 to length(s) do
if  i=f then
begin
for z:=1 to 33 do
if s[i]=chr(a[i]) then
begin
c:=chr(b[z]);
break;
end;
break;
end;
t1:=copy(s,1,(length(s)-f-1))+c;
t2:=copy(s,(length(s)-f+1),length(s));
result:=t1+t2;
end;


procedure TForm1.Button1Click(Sender: TObject);
var s:string;i,z,t,r:integer;
begin
s:=edit1.text;
 t:=0;
for i:=1 to length(s) do
begin
n:=s;
t:=t+1;
for r:=1 to t do
for z:=1 to length(s) do begin
n:=zamena(n,z);
memo1.Lines.Add(n);
end;
end;
end;

end.
bill вне форума Ответить с цитированием
Старый 31.10.2007, 21:24   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

По сути эта задача - перебор всех значений двоичного пятиразрядного числа. Вместо нуля прописная, вместо единицы заглавная буква.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 01.11.2007, 19:53   #6
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

2 bill:
Спасибо, но программа делает явно не то, что надо! Вот смотри результат перебора слова hello:
hel
he
h
hel
he
h
hel
he
h
hel
he
h
hel
he
h
=LeonZone= вне форума Ответить с цитированием
Старый 01.11.2007, 21:06   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот вам пример полного перебора для двух символов:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,j: integer;
    tmp: string;
begin
ListBox1.Clear;
for i:=1 to Length(Edit2.Text) do
for j:=1 to Length(Edit2.Text) do
begin
tmp:=Edit2.Text;
tmp[i]:=Chr(Ord(tmp[i])-32);
ListBox1.Items.Add(tmp);
if j<>i then
begin
tmp[j]:=Chr(Ord(tmp[j])-32);
ListBox1.Items.Add(tmp);
end;
end;
end;
Дальше, думаю, добьете самостоятельно.
mihali4 вне форума Ответить с цитированием
Старый 01.11.2007, 21:11   #8
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Там надо думаю добавить еще цикл, + сделать сброс новоявленной строки. В общем ошибка идет при вызове процедуры замена(она то написана правильно).
=> Надо переделать ее вызов.
Посмотрю попозже.
p.s 2 =LeonZone=, хорошо бы если б написал точно все комбинации для одного слова. А то я насчитал почему то (n-2) вариантов, хотя их по идее должно быть n^2 ?!

Последний раз редактировалось bill; 01.11.2007 в 21:33.
bill вне форума Ответить с цитированием
Старый 02.11.2007, 14:59   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

не n^2, а 2^n (n-число букв в слове)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать перебор ??? akasex Общие вопросы Delphi 2 13.06.2008 09:27
Задача на большой перебор МаксимNEWProgramm Паскаль, Turbo Pascal, PascalABC.NET 2 06.04.2008 18:15