Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки, подстроки.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Анжелика
Ребят, у меня есть еще одно задание. Помогите мне понять его: все слова, которые не содержат заданной подстроки, заменить на «[censored]». Это обозначает, что я должна найти слова, потом помотреть есть ли в нем подстрока, причем слово должно быть больше подстроки, а потом если такая подстрока не нашлась в слове, то его надо заменить на «[censored]»? Я правильно поняла. Если нет, то укажите на ошибки.
klem4
1) Разбиваешь строку на слова : Разбиение строки на слова

2) После этого идешь по массиву и проверяешь входит ли в слово заданная подстрока с помощью ф-и pos, как ей пользоваться найдешь тут : FAQ : Строки

будут вопросы, задавай
Анжелика
Цитата(klem4 @ 18.12.2005 20:59) *

После этого идешь по массиву и проверяешь

Все бы хорошо, но мне нельзя трогать знаки препинания в строке. Как с этим быть?
klem4
Ну тогда не надо заносить слова в массив !;) Доходишь до того момента как выделила слово и заботаешь с ним, все просто ;)
volvo
Цитата
Все бы хорошо, но мне нельзя трогать знаки препинания в строке. Как с этим быть?

А там, извини, есть алгоритм разбиения (конкретно - вот этот), который вернет тебе только начало/длинну каждого слова, а строка останется неизменной, и никуда твои знаки препинания не денутся...
Анжелика
Ребят, скажите, что у меня не так. результат не такой какой нужен. как избавиться от смещения индексов. Вот программа:
Код

uses crt;
const delimiter = [#32, ',', '.', '!', ':'];
type wrd_info = record start, len: byte; end;
function get_words(s: string; var words: array of wrd_info): integer;
var
   count: integer;
   i, curr_len: byte;
begin
     count := -1; i := 1;
     while i <= length(s) do
     begin
           while (s[i] in delimiter) and (i <= length(s)) do inc(i);
           curr_len := 0;
           while not (s[i] in delimiter) and (i <= length(s)) do begin
           inc(i);
           inc(curr_len);
    end;
    if curr_len > 0 then
    begin
         inc(count);
         with words[count] do
         begin
              start := i - curr_len;
              len := curr_len
         end;
    end;
end;
    get_words := count + 1;
end;

const max_word = 255;

var words: array[1 .. max_word] of wrd_info;
    i, n: integer;
    s,p,h:string;
begin
     clrscr;
     Write('Vvedite glavnuu stroku');
     readln(s);
     Write('Vvedite podstroku');
     readln(h);
     n := get_words(s, words);
     for i := 1 to n do
     if pos(h, copy(s, words[i].start, words[i].len)) = 0 then
     begin
          delete(s,words[i].start, words[i].len);
          insert('[consored]', s,words[i].start);
     end;
     writeln(s);

end.
volvo
Цитата
как избавиться от смещения индексов
yes2.gif Стандартная ошибка... Нужно проходить по словам в обратном порядке (от конца предложения к началу), тогда индексы будут меняться, но все последующие слова уже заменены, и ты просто на это не обращаешь внимания...

Попробуй:
     n := get_words(s, words);
for i := n downto 1 do
if pos(h, copy(s, words[i].start, words[i].len)) = 0 then
begin
delete(s,words[i].start, words[i].len);
insert('[consored]', s,words[i].start);
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.