Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка символьной информации
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
NeWT
Здравствуйте!!!
Вот у меня проблема: я совсем не давно начал программировать на Pascale (до этого совершенно не имел понятия об этом) и там где я сейчас учусь, необходимо в течении семестра сдать несколько лабораторных работ, несколько я уже сдал, но кое-что я не понимаю. Вот, например, задача:"Ввести строку текста. Строка может быть пустая или из одних пробелов.
Разделители представляют собой множество – ‘ /?.,<;>:”!’*%’. Слово- любая последовательность символов, ограниченная с одной или двух сторон разделителями" Необходимо удалить первые N слов, содержащих заданную подстроку 3 раза. blink.gif
Я совершенно не понимаю алгоритм решения этой задачи :p2:, очень прошу помочь!!! :molitva:
Заранее благодарен.
volvo
NeWT
Удалить только слова или разделители тоже?
Пример:
строка = "stststsrtsrtsee&&!%rstrstrstrtkk%<<opopopop??"
N = 2
подстрока = "st"
Что будет в результате?
"&&!%%<<opopopop??"
или
"opopopop??"
expertpro_mail.ru
писец, условие задачи писал натурально аутипный тип smile.gif

пожалста, не оскорбляем никого, ОК ?. GoodWind
судя по всему, условие на русском:
1.вводится "строка"
2.вводится "подстрока"
3."подстрока"="подстрока"+"подстрока"+"подстрока"
4.берем "слово" до первого встреченного разделителя (выход из цикла поиска, если больше их нет)
5.если в "слове" есть "подстрока" и счетчик удаленных "слов" не превысил N - удаляем "слово"
6.крутим дальше на пункт 4
7.удалять с разделителями - судя по всему - "слова" - это что-то типа тегов

;)
expertpro_mail.ru
здесь немного упрощенно было (подстрока идет 3 раза _подряд_). пишешь вначале каркас программы, потом наворачиваешь ее...
а так - надо будет еще внутренний цикл добавить по "слову" - подсчет - сколько раз встретится "подстрока"
;)
expertpro_mail.ru
а как еще назвать "горе-преподавателя", который выдает такое?! smile.gif
"Ввести строку текста. Строка может быть пустая или из одних пробелов."
и потом сразу "Необходимо удалить первые N слов, содержащих заданную подстроку 3 раза. " - неопытные люди от таких условий впадают в полный ступор. вот так плодится раздражение и тихая ненависть к предмету, что печально...
GoodWind
expertpro_mail.ru, может Вы лучше поможете человеку кодом (с объяснением),
Цитата
я совсем не давно начал программировать на Pascale (до этого совершенно не имел понятия об этом)

человек ясно сказал, что он Новичок...
expertpro_mail.ru
человек просил помочь с алгоритмом. он учится сам. это всегда радует! ;)

похоже, возникло небольшое недоразумение - "писец, аутипный тип" - это имелся в виду не NeWT, а тот кто ему такое условие выдал.
Altair
Цитата
аутипный тип

Ну и тип! Инкапсулировать таких надо!
expertpro_mail.ru, а в чем проблемма? Надо разбирать строку...
expertpro_mail.ru
пусть чел вначале внешний цикл напишет, а то в двух циклах сходу его переменными придавит... новичок лучше растет постепеееееено smile.gif
NeWT
Огромное всем спасибо за ответы!!! Но у меня всё-таки так ничего толком не получается. Как мне работать с этими словами ? как мне написать цикл поиска по этим словам? и т.д Наверно вопросы покажутся Вам очень глупые, но для меня пока это очень трудно – не понятно, я очень прошу Вас мне помочь!!!
volvo
NeWT
А на вопрос ответить не надо? Я во 2-ом посте спрашивал ...
NeWT
Извини...не заметил. Разделители удалять не надо!!!
volvo
NeWT
Что-то типа этого...
Код

Const
 Delimiters =
   ['/', '?', '.', ',', '<', ';', '>',
    ':', '"', '!', '''', '*', '%'];


Const
 s: String = 'stststsrtsrtsee>>!%rstrstrstrtkk%<<opopopop??';
 n = 2;
 substr: String = 'st';


Function GetFirstWord(s: String;
        Var Start, Finish: Byte): String;
 Begin
   Start := 1;
   While s[Start] In Delimiters Do
     Inc(Start);
   Finish := Start;
   While not (s[Finish] In Delimiters) Do
     Inc(Finish);

   GetFirstWord := Copy(s, Start, Finish - Start)
 End;

Function CountSubs(s, subs: String): Byte;
 Var
   p, count: Byte;
 Begin
   Count := 0;
   Repeat
     p := Pos(subs, s);
     If p <> 0 Then
       Begin
         Delete(s, p, Length(subs));
         Inc(count)
       End
   Until p = 0;
   CountSubs := count
 End;

Var
 iPos, wStart, wFinish: Byte;
 WordsDeleted: Byte;
 FirstWord: String;
begin
 iPos := 1; WordsDeleted := 0;
 Repeat
   FirstWord := GetFirstWord(Copy(s, iPos, Length(s)), wStart, wFinish);

   If FirstWord <> '' Then
     Begin
       If CountSubs(FirstWord, substr) = 3 Then
         Begin
           Delete(s, wStart, wFinish - wStart);
           Inc(WordsDeleted)
         End
       Else Inc(iPos, Pred(wFinish));

       If WordsDeleted = n Then Break
     End

 Until FirstWord = '';

 Writeln('Result string: ', s)
End.

Это выглядит непросто, я знаю. Но постарайся понять, что делает этот код...
NeWT
Большое спасибо!!! Это выглядит действительно не просто, но я обязательно постараюсь понять!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.