нормально делай нормально будет.
Что-то я совсем запуталась со строками в Паскале.
Задание: Дан текст, определить кол-во слов "кот".
Здесь нужно использовать pos, так?
Я запуталась в работе этой функции.

p:='kot';
If m:=pos(p,stroka)

Значением m будет номер позиции, в кот. начинается совпадение, так?
Значит теперь мне надо узнать, kot это часть слова или целое.. то есть If a[i-1]=' ' итд.. значит надо было перед pos включать цикл?

Короче говоря, кому не сложно, напишите мне код программы полностью, а то у меня куча подобных задач, а я торможу.

@темы: Вопрос

Комментарии
22.04.2010 в 19:54

Savka.
Вот алгоритм:
1) stroks := <пробел>+stroka+<пробел>;
2) pos('<пробел>кот<пробел>', stroka);
3) если pos>0, то нашли подстроку. Отрезаем от левого края stroka найденное слово и увеличиваем счетчик слов на единицу.
4) если pos>0, то повторяем с пункта 2

<пробел> - это символ пробела, тело цикла состоит из 4 строчек.

Эти задачи вряд ли имеют практическое значение, и, скорее всего, учебные. Если не потратите время на их решение - более сложные алгоритмы не освоите.

Опять-таки попробуйте пока решить самостоятельно - а не получится - скажите, и я скину листинг.
22.04.2010 в 21:14

Псих
mr Gray, а пробелы то зачем добавлять? Ведь если строка будет "У меня есть кот. Его зовут Барсик.", то подстрока " кот " не найдётся.
22.04.2010 в 21:17

нормально делай нормально будет.
Crazy Wizard
да, я уже уточнила, предполагается, что слова разделены только пробелами
mr Gray
окей, спасибо, я попробую
23.04.2010 в 03:18

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
Юзайте скриптовые языки))

my @q = $s =~ m/(^|\s)kot/g;
print 0+@q;

А если серьёзно, то реши вначале задачу проще, посчитать количество букв "А". или что нибудь такое.

mr Gray, Ваш алгоритм работает за квадрат на длину подстроки. Т.е. O(n^3) в худшем случае. Зачем? можно свести к квадрату, не вырезая ничего из исходной строчки. ИМХО не надо приучать людей к этим ужасным функциям insert и delete.

Кстати могу предложить очень интересное почти олимпиадное решение. В данном случае паттерн длиной всего в 3. поэтому заводим массив такой:

counts: array[char, char, char] of integer;
далее делаем так:

s := ' ' + s + ' ';

for i := 1 to length(s) - 4 do
if (s[i] = ' ' ) and (s[i+4] = ' ') then
inc(q[s[i+1], s[i+2], s[i+3]]);

write(q['k', 'o', 't']]);

т.е. мы подсчитали всевозможные паттерны отделённые пробелами состоящие из трёх букв. и выдали 'kot'
23.04.2010 в 09:21

[revolver]
Я и не старался сделать алгоритм, расчитанный на мегабайты текста. Искал что попроще для новичка, а еще понравилась идея поиска без if.

array[char, char, char] of integer; примерно 34 мб для _int16. Олимпиада явно не та turbo pascal и dos проводилась :) Но если без массива, то метод быстрее моего, и память не будет занимать.

А еще лучше комбинировать массив char и машинную команду сравнения цепочки байт (pos ее использует, поэтому работает быстрее for при прочих равных условиях). ИМХО это было бы самым быстрым решением.