Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Множество. ЯП делфи 7 [D7]


Страницы:   1 2

Дмитрий ©   (2013-08-19 13:35:00) 

Текст задан строкой. Напечатать все латинские буквы (заглавные и строчные), которые входят только один раз.
в едит я ввожу
а в listbox результат
ну и конечно button (Выполнить)


брат Птибурдукова   (2013-08-20 13:43:00) [1]


> Какой такой карачун? 32 элемента всего
Мда… "Я такой же осёл, как и вы, сэр!" (с) Остров Сокровищ


Sha   (2013-08-20 13:27:00) [2]

> брат Птибурдукова   (20.08.13 13:20) [20]
> Не придёт ли стеку карачун?

Какой такой карачун? 32 элемента всего.

> в исходной задаче должен быть не set of ansichar, а set of ('A'..'Z', 'a'..'z') :-)

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


брат Птибурдукова   (2013-08-20 13:20:00) [3]


> array[0..last] of set of AnsiChar;
А ч0 так жестоко? Не придёт ли стеку карачун? Тут, по-моему, динамический массив был бы куда более уместен (если оставить за рамками целесообразность решения задачи через множества).

Ну и справедливости ради, в исходной задаче должен быть не set of ansichar, а set of ('A'..'Z', 'a'..'z') :-)


Sha   (2013-08-20 12:42:00) [4]

Что-то молчит студент, может не нравится предложенный вариант?
Ладно, вот тогда его чуть укороченная версия.
Как и раньше, считает хоть 100500 повторений.  

procedure TForm1.Button1Click(Sender: TObject);
const
 last= SizeOf(integer)*8-1;
var
 a: array[0..last] of set of AnsiChar;
 i, k, n: integer;
 s: AnsiString;
 ch: AnsiChar;
begin;
 ListBox1.Items.Clear;
 n:=StrToIntDef(Edit1.Text,-1);
 if n<0 then ListBox1.Items.Add('задайте число повторений')
 else begin;
   s:=Edit2.Text;
   for i:=0 to last-1 do a[i]:=[];
   for k:=1 to Length(s) do begin;
     ch:=s[k];
     i:=0;
     while ch in a[i] do begin;
       exclude(a[i],ch);
       inc(i);
       end;
     include(a[i],ch);
     end;
   k:=n;
   a[last]:=['A'..'Z','a'..'z'];
   for i:=0 to last-1 do begin;
     if k and 1=0 then a[last]:=a[last]-a[i] else a[last]:=a[last]*a[i];
     k:=k shr 1;
     end;
   for ch:=#0 to #255 do if ch in a[last] then ListBox1.Items.Add(ch);
   end;
 end;


Sha   (2013-08-19 18:10:00) [5]

> только ничего не спрашивайте про множество c

все равно не отвечу, и вам не советую ))


брат Птибурдукова   (2013-08-19 18:05:00) [6]


> только ничего не спрашивайте про множество c
Обижаешь, начальник! это ж первое правило бойцовского клуба!


Sha   (2013-08-19 17:51:00) [7]

только ничего не спрашивайте про множество c ))


Плохиш   (2013-08-19 17:47:00) [8]


> icWasya ©   (19.08.13 17:32) [12]

Зачёт не сдан. Тема по множествам не усвоена.


Sha   (2013-08-19 17:46:00) [9]

> брат Птибурдукова   (19.08.13 16:54) [11]
> если бы задачка про "ровно три, два, эн вхождений" была
> в курсе функционального программирования, то не удивился бы.

ну тогда так:


procedure TForm1.Button1Click(Sender: TObject);
var
 a: array[0..31] of set of AnsiChar;
 b, c: set of AnsiChar;
 i, k, n: integer;
 s: AnsiString;
 ch: AnsiChar;
begin;
 ListBox1.Items.Clear;
 n:=StrToIntDef(Edit1.Text,0);
 if n<=0
 then ListBox1.Items.Add('неверно задано число повторений')
 else begin;
   for i:=0 to 31 do a[i]:=[];
   s:=Edit2.Text;
   for k:=1 to Length(s) do begin;
     ch:=s[k];
     if ch in['A'..'Z','a'..'z'] then begin;
       i:=0;
       while true do begin;
         if not (ch in a[i]) then begin;
           include(a[i],ch);
           break;
           end;
         exclude(a[i],ch);
         inc(i);
         end;
       end;
     end;
   c:=[]; for ch:=#0 to #255 do include(c,ch);
   b:=c;
   k:=n;
   for i:=0 to 31 do begin;
     if (k and 1)<>0 then b:=b*a[i] else b:=b*(c-a[i]);
     k:=k shr 1;
     end;
   for ch:=#0 to #255 do if ch in b then ListBox1.Items.Add(ch);
   end;
 end;


брат Птибурдукова   (2013-08-19 17:36:00) [10]

где же множество?


icWasya   (2013-08-19 17:32:00) [11]

завести вот такой массив

var
 C:Char;
 I:Integer;
 LetterCount: array [Char] of integer; // не удивляться


с начала его очистить, используя FillChar - посмотри сам как именно

цикл по символам строки
 for I:=1 to Length(S) do  Inc(LetterCount[S[I]]);// внимательно разберись, что означает каздая функция

Ну а затем вывод в ListBox
for C:=Low(LetterCount) to High(LetterCount) do
 if (LetterCount[C] == 1) then ListBox.Items.Add(C);


брат Птибурдукова   (2013-08-19 16:54:00) [12]

а чёрт его знает, как нынче в институте дрессируют %-)
я бы решал не через множества (в делфи). если бы задачка про "ровно три, два, эн вхождений" была в курсе функционального программирования, то не удивился бы.


Sha   (2013-08-19 16:47:00) [13]

А ровно два раза - еще не идиотская? )


брат Птибурдукова   (2013-08-19 16:37:00) [14]

Задача учебная :-)

Вот если бы "ровно три раза, решать через множество", тогда бы была идиотской и садистской.


Sha   (2013-08-19 16:31:00) [15]

> брат Птибурдукова   (19.08.13 16:07) [7]

Разумеется.

Но задача-то идиотская. Или это только мне кажется?


брат Птибурдукова   (2013-08-19 16:07:00) [16]


> Sha ©   (19.08.13 15:35) [6]
Очевидно, тогда мой совет будет другим.


Sha   (2013-08-19 15:35:00) [17]

> брат Птибурдукова   (19.08.13 14:53) [5]

а если нужны те, что входят ровно 3 раза? )


брат Птибурдукова   (2013-08-19 14:53:00) [18]

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


Dmitry   (2013-08-19 14:47:00) [19]

Не сложно помочь без денег, просто покажите один раз  тогда я сам все разберусь.....


ProgRAMmer Dimonych   (2013-08-19 14:40:00) [20]

Сделаю за 900, но за то, что в e-mail фигурирует фамилия моего бывшего начальника, ещё +100. Итого 1000 :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо