нормально делай нормально будет.
Что-то я совсем запуталась со строками в Паскале.
Задание: Дан текст, определить кол-во слов "кот".
Здесь нужно использовать pos, так?
Я запуталась в работе этой функции.
p:='kot';
If m:=pos(p,stroka)
Значением m будет номер позиции, в кот. начинается совпадение, так?
Значит теперь мне надо узнать, kot это часть слова или целое.. то есть If a[i-1]=' ' итд.. значит надо было перед pos включать цикл?
Короче говоря, кому не сложно, напишите мне код программы полностью, а то у меня куча подобных задач, а я торможу.
Задание: Дан текст, определить кол-во слов "кот".
Здесь нужно использовать pos, так?
Я запуталась в работе этой функции.
p:='kot';
If m:=pos(p,stroka)
Значением m будет номер позиции, в кот. начинается совпадение, так?
Значит теперь мне надо узнать, kot это часть слова или целое.. то есть If a[i-1]=' ' итд.. значит надо было перед pos включать цикл?
Короче говоря, кому не сложно, напишите мне код программы полностью, а то у меня куча подобных задач, а я торможу.
-
-
22.04.2010 в 19:54Вот алгоритм:
1) stroks := <пробел>+stroka+<пробел>;
2) pos('<пробел>кот<пробел>', stroka);
3) если pos>0, то нашли подстроку. Отрезаем от левого края stroka найденное слово и увеличиваем счетчик слов на единицу.
4) если pos>0, то повторяем с пункта 2
<пробел> - это символ пробела, тело цикла состоит из 4 строчек.
Эти задачи вряд ли имеют практическое значение, и, скорее всего, учебные. Если не потратите время на их решение - более сложные алгоритмы не освоите.
Опять-таки попробуйте пока решить самостоятельно - а не получится - скажите, и я скину листинг.
-
-
22.04.2010 в 21:14-
-
22.04.2010 в 21:17да, я уже уточнила, предполагается, что слова разделены только пробелами
mr Gray
окей, спасибо, я попробую
-
-
23.04.2010 в 03:18my @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Я и не старался сделать алгоритм, расчитанный на мегабайты текста. Искал что попроще для новичка, а еще понравилась идея поиска без if.
array[char, char, char] of integer; примерно 34 мб для _int16. Олимпиада явно не та turbo pascal и dos проводилась
А еще лучше комбинировать массив char и машинную команду сравнения цепочки байт (pos ее использует, поэтому работает быстрее for при прочих равных условиях). ИМХО это было бы самым быстрым решением.