- •Обработка символьной информации в Объектном Паскале
- •КЛАССИФИКАЦИЯ ДАННЫХ ПО ТИПУ
- •СИМВОЛЬНЫЕ ДАННЫЕ
- •ПРЕДСТАВЛЕНИЕ СИМВОЛЬНЫХ ДАННЫХ В ПАМЯТИ ЭВМ
- •ASCII
- •ПРЕДСТАВЛЕНИЕ СИМВОЛЬНЫХ ДАННЫХ В ПАМЯТИ ЭВМ
- •Объявление символьных переменных в Объектном Паскале
- •Символьный тип - порядковый
- •Функция UPCASE
- •Символьная константа
- •Массивы символов
- •ПРЕДСТАВЛЕНИЕ СИМВОЛЬНЫХ ДАННЫХ В ПАМЯТИ ЭВМ
- •Тип String Турбо Паскаля (ShortString Объектного Паскаля)
- •Строковые типы Объектного Паскаля
- •Пример 1. Вычислить количество слов в строке.
- •начало
- •Пример 2. Удалить из текста все заглавные латинские буквы.
- •Функции, работающие со строками
- •Процедуры, работающие со строками
- •Задача обработки данных сложной структуры, представленных в виде таблицы
- •Шаги обработки строки таблицы
- •Определить самый дорогой конструктор для детей в возрасте до семи лет и его
- •BEGIN
- •При обработке таблиц большого объема эта программа имеет, по крайней мере, два недостатка:
Массивы символов
Var L,LP: array[1..10] of char;
1)предполагается посимвольная обработка (искл.: присваивание, сравнение массивов одинаковой длины, ввод допустимо осуществлять одним оператором; например, L:=‘ ABC’ )
2)! отслеживание длины массивов возлагается на программиста => необходим специальный тип
для обработки последовательностей символов, строковый тип.
ПРЕДСТАВЛЕНИЕ СИМВОЛЬНЫХ ДАННЫХ В ПАМЯТИ ЭВМ
ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ - СТРОКИ:Первый элемент строки хранит ее текущую длину:
0 1 |
n-1 Классический |
|
|
|
подход |
|
|
Паскаля (тип |
|
символы строки |
string ТП, |
|
shortstring ОП) |
|
длина |
строки |
|
Конец строки отмечается специальным символом:
Классический |
0 1 |
n-1 |
||
|
0 |
|
||
подход Си, |
|
|
||
тип Pchar |
|
|
|
|
Паскаля |
символы строки |
|
|
|
нуль-терминатор |
||||
|
Строка из (n-1) символов занимает n байт
Тип String Турбо Паскаля (ShortString Объектного Паскаля)
•Переменные этих типов принимают значения на множестве строк символов переменной длины (каждый символ имеет тип char), при описании указывается максимальная длина. Например:
Const M=20;
Var LS: string[М]; {M-максимальная длина строки}
•М <= 255; если М при описании не указано (отсутствует вместе с квадратными скобками), то по умолчанию М=255.
•Для хранения строки требуется (M+1) байт.
•Допустимо в программе обращаться к любому элементу строки, в том числе к нулевому: LS[i] - i-й элемент строки LS, i=0,1,2,...,M.
•Выражение ORD(LS[0]) дает текущую длину строки; кроме того, для определения текущей длины строки в имеется встроенная функция LENGTH.
•Ввод, вывод, присваивание выполняются не поэлементно, а одним оператором, т.е. допустимы операторы READ(LS); WRITE(LS); LS:='123'.
•Для строк определены операции сравнения. Они сравниваются посимвольно, слева направо. Большей считается строка, в которой больше код первого слева несовпадающего символа. Если строки имеют разную длину, то короткая строка дополняется справа символами CHR(0). Напомним, что, в отличие от строк, массивы символов можно сравнивать, только если они имеют одинаковую длину.
•Память под переменные этих типов распределяется статически.
Строковые типы Объектного Паскаля
•Тип ShortString эквивалентен типу string Турбо Паскаля.
•Данные типа AnsiString (могут содержать до 231 символов типа char.
•Тип WideString соответствует строкам максимальной длины до 230 символов типа widechar.
•Тип String: при {$H+} - AnsiString (по умолчанию), при {$H+} –
ShortString.
•Типы AnsiString и WideString - ссылочные, динамические, типы; они имеют 8 служебных байтов (вместо одного нулевого у ShortString): служебные байты содержат длину строки и ссылку на строку в динамической памяти (куче).
•Объектный Паскаль разрешает для определения длины строки использовать только функцию LENGTH, а для установления нового значения длины только процедуру
SetLength(строка, новая_длина_строки)
•Если для обработки строк используются встроенные подпрограммы, то длина строки отслеживается автоматически, иначе программист должен использовать SetLength.
Пример 1. Вычислить количество слов в строке.
Под словом понимается группа символов, не содержащая пробелов.
Слова могут разделяться одним или несколькими пробелами.
Состав данных
Имя |
Смысл |
Тип |
Структура |
|
|
Исходные данные |
|
pr |
заданная строка |
|
строка |
|
|
Выходные данные |
|
k |
количество слов |
целый |
простая переменная |
|
|
Промежуточные данные |
|
i |
номер первого символа |
целый |
простая переменная |
|
пары |
|
|
n |
текущая длина строки |
целый |
простая переменная |
начало
Алгоритм |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
Ввод |
|
|
|
|
|
|
|
|
|||||||||||||
вычисления |
|
|
|
|
|
|
|
|
|
|||||||||||||
|
строки pr |
|
|
|
|
|
|
|
|
|||||||||||||
числа слов в |
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
n:=length(pr) |
|
|
|
|
|
|
|
|
|
||||||||||||
строке |
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k:=0; i:=1; |
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нет |
|
|
||||
|
|
|
|
|
|
|
|
i n- |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
не |
(pr[i] ' ')и |
|
|
|
д |
|
|
||||||||||
|
|
|
|
|
т |
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
а |
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
(pr[i+1]= ' ') |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
k:=k+ |
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
i:=i+1 |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да
pr[n] ' '
k:=k+
1
Вывод k
program nwd;
var pr:string; {исходная
последовательность символов} n,i,k:integer;{n-длина
последовательности, k-число слов,
i-cчетчик символов}
BEGIN writeln(‘input pr’ ); readln(pr); n:=length(pr); k:=0;
for i:=1 to n-1 do
if (pr[i]<>' ') and (pr[i+1]=' ') then k:=k+1;
if pr[n]<>' ' then k:=k+1; writeln(' ЧИСЛО СЛОВ РАВНО ',k); readln
END.
конец
Пример 2. Удалить из текста все заглавные латинские буквы.
program dlt;{удаляет из стpоки s заглавные латинские буквы}
Var s :String; n: Integer;{текущая длина стpоки} i,j: Integer;{счетчики элементов стpоки}
Begin Writeln(' Введите стpоку текста '); Readln(s); n:=Length(s); i:=1;
Repeat
while (i<=n) and not ((s[i]>='A') and (s[i]<='Z')) do i:=i+1;
{по окончании цикла while i-номеp пеpвой слева заглавной буквы}
If i<=n Then Begin
If i<n Then
For j:=i to n-1 do {все символы, начиная с (i+1)-го,} s[j]:=s[j+1]; {сдвигаются на одну позицию влево} s[0]:=CHR(n-1); {необходимо изменить длину стpоки}
{Object Pascal: вместо предыдущего оператора SetLength(s,n-1)} n:=n-1;
End; Until i>n;
WriteLn(' Измененная стpока'); Writeln(s); End.
Функции, работающие со строками
•CONCAT(S1 ,S2,...,SN)-функция типа STRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметров S1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +.
•COPY(ST,INDEX,COUNT)-функция типа STRING; копирует из строки ST COUNT символов, начиная с символа с номером
INDEX.
•LENGTH(ST)-функция типа INTEGER; возвращает длину строки
ST.
•POS(SUBST,ST)-функция типа INTEGER; отыскивает в строке ST первое вхождение подстроки SUBST и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль.
Процедуры, работающие со строками
•DELETE(ST,INDEX,COUNT)-удаление COUNT символов из строки
ST, начиная с символа с номером INDEX.
•INSERT(SUBST, ST, INDEX) - вставка подстроки SUBST в
строку ST, начиная с символа с номером INDEX.
•STR(X[:WIDTH[:DECIMALS]],ST) -преобразование значения типа
REAL или INTEGER в строку символов ST так, как это делает процедура WRITELN перед выводом; параметры WIDTH и DECIMALS, если они присутствуют, задают формат преобразования (WIDTH - длину числа, DECIMALS - длину дробной части; параметр DECIMAL имеет смысл указывать только для вещественных чисел).
•VAL(ST, X, CODE) - преобразование строки ST во внутреннее представление целого или вещественного числа Х; параметр CODE содержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строке ST, где обнаружен ошибочный символ; пробелы перед числом в строке ST должны отсутствовать.
Задача обработки данных сложной структуры, представленных в виде таблицы
N |
название игpушки |
миним. |
максим. |
цена |
|
|
возраст |
возраст |
(руб.) |
1 |
Конструктор "Юность-3" |
4 |
10 |
70 |
2 |
LEGO (конструктор) |
3 |
7 |
200 |
3 |
Кукла |
2 |
5 |
50 |
… |
|
… |
|
|
2 с. |
29 символов |
8 симв. |
8 симв. |
8 симв. |
Строка таблицы – переменная типа String