Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 семестр. Презентации по информатики (лекции). / лк13_Символьные данные / лк13_Обработка символьной информации в Объектном Паскале.ppt
Скачиваний:
23
Добавлен:
13.03.2016
Размер:
118.27 Кб
Скачать

Массивы символов

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