![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Множество. ЯП делфи 7 [D7]
Дмитрий © (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 :)