Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите со строками,пожалуйста
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.