Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на String!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
push
Нужно удалить из предложения слова, которые встречаются в нем заданное количество раз.
Altair
Разбей для начала строку на слова.
разбиение на слова.
volvo
klem4, не пойдет... Проверяй строку: 'da da net yes yes yes no net' при count = 2...
Должно остаться 'yes yes yes no', а что остается? ;)
klem4
ага, лажа полная smile.gif))))))))
буду чинить)))
volvo
А вот так вроде работает...

uses crt;
const
limits=[#0..#32,'.',',','!','?',';'];
max_str = 30;

var
x: array[1 .. max_str] of record
s: string;
cnt: integer;
end;

len, p, ii, x_count: integer;
b: boolean;

s: string;
i, j, count, bword: integer;

Begin
clrscr;
write('s='); readln(s);
write('count='); readln(count);

i:=1; j:=0;

x_count := 0;
while i <= length(s) do begin
while (i<=length(s)) and (s[i] in limits) do inc(i);
if i <= length(s) then begin
bword := i;
inc(j);
while (i<=length(s)) and (not(s[i] in limits)) do inc(i);

b := false;
p := 1;
while (p <= x_count) and (not B) do begin
if x[p].s = copy(s,bword,i-bword) then begin
inc(x[p].cnt); b := true;
end;
inc(p)
end;

if not b then begin
inc(x_count);
x[x_count].s:=copy(s,bword,i-bword);
x[x_count].cnt := 1;
end;
end;
end;

for i := 1 to x_count do
if x[i].cnt = count then begin
len := length(x[i].s);
ii := 1;
repeat
p := pos(x[i].s, copy(s, ii, 255)) + pred(ii);
if (p <> pred(ii)) then begin
b := true;
if p > 1 then b := b and (s[p-1] in limits);
if pred(p)+len < length(s) then
b := b and (s[p+len] in limits);

if b then delete(s, p, len)
else ii := p + len;
end
until p = pred(ii);
end;

writeln('s=',s);
readln;
end.

Тестировалось на:
s := 'dat da da net yes yes yes no net neta';
count := 2;
klem4
таак опоздал, но вроде исправился :DDDD
уже из принципа решил, надеюсь этоправильно ))) вроде тестил прилично)))
uses crt;
const
limits=[#0..#32,'.',',','!','?',';'];
var
x,yes,no:array[1..30] of string;
s:string;
i,j,k,l,yy,nn,ycount,ncount,count,count1,bword:integer;
flag:boolean;

Begin

clrscr;

write('s='); readln(s);

write('count='); readln(count);

i:=1; j:=0;

while(i<=length(s)) do
begin
while(i<=length(s))and(s[i] in limits) do
inc(i);
if i<=length(s) then
begin
bword:=i;
inc(j);
while(i<=length(s))and(not(s[i] in limits)) do
inc(i);
x[j]:=copy(s,bword,i-bword);
end;
end;

ycount:=0; ncount:=0;

for i:=1 to j do
begin
count1:=0;
for k:=i to j do
if x[i]=x[k] then
inc(count1);
if count1=count then
begin
if ycount>0 then
begin
flag:=false;
l:=1;
while(l<=ycount)and(not(flag)) do
if x[i]=yes[l] then
flag:=true
else inc(l);
if flag then
begin
inc(ycount);
yes[ycount]:=x[i];
end
else
begin
inc(ncount);
no[ncount]:=x[i];
end
end
else
begin
inc(ncount);
no[ncount]:=x[i];
end;

end{c=c}
else
begin
if ncount>0 then
begin
flag:=false;
l:=1;
while(l<=ncount)and(not(flag)) do
if x[i]=no[l] then
flag:=true
else inc(l);
if not(flag) then
begin
inc(ycount);
yes[ycount]:=x[i];
end
end
else
begin
inc(ycount);
yes[ycount]:=x[i];
end;
end;
end;

for i:=1 to ycount do
write(yes[i],' ');
readln;
end.



злая задача :fire:
volvo
:D Опять не пойдет... Ты же все разделители потеряешь !!!
Попробуй:
s := 'dat da da ; net yes ;; yes yes ... no net neta';
count := 2;
1
спасибо!
а нет ли более простого решения? не учитывая знаки препинания, а только пробелы.
вроде бы, решение должно включать в себя: выделение каждого слова, подсчет количества каждого слова в предложении, и, если это количество равно заданному числу, удаление этих слов из строки.
klem4
уж куда проще smile.gif))
я сейчас делаю еще одну версию, мне кажется она буде проще двух предыдущих, сегодня уже надоело, завтра отлаживать буду и выложу, как доделаю...если доделаю конечно smile.gif))
Guest
тогда ладно...мне завтра уже поздно sad.gif
спасибо огроомное!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.