Реферат: Тип STRING
WHILE NOT(s[Length(s)] IN Letters) DO Delete(s,Length(s),1);
WRITELN('Слова текста :');
{ организуем цикл ПО СЛОВАМ }
WHILE s<>'' DO BEGIN
{ удалим лидирующие пробелы }
WHILE NOT(s[1] IN Letters) DO Delete(s,1,1);
{ найдем границу первого слова, здесь есть 1 ОШИБКА! }
i:=1; WHILE s[i] IN Letters DO INC(i);
{ i - номер первого пробела }
Dec(i);
{ выведем слово }
WRITELN(Copy(s,1,i));
{ удалим слово из текста }
Delete(s,1,i);
END;
END.
На первый взгляд наша программа работает правильно (мы ввели фразу на русском языке и получили все слова из нее), но тестирование программы обязательно должно включать все предельные, или особенные, случаи. Введем, например, строку, не содержащую никаких слов, и программа зациклится! Это результат ошибки в первом цикле: если в тексте нет букв, все символы из него будут удалены, длина строки станет равной нулю, и в дальнейшем станет проверяться символ с номером 0, который равен #0 и, естественно, не является буквой. Еще одна ошибка подобного рода может произойти при выделении последнего слова: мы увеличиваем индекс i, пока i-й символ - буква, и в конце концов дойдем до конца строки. Но переменная s всегда содержит 255 символов, символы с номерами Length(s)+1, Length(s)+2 и т.д. существуют, и нет никаких гарантий, что они не являются русскими буквами. В этом случае мы можем получить последнее слово с "хвостом". Исправим нашу программу:
VAR s : STRING; i : Byte;
CONST Letters : SET OF Char = ['а'..'п','р'..'я','А'..'Я']; {это алфавит}
BEGIN WRITE('Введите текст '); READLN(s);
{ удалим завершающие пробелы }
WHILE NOT(s[Length(s)] IN Letters)AND(s<>'') DO Delete(s,Length(s),1);
IF s='' THEN BEGIN WRITELN('текст пуст'); Halt; END;
WRITELN('Слова текста :');
{ организуем цикл ПО СЛОВАМ }
WHILE s<>'' DO BEGIN
{ удалим лидирующие пробелы }
WHILE NOT(s[1] IN Letters) DO Delete(s,1,1);
{ найдем границу первого слова }