IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Строки, подстроки.
Анжелика
сообщение 18.12.2005 20:54
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 35
Пол: Женский
Реальное имя: Анжелика

Репутация: -  0  +


Ребят, у меня есть еще одно задание. Помогите мне понять его: все слова, которые не содержат заданной подстроки, заменить на «[censored]». Это обозначает, что я должна найти слова, потом помотреть есть ли в нем подстрока, причем слово должно быть больше подстроки, а потом если такая подстрока не нашлась в слове, то его надо заменить на «[censored]»? Я правильно поняла. Если нет, то укажите на ошибки.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 18.12.2005 20:59
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


1) Разбиваешь строку на слова : Разбиение строки на слова

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

будут вопросы, задавай


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Анжелика
сообщение 18.12.2005 21:03
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 35
Пол: Женский
Реальное имя: Анжелика

Репутация: -  0  +


Цитата(klem4 @ 18.12.2005 20:59) *

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

Все бы хорошо, но мне нельзя трогать знаки препинания в строке. Как с этим быть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 18.12.2005 21:05
Сообщение #4


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Ну тогда не надо заносить слова в массив !;) Доходишь до того момента как выделила слово и заботаешь с ним, все просто ;)


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.12.2005 22:02
Сообщение #5


Гость






Цитата
Все бы хорошо, но мне нельзя трогать знаки препинания в строке. Как с этим быть?

А там, извини, есть алгоритм разбиения (конкретно - вот этот), который вернет тебе только начало/длинну каждого слова, а строка останется неизменной, и никуда твои знаки препинания не денутся...
 К началу страницы 
+ Ответить 
Анжелика
сообщение 28.12.2005 23:06
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 35
Пол: Женский
Реальное имя: Анжелика

Репутация: -  0  +


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

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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.12.2005 23:17
Сообщение #7


Гость






Цитата
как избавиться от смещения индексов
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;
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 4:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"