Вопрос № 175959: Уважаемые эксперты помогите пожалуйста: Удалить 2 раза в тексте слово встречающееся более трех раз. То есть вводится текст с пробелами и знаками препинания, нужно что бы программа удаляла первые два повторения слова...
Вопрос № 175959:
Уважаемые эксперты помогите пожалуйста: Удалить 2 раза в тексте слово встречающееся более трех раз. То есть вводится текст с пробелами и знаками препинания, нужно что бы программа удаляла первые два повторения слова
Отправлен: 09.01.2010, 23:46
Вопрос задал: Adskiy, Посетитель
Всего ответов: 3 Страница вопроса »
Отвечает Patriotix-N, 5-й класс :
Здравствуйте, Adskiy. Рабочий вариант.
Код:
program str;
function symbol(s:char):boolean; //Не учитывается такой вариант - "I'm"(код 044) , если встретится такое слово, то оно будет обработано как 2. Также не учитываются вариации с цифрами(коды 048-057) -
могут ли они являтся частью слов. В данном принимается, что цифры не относятся к слову и если слово будет начинаться с цифры, то оно будет обрабатываться отдельно от числа, как будто между ними стоит какой-либо знак(пробел, например). begin symbol:=((s >= #65) and (s<=#90))or((s>=#97) and (s<=#122))or((s >= #192) and (s<=#255)) end;
function TriplDel(a:string):string; var i:integer; count:integer; w,ws,b,c:string
; wp:array [1..2] of integer; //Массив позиций begin b:=a; for i:=1 to length(a) do begin if symbol(a[i]) then //Проверяем буква ли это begin w:= w + a[i]; //Записываем слово end else begin if symbol(a[i-1]) then //Мы только, что закончили считывaть слово begin if ((pos(w,ws) <> 0) //Если такая последовательность уже есть в списке удаленных and
(( symbol(ws[pos(w,ws)-1])) //Проверяем не является ли данная последовательность частью другого слова or (symbol(ws[pos(w,ws)+length(w)])))) or (pos(w,ws) = 0) then//Если эта последовательность еще не удалялась begin c:=b; //формируем новую вспомогательную строку count:=0; //Сбрасываем счетчик wp[2]:=0; //Сбрасываем счетчик смещения второго вхождения
while (pos(w,c)<>0) //Слово есть в строке and (count < 4) do //не обрабатываем все найденные вхождения после 4. begin if (not symbol(c[pos(w,c)-1])) //Проверяем не нашли ли мы кусок другого слова and (not symbol(c[pos(w,c)+length(w)])) then //для этого символ до найденного слова в тексте и после него, не должен быть частью друго слова, т.е. символом, определенным в функции symbol.
begin count:=count +1; // Нашли вхождение, поэтому увеличиваем счетчик case count of 1: wp[1]:=pos(w,c); //Устанавливаем смещение первого вхождения 2: wp[2]:=wp[2]+pos(w,c); // и второго. 4: begin delete(b,wp[2],length(w)); //Удаляем второе delete(b,wp[1],leng
th(w)); //и первое вхождения ws:=ws + w + ' '; //Отмечаем(добавляем к списку) слово, как уже встречавшееся end; end; end; if count < 2 then wp[2]:=wp[2]+pos(w,c)+length(w); //Смещяем значение второго вхождения на обрезаемую длинну delete(c,1,pos(w,c)+length(w)); //Обрезаем строку с начала до конца найденного слова,
чтобы не находить его следующий раз. end; end; w:=''; //Обнуляем ключевое слово end; end;
end; TriplDel:=b; //Возвращяемое значение end;
var s:string; begin s:='1 hello odin 2 hello 1 hi 2 shine 3 hi 4 hi 3 hello ras yes. I 5 hi am fine! 4 hello, 6 hi 7 hi'; writeln(TriplDel(s)); readln; end.
Раб
ота:
Код:
Вход: 1 hello odin 2 hello 1 hi 2 shine 3 hi 4 hi 3 hello ras yes. I 5 hi am fine! 4 hello, 6 hi 7 hi
Выход: 1 odin 2 1 2 shine 3 4 hi 3 hello ras yes. I 5 hi am fine! 4 hello, 6 hi 7 hi
----- Лучше знать ничего обо всем, чем все ни о чем.
Ответ отправил: Patriotix-N, 5-й класс
Ответ отправлен: 12.01.2010, 21:40
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 258578
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает lanakarta, 2-й класс :
Здравствуйте, Adskiy. мой вариант
Приложение:
Ответ отправил: lanakarta, 2-й класс
Ответ отправлен: 13.01.2010, 17:02
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 258596
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
----- Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч
Ответ отправил: Зенченко Константин Николаевич, Модератор
Ответ отправлен: 13.01.2010, 19:19 Украина, Киев Тел.: +38-097-953-66-19 Адрес: Украина, Киев
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 258597
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.