Реферат: Тип 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);

{ найдем границу первого слова }

К-во Просмотров: 368
Бесплатно скачать Реферат: Тип STRING