Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите со строками,пожалуйста
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
nataly
Определить сколько слов длинной К символов находится в строке.К вводится с клавиатуры.
мисс_граффити
ровно 17.
помогла?
nataly
Цитата(мисс_граффити @ 11.02.2012 0:14) *

ровно 17.
помогла?



Это для любой строки так и для любого числа К?
что-то не похоже на правду..
Дело в том,что я понимаю,что нужно сделать,но оформить не могу.
Вот,например,предложение:"муха села на варенье,вот и всё стихотворенье"
берём К=4,результат кол-во слов=2.
То есть,нужно рассчитать длину каждого слова и сравнить с К,но как,ещё раз повторюсь,не знаю.
Федосеев Павел
Если ты сама хочешь решить, то попробуй выделять слово в строке начиная с символа Istart так:
1. Просматриваем строку начиная с символа Istart. Пропускаем все ограничители слов - пробелы, точки, запятые. Их можно "заключить" во множество [' ', '.', ',', ':', ';']. Пока не "наткнёмся" на иной символ - букву или на конец строки.
2. Теперь мы находимся в начале слова. Начинаем просматривать его, пока не "наткнёмся" на ограничитель или на конец строки.
3. Теперь у нас есть конец слова. Зная индекс начала индекс конца слова можно вычислить его длину.

Все эти действия удобно оформить процедурой или функцией. Результатов у неё будет два - длина слова и индекс последнего символа слова.

Или как вариант, можно поискать по форуму или в его FAQ "готовую" подпрограмму выделения слов из строки.
nataly
Спасибо,но проблема как раз в том,что я крайне плохо владею Паскалем и могу сама оформить только подпрограмму,где будет высчитываться длина слова.
Если не сложно,можете на языке объяснить,как сделать счётчик,чтобы он проверял = ли длина слова символу К и если нет,то как его обнулить и продолжить проход?
Федосеев Павел
Начни и покажи, что получается. Я бы тот алгоритм попробовал реализовать так (набирал прямо в браузере, поэтому возможны огрехи):
TYPE
{тип для набора ограничителей слов в строке}
TCharSet=Set of Char;
CONST
{Список всех ограничителей слов в строке}
Delim_Set : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];
..................................................................

{Нахождение длины слова из строки Src.
Поиск слова начинается с позиции StartPos.
На выходе не только длина очередного слова, но и переменная StartPos
указывает на следующий за словом символ.
Если слово не найдено, то StartPos=Length(Src)+1.}
FUNCTION GetLengthNextWord(CONST Src : String;
VAR StartPos : Integer;
CONST Delimiters : TCharSet):Integer;
VAR
i : Integer;
BEGIN
i:=StartPos;
{i-текущая позиция в анализируемой строке}
{ищем первую букву слова}
while (i<=Length(Src)) do
if (Src[i] in Delimiters)
then Inc(i)
else Break;
StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
{теперь просматриваем слово пока не закончится строка или
не начнутся ограничители слов}
.............................................................................
GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}
StartPos:=i;{для дальнейшего использования}
END;

..................
CountWordK:=0; {счётчик количества слов длиной K}
StartPos:=1; {слово в строке s начинаем с 1-й позиции}
while StartPos<=Length(s) do {пока не закончились слова в строке}
if GetLengthNextWord(s, StartPos, Delim_Set)=K
then Inc(CountWordK); {если длина очередного слова равна K, то инкрементируем счётчик}
..................


Это не законченный кусок, а скорее попытка реализации...

Ух, почти по-немецки "GetLengthNextWord" smile.gif
nataly
ух..а можно как-нибудь по-другому высчитать длину слова,ну там ord oт последнего символа?
Федосеев Павел
Ну, не знаю...
Например, "ёлка" и "палка". Последний символ в каждом слове - "а". И, если ord('а')=ord('а'), то длины этих слов слов одинаковы blink.gif .

Это как "морской бой". Определил начало слова (корабля), определил конец и, вуаля: конец - начало = длина.

Начинай составлять программу. В моём куске подпрограммы уже определяется начало следующего слова. По аналогии можно найти конец этого слова. В недостающем куске 3 или 4 строки.

Попробуй...

Покажи, хоть небольшие результаты. Наверняка, ввод строки, числа K и вывод результата (переменной CountWordK) уже реализован. Перебор всех слов в строке я привёл. Половина функции есть. Там осталось-то 5-6 строк+program+var+begin+end.
Lapp
Наташ, попробуй как-то вот так:
  count:= 0;
while Length(s)>0 do begin
l:= Pos(' ');
if l=0 then l:= Length(s)+1;
if l=k+1 then Inc(count);
Delete(s,1,l)
end;
writeln('total number of ',k,'-letter words is ',count);

Тут в качестве разделителей между словами допускается только пробел. Если тебе нужно, чтоб были допустимы знаки препинания - говори (в условии про это ничего нет).
Ввод строки и числа k сделай сама. Если будут трудности - спрашивай.
Успехов тебе.
nataly
Павел,спасибо вам огромное,но честно говоря,мне нет смысла продолжать,так как мы только начали обучаться Паскалю и функции с процедурами пока что тёмный лес,мне просто не поверят,что я сама такое смогла написать,остаётся только распечатать ваш труд да и в рамочку,будет к чему стремится! rolleyes.gif
-Федосеев Павел-
Жаль...
Ну, в рамку - так в рамку...

PROGRAM VRamku;
TYPE
{тип для набора ограничителей слов в строке}
TCharSet=Set of Char;
CONST
{Список всех ограничителей слов в строке}
Delim_Set : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];

{Нахождение длины слова из строки Src.
Поиск слова начинается с позиции StartPos.
На выходе не только длина очередного слова, но и переменная StartPos
указывает на следующий за словом символ.
Если слово не найдено, то StartPos=Length(Src)+1.}
FUNCTION GetLengthNextWord(CONST Src : String;
VAR StartPos : Integer;
CONST Delimiters : TCharSet):Integer;
VAR
i : Integer;
BEGIN
i:=StartPos;
{i-текущая позиция в анализируемой строке}
{ищем первую букву слова}
while (i<=Length(Src)) do
if (Src[i] in Delimiters)
then Inc(i)
else Break;
StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
{теперь просматриваем слово пока не закончится строка или
не начнутся ограничители слов}
while (i<=Length(Src)) do
if NOT(Src[i] in Delimiters)
then Inc(i)
else Break;
GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}

{$IFDEF Debug}
{Строка для отладки функции}
if (i<>StartPos) then
WriteLn((i-StartPos):3, ' - ', Copy(Src, StartPos, i-StartPos));
{$ENDIF}

StartPos:=i;{для дальнейшего использования}
END;

VAR
s : String;
CountWordK : Integer;
K : Integer;
StartPos : Integer;
BEGIN
K:=4;
s:='Фраза для проверки работы функции - она такая... внезапная и длинная!';
CountWordK:=0; {счётчик количества слов длиной K}
StartPos:=1; {слово в строке s начинаем с 1-й позиции}
while StartPos<=Length(s) do {пока не закончились слова в строке}
if GetLengthNextWord(s, StartPos, Delim_Set)=K
then Inc(CountWordK); {если длина очередного слова равна K, то инкрементируем счётчик}

WriteLn('Количество слов длиной ', K, ' символа(ов) в строке: ', CountWordK);

END.

Гость
Цитата(-Федосеев Павел- @ 13.02.2012 12:31) *

Жаль...
Ну, в рамку - так в рамку...

PROGRAM VRamku;
TYPE
{тип для набора ограничителей слов в строке}
TCharSet=Set of Char;
CONST
{Список всех ограничителей слов в строке}
Delim_Set : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];

{Нахождение длины слова из строки Src.
Поиск слова начинается с позиции StartPos.
На выходе не только длина очередного слова, но и переменная StartPos
указывает на следующий за словом символ.
Если слово не найдено, то StartPos=Length(Src)+1.}
FUNCTION GetLengthNextWord(CONST Src : String;
VAR StartPos : Integer;
CONST Delimiters : TCharSet):Integer;
VAR
i : Integer;
BEGIN
i:=StartPos;
{i-текущая позиция в анализируемой строке}
{ищем первую букву слова}
while (i<=Length(Src)) do
if (Src[i] in Delimiters)
then Inc(i)
else Break;
StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
{теперь просматриваем слово пока не закончится строка или
не начнутся ограничители слов}
while (i<=Length(Src)) do
if NOT(Src[i] in Delimiters)
then Inc(i)
else Break;
GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}

{$IFDEF Debug}
{Строка для отладки функции}
if (i<>StartPos) then
WriteLn((i-StartPos):3, ' - ', Copy(Src, StartPos, i-StartPos));
{$ENDIF}

StartPos:=i;{для дальнейшего использования}
END;

VAR
s : String;
CountWordK : Integer;
K : Integer;
StartPos : Integer;
BEGIN
K:=4;
s:='Фраза для проверки работы функции - она такая... внезапная и длинная!';
CountWordK:=0; {счётчик количества слов длиной K}
StartPos:=1; {слово в строке s начинаем с 1-й позиции}
while StartPos<=Length(s) do {пока не закончились слова в строке}
if GetLengthNextWord(s, StartPos, Delim_Set)=K
then Inc(CountWordK); {если длина очередного слова равна K, то инкрементируем счётчик}

WriteLn('Количество слов длиной ', K, ' символа(ов) в строке: ', CountWordK);

END.





трогательно как..спасибо rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.