Для решения этой задачи на языке Pascal наиболее эффективным подходом является перебор строки посимвольно с накоплением текущей длины слова. Когда встречается пробел или конец строки, мы сравниваем накопленную длину с искомым значением. Ниже представлен полный код программы с подробными комментариями. Программа на Pascal (Free Pascal / Delphi) pascal
program CountWordsByLength; var inputString: string; targetLength, currentWordLength, wordCount, i: integer; begin // Ввод исходных данных writeln('Введите строку:'); readln(inputString); writeln('Введите искомую длину слова:'); readln(targetLength); // Инициализация переменных wordCount := 0; currentWordLength := 0; // Добавляем пробел в конец строки, чтобы корректно обработать последнее слово inputString := inputString + ' '; for i := 1 to length(inputString) do begin // Если текущий символ не пробел, увеличиваем счетчик длины слова if inputString[i] <> ' ' then begin currentWordLength := currentWordLength + 1; end else begin // Если встретили пробел, проверяем длину законченного слова if currentWordLength = targetLength then begin wordCount := wordCount + 1; end; // Сбрасываем длину слова для следующей итерации currentWordLength := 0; end; end; // Вывод результата writeln('Количество слов длины ', targetLength, ': ', wordCount); readln; end. Use code with caution.Разбор алгоритма- Обработка последнего слова: Самая частая ошибка — забыть обработать последнее слово, если за ним не следует пробел. В данном коде мы искусственно добавляем пробел к строке
inputString := inputString + ' ', чтобы условиеif inputString[i] <> ' 'сработало как триггер завершения слова для всех элементов. - Счетчик длины: Переменная
currentWordLengthувеличивается на единицу каждый раз, когда встречается любой символ, отличный от пробела. - Сравнение: Как только программа натыкается на пробел, она сверяет
currentWordLengthсtargetLength. Если они равны, инкрементируется общий счетчикwordCount. - Устойчивость к пробелам: Данный алгоритм корректно обрабатывает ситуацию с несколькими пробелами подряд. В этом случае
currentWordLengthбудет равен 0, что не совпадет сtargetLength(если искомая длина больше нуля), и лишние срабатывания исключаются.
Альтернативный метод (через функцию Pos и Copy) Если вы используете современный диалект Pascal, можно разбивать строку на подстроки, используя пробел как разделитель, однако посимвольный перебор, представленный выше, является классическим и наиболее производительным решением для учебных задач. Я могу помочь вам переписать этот код с использованием встроенных функций обработки строк (например, Split), если вы используете среду Lazarus или Delphi. Хотите рассмотреть такой вариант?