![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
nataly |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Женский Репутация: ![]() ![]() ![]() |
Определить сколько слов длинной К символов находится в строке.К вводится с клавиатуры.
|
мисс_граффити |
![]()
Сообщение
#2
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
ровно 17.
помогла? -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
nataly |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 5 Пол: Женский Репутация: ![]() ![]() ![]() |
ровно 17. помогла? Это для любой строки так и для любого числа К? что-то не похоже на правду.. Дело в том,что я понимаю,что нужно сделать,но оформить не могу. Вот,например,предложение:"муха села на варенье,вот и всё стихотворенье" берём К=4,результат кол-во слов=2. То есть,нужно рассчитать длину каждого слова и сравнить с К,но как,ещё раз повторюсь,не знаю. |
Федосеев Павел |
![]()
Сообщение
#4
|
Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 481 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Если ты сама хочешь решить, то попробуй выделять слово в строке начиная с символа Istart так:
1. Просматриваем строку начиная с символа Istart. Пропускаем все ограничители слов - пробелы, точки, запятые. Их можно "заключить" во множество [' ', '.', ',', ':', ';']. Пока не "наткнёмся" на иной символ - букву или на конец строки. 2. Теперь мы находимся в начале слова. Начинаем просматривать его, пока не "наткнёмся" на ограничитель или на конец строки. 3. Теперь у нас есть конец слова. Зная индекс начала индекс конца слова можно вычислить его длину. Все эти действия удобно оформить процедурой или функцией. Результатов у неё будет два - длина слова и индекс последнего символа слова. Или как вариант, можно поискать по форуму или в его FAQ "готовую" подпрограмму выделения слов из строки. |
nataly |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 5 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо,но проблема как раз в том,что я крайне плохо владею Паскалем и могу сама оформить только подпрограмму,где будет высчитываться длина слова.
Если не сложно,можете на языке объяснить,как сделать счётчик,чтобы он проверял = ли длина слова символу К и если нет,то как его обнулить и продолжить проход? |
Федосеев Павел |
![]()
Сообщение
#6
|
Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 481 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Начни и покажи, что получается. Я бы тот алгоритм попробовал реализовать так (набирал прямо в браузере, поэтому возможны огрехи):
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" ![]() Сообщение отредактировано: Федосеев Павел - |
nataly |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 5 Пол: Женский Репутация: ![]() ![]() ![]() |
ух..а можно как-нибудь по-другому высчитать длину слова,ну там ord oт последнего символа?
|
Федосеев Павел |
![]()
Сообщение
#8
|
Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 481 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Ну, не знаю...
Например, "ёлка" и "палка". Последний символ в каждом слове - "а". И, если ord('а')=ord('а'), то длины этих слов слов одинаковы ![]() Это как "морской бой". Определил начало слова (корабля), определил конец и, вуаля: конец - начало = длина. Начинай составлять программу. В моём куске подпрограммы уже определяется начало следующего слова. По аналогии можно найти конец этого слова. В недостающем куске 3 или 4 строки. Попробуй... Покажи, хоть небольшие результаты. Наверняка, ввод строки, числа K и вывод результата (переменной CountWordK) уже реализован. Перебор всех слов в строке я привёл. Половина функции есть. Там осталось-то 5-6 строк+program+var+begin+end. |
Lapp |
![]()
Сообщение
#9
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Наташ, попробуй как-то вот так:
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 |
![]()
Сообщение
#10
|
Группа: Пользователи Сообщений: 5 Пол: Женский Репутация: ![]() ![]() ![]() |
Павел,спасибо вам огромное,но честно говоря,мне нет смысла продолжать,так как мы только начали обучаться Паскалю и функции с процедурами пока что тёмный лес,мне просто не поверят,что я сама такое смогла написать,остаётся только распечатать ваш труд да и в рамочку,будет к чему стремится!
![]() |
-Федосеев Павел- |
![]()
Сообщение
#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.
|
Гость |
![]()
Сообщение
#12
|
Гость ![]() |
Жаль... Ну, в рамку - так в рамку...
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.
трогательно как..спасибо ![]() |
![]() ![]() |
![]() |
Текстовая версия | 19.04.2025 16:56 |