поиск элемента в строке
Подскажите, плз, как найти в строке 2 одинаковых символа...
var s:string;
i,j,kol:integer;
mn:set of char;
begin
read(s);
mn:=[];
for i:=1 to length(s) do
begin
kol:=0;
for j:=1 to length(s) do
begin
if s=s[j] then inc(kol);
end;
if (kol>=2) and not (s in mn) then
begin
write(s);
mn:=mn+[s];
end;
end;
write('*');
readln;
end.
Код:
if s=s[j] анд i <> j then
вместо kol можно использовать переменную boolean:
Код:
flag : boolean;
for i:=2 to length(s) do
begin
flag := false;
for j:=i-1 to 1 do
if s=s[j] then begin
flag := true;
break;
end;
if flag = true then
begin
write(s);
mn:=mn+[s];
end;
end;
for i:=2 to length(s) do
begin
flag := false;
for j:=i-1 to 1 do
if s=s[j] then begin
flag := true;
break;
end;
if flag = true then
begin
write(s);
mn:=mn+[s];
end;
end;
немного изменила код, может накосячила, т.к. Паскаль незнаю.
а вообще уточни что тебе надо сделать, занести в множество все символы которые в строке появляются больше одного раза?
нужно было создать строку, которая содержала бы символы, повторяющиеся в строке1, повторяющиеся более 2-х раз. В принципе - мой алгоритм меня почти устраивает. ПОЧТИ - потому что я не имел дело с множествами, и знаю про них по-наслышке. Если есть другой вариант, без использования множеств - очень хотелось бы его знать...
твой вариант не очень оптимален, вот и все. хотя важно что ты са пишешь. насчет других вариантов, можно символы хранить просто в другой строке, и код где ты добавляешь символ к множеству заменить на код добавления символа к строке. помоему в Паскале при работе со строками можно использовать оператор +, просто изначально задать строке значение ''.
Цитата: OlgaKr
твой вариант не очень оптимален, вот и все. хотя важно что ты са пишешь. насчет других вариантов, можно символы хранить просто в другой строке, и код где ты добавляешь символ к множеству заменить на код добавления символа к строке. помоему в Паскале при работе со строками можно использовать оператор +, просто изначально задать строке значение ''.
хм
может в поздних и можно но в том паскале что я изучал нельзя
2sherry
если вам нужно все эл-ы которые по 2 раза встречаются то с множеством лучше всего
а если два одинаковых симв то ищем до первых попавшихся
вот так можно выловить все эл-ы встречающиеся 2 и более раз в тексте
без вложенных циклов но с 2 мн-ами
Код:
m1:=[]; m2:=[];
for i:=1 to lenght(s) do
if s in m1 then m2:=m2+[s] else m1:=m1+[s];
for i:=1 to lenght(s) do
if s in m1 then m2:=m2+[s] else m1:=m1+[s];
если нужно те которые встречаются только 2 раза не более то кажется придется подключить мн-во в которое отправлять при 3 появлении
Цитата: nilbog
хм
может в поздних и можно но в том паскале что я изучал нельзя
2sherry
если вам нужно все эл-ы которые по 2 раза встречаются то с множеством лучше всего
а если два одинаковых симв то ищем до первых попавшихся
вот так можно выловить все эл-ы встречающиеся 2 и более раз в тексте
без вложенных циклов но с 2 мн-ами
если нужно те которые встречаются только 2 раза не более то кажется придется подключить мн-во в которое отправлять при 3 появлении
может в поздних и можно но в том паскале что я изучал нельзя
2sherry
если вам нужно все эл-ы которые по 2 раза встречаются то с множеством лучше всего
а если два одинаковых симв то ищем до первых попавшихся
вот так можно выловить все эл-ы встречающиеся 2 и более раз в тексте
без вложенных циклов но с 2 мн-ами
Код:
m1:=[]; m2:=[];
for i:=1 to lenght(s) do
if s in m1 then m2:=m2+[s] else m1:=m1+[s];
for i:=1 to lenght(s) do
if s in m1 then m2:=m2+[s] else m1:=m1+[s];
если нужно те которые встречаются только 2 раза не более то кажется придется подключить мн-во в которое отправлять при 3 появлении
</b></i></u>
Цитата: OlgaKr
...
немного изменила код, может накосячила, т.к. Паскаль незнаю.
а вообще уточни что тебе надо сделать, занести в множество все символы которые в строке появляются больше одного раза?
Код:
flag : boolean;
for i:=2 to length(s) do
begin
flag := false;
for j:=i-1 to 1 do
if s=s[j] then begin
flag := true;
break;
end;
if flag = true then
begin
write(s);
mn:=mn+[s];
end;
end;
for i:=2 to length(s) do
begin
flag := false;
for j:=i-1 to 1 do
if s=s[j] then begin
flag := true;
break;
end;
if flag = true then
begin
write(s);
mn:=mn+[s];
end;
end;
немного изменила код, может накосячила, т.к. Паскаль незнаю.
а вообще уточни что тебе надо сделать, занести в множество все символы которые в строке появляются больше одного раза?
"Четко"-написанный код, но можно было бы и без прерывания делать...
Вместо прерывания, сразу выводить символ и все...
И кода меньше, и "незнающий" не запутается...