Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите решить задачку на строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
wary
Условие: Дана строка символов. Дано слово (например "окно"). Удалить из заданной изначально строки слово "окно"

Алгоритм решения, который я придумал:

1. Определяем как константу слово "окно" (slovo_okno)
2. Вводим произвольную строку (st1)
3. Курабасим в цикле строку (st1) и выявляем в ней слово "окно"
4. Удаляем выявленно слово "окно"
5. Выводим на экран то что осталось от строки (st1)

Поскольку я новичок в паскале, немного трудновато с описание п.3 и п.4.

Если не трудно подскажите код как их описать, а также замечания по алгоритму.

Заранее всем спасибо! huh.gif
мисс_граффити
ну... при очень большом желании можно и так...
а вообще есть ф-ция
Цитата
Pos(SubS, s : string) : byte - Ищет вхождение подстроки SubS в s и возвращает номер первого символа SubS в s, или 0, если s не содержит SubS

потом - процедура
Цитата
Delete(VAR s : String; start, len : Integer) - Удалает подстроку длиной len начиная с позиции start строки s

Длину ты знаешь, положение тоже нашел.
Вот и вся твоя задача smile.gif
volvo
Цитата
Длину ты знаешь, положение тоже нашел.
Не забыть проверять только, что найденный кусок текста действительно является словом, а не его частью, ибо на этом ОЧЕНЬ просто погореть:

"Я стоял перед окном"
Pos найдет, Delete удалит без сомнения... Что получим?
Bokul
 var s,word:string; b:boolean; buf:byte;
begin
writeln('Enter string');
readln(s);
writeln('Enter word');
readln(word);
b:=true;
if s=word then
s:=''
else
repeat
if copy(s,1,length(word)+1)=word+' ' then
delete(s,1,length(word));
if copy(s,length(s)-length(word),length(word)+1)=' '+word then
delete(s,length(s)-length(word)+1,length(word));
buf:=pos(' '+word+' ',s);
if buf<>0 then
delete(s,buf+1,length(word))
else
b:=false;
until b=false;
writeln('Result :');
writeln(s);
readln;
end.
Lapp
Bokul, у меня под рукой нет компилятора, чтоб проверить, но в целом работать должно.
Замечания же такие:

1. Слова могут быть отделены не только пробелами, но и знаки препинания (,.!? ...), и в этом случае твоя прога потребует значительных изменений..

2. Зачем тебе переменная b? Не проще ли просто заканчивать так:
until buf=0;
?

3. Если уж у тебя есть булева переменная, то зачем устраивать ее сравнение? Иначе говоря, вместо
until b=false;
лучше писать так:
until not b;

Ну и последнее.. Тут явно напрашивается процедура вроде GetNextWord, которая искала бы следующее слово, начинаяя с заданной позиции, и выдавала бы его начальную позицию и длину. Затем ты мог бы проверить, совпадает ли оно с заданным. Такая процедурка могла бы тебе пригодится и в дальнейшем при лексическом анализе smile.gif.
Гость
Bokul программка почему-то не работает....а обзывается инвалидом...
Lapp
Цитата(Гость @ 21.10.2006 14:23) *

Bokul программка почему-то не работает....а обзывается инвалидом...

Нельзя ли чуть подробнее? На каком этапе ошибка? и само сообщение поточнее.
Я прогнал, вроде работает..
Смотри сам:

■ Free Pascal IDE Version 1.0.6 [2005/11/26]
■ Compiler Version 2.0.2
■ GBD Version GDB 6.2.1
■ Cygwin "C:\FPC\2.0.2\bin\i386-win32\cygwin1.dll" version 1005.12.0.0
Running "c:\home\home\ak\pas\th\th011\th011.exe "
Enter string
asdf ghjk zxcvb qwer tyui asdf wert
Enter word
asdf
Result :
ghjk zxcvb qwer tyui wert
volvo
Цитата(lapp @ 21.10.2006 12:43)
Я прогнал, вроде работает..
Аналогично - в Turbo Pascal 7.0 и Virtual Pascal 2.1 ...

Гость, какой у тебя компилятор?
wary
Огромное всем спасибо, задача тщательно разобрана (с моей стороны с помощью ваших ответов) и решена good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.