Реферат: Тип STRING
END.
Наша программа заменила цифры, но никаких "?" не добавила. Дело в том, что, обращаясь к элементам строки, невозможно изменить текущую длину строки. Второй цикл нашей программы сработал правильно, записав символы "?" в соответствующие элементы строки, но длина строки осталась прежней, и процедура WRITELN вывела только символы с 1-го по L-й. Чтобы решить задачу корректно, мы могли бы добавить в программу один оператор INC(s[0],3); но, конечно, лучше всего просто записать: s:=s+'???'; .
Для обработки строк в Паскале существует несколько стандартных функций и процедур :
1. FUNCTION Length(S: String): Integer; - возвращает длину строки.
2. FUNCTION Concat(S1[,S2,...,Sn]: String): String; - возвращает строку, полученную сцеплением аргументов, может использоваться вместо операции "+".
3. FUNCTION Pos(Substr: String; S: String): Byte; - возвращает номер первого слева символа строки S, начиная с которого строка Substr входит в S, если Substr не входит в S, то значение функции равно 0.
4. FUNCTION Copy(S: String; Index: Integer; Count: Integer): String; - возвращает подстроку строки S, которая начинается с символа с номером Index и имеет длину Count.
5. PROCEDURE Delete(VAR S: String; Index: Integer; Count:Integer); - удаляет из строки S подстроку, начинающуюся с символа с номером Index и имеющую длину Count.
6. PROCEDURE Insert(Substr: String; VAR S: String; Index: Integer); - вставляет в строку S подстроку Substr начиная с символа с номером Index.
Из вышеизложенного понятно, что процедуры и функции могут иметь параметры типа STRING (что неудивительно), но также допустимы функции типа STRING, хотя это и не скалярный тип. Еще две стандартные процедуры предназначены для перевода строки в число и числа в строку:
7. PROCEDURE Val(S: STRING;VAR V; VAR Code: Integer); - преобразует строку S в число V (если это возможно); V - любая переменная арифметического типа, переменная Code возвращает 0, если преобразование прошло успешно, или номер первого неправильного символа строки.
8. PROCEDURE Str(X [: Width [: Decimals ]];VAR S:STRING); - преобразует произвольное арифметическое выражение X в строку S, параметры Width и Decimals позволяют форматировать строку и имеют такой же смысл, как и в процедуре WRITE[LN] .
Теперь, зная процедуру Val, вы можете организовать надежный ввод числовых данных в любой своей программе. Предположим, что программа должна вводить вещественное значение F. Мы можем записать это так :
VAR F : Real; ... BEGIN WRITE('Введите F '); READ(F);
Если пользователь правильно введет число, то все будет в порядке, но если он ошибочно нажмет не ту клавишу (например, запятую вместо точки и т.п.), то произойдет аварийное прерывание, программа завершится, и на экране появится сообщение "Run-time error ...". Программы, таким образом реагирующие на неверный ввод, - плохие! Хорошая программа обязана обрабатывать нажатие практически любых клавиш в любых комбинациях. Мы вполне способны написать такую программу :
VAR F : Real; S : STRING; Code : Integer; ...
BEGIN REPEAT
WRITE('Введите F '); READLN(S);
Val(S,F,Code); IF Code=0 THEN Break;
WRITELN('Ошибка ввода!');
UNTIL FALSE;
Решим часто встречающуюся задачу о распаковке текста: дана строка, содержащая текст на русском языке (или на любом другом языке, в том числе и искусственном - вы увидите, что это не принципиально); нужно выделить слова, содержащиеся в этом тексте. Хотя эта задача и элементарна, ее решение не столь тривиально и требует предварительной разработки алгоритма. Сначала уясним, что такое текст. Текстом будем называть последовательность слов, разделенных любым количеством "пробелов". Слова - это последовательности букв языка (в нашем случае - русских букв), "пробелы" - любые символы, не являющиеся буквами. Итак, наш текст в общем случае имеет вид : *X*X...*X* , где X - слово, * - "пробел". Можно предложить следующий алгоритм распаковки:
1) удалим завершающие пробелы, после чего текст примет регулярный вид *X*X...*X;
2) удалим лидирующие пробелы;
3) выделим первое слово и удалим его из текста.
После выполнения пунктов 2 и 3 мы получили одно слово и текст стал короче на одно слово, сохранив при этом свою структуру. Очевидно, что пункты 2 и 3 следует выполнять до тех пор, пока текст не пуст. Запишем программу, реализующую этот алгоритм.
VAR s : STRING; i : Byte;
CONST Letters : SET OF Char = ['а'..'п','р'..'я','А'..'Я']; {это алфавит}
BEGIN WRITE('Введите текст '); READLN(s);