IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите со строками,пожалуйста
nataly
сообщение 8.02.2012 21:57
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Определить сколько слов длинной К символов находится в строке.К вводится с клавиатуры.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 10.02.2012 23:14
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
nataly
сообщение 11.02.2012 20:14
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Цитата(мисс_граффити @ 11.02.2012 0:14) *

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



Это для любой строки так и для любого числа К?
что-то не похоже на правду..
Дело в том,что я понимаю,что нужно сделать,но оформить не могу.
Вот,например,предложение:"муха села на варенье,вот и всё стихотворенье"
берём К=4,результат кол-во слов=2.
То есть,нужно рассчитать длину каждого слова и сравнить с К,но как,ещё раз повторюсь,не знаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 11.02.2012 21:09
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  8  +


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

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

Или как вариант, можно поискать по форуму или в его FAQ "готовую" подпрограмму выделения слов из строки.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
nataly
сообщение 11.02.2012 21:46
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Спасибо,но проблема как раз в том,что я крайне плохо владею Паскалем и могу сама оформить только подпрограмму,где будет высчитываться длина слова.
Если не сложно,можете на языке объяснить,как сделать счётчик,чтобы он проверял = ли длина слова символу К и если нет,то как его обнулить и продолжить проход?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 11.02.2012 23:26
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  8  +


Начни и покажи, что получается. Я бы тот алгоритм попробовал реализовать так (набирал прямо в браузере, поэтому возможны огрехи):
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

Сообщение отредактировано: Федосеев Павел - 11.02.2012 23:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
nataly
сообщение 12.02.2012 19:53
Сообщение #7





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


ух..а можно как-нибудь по-другому высчитать длину слова,ну там ord oт последнего символа?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 12.02.2012 21:19
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  8  +


Ну, не знаю...
Например, "ёлка" и "палка". Последний символ в каждом слове - "а". И, если ord('а')=ord('а'), то длины этих слов слов одинаковы blink.gif .

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

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

Попробуй...

Покажи, хоть небольшие результаты. Наверняка, ввод строки, числа K и вывод результата (переменной CountWordK) уже реализован. Перебор всех слов в строке я привёл. Половина функции есть. Там осталось-то 5-6 строк+program+var+begin+end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 13.02.2012 6:22
Сообщение #9


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Наташ, попробуй как-то вот так:
  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 сделай сама. Если будут трудности - спрашивай.
Успехов тебе.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
nataly
сообщение 13.02.2012 10:52
Сообщение #10





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Павел,спасибо вам огромное,но честно говоря,мне нет смысла продолжать,так как мы только начали обучаться Паскалю и функции с процедурами пока что тёмный лес,мне просто не поверят,что я сама такое смогла написать,остаётся только распечатать ваш труд да и в рамочку,будет к чему стремится! rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
-Федосеев Павел-
сообщение 13.02.2012 12:31
Сообщение #11


Гость






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

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 16:39
Сообщение #12


Гость






Цитата(-Федосеев Павел- @ 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
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"