Лабораторная работа №5. Обработка строковых данных с использованием типа запись

Обработка строковых данных с использованием
типа запись

5.1 Цель работы

Освоение процедур и функций работы со строковыми типами данных и работа с типом запись.

5.2 Определение переменных строкового типа.

Особенности типа string

Строка - это последовательность символов ходовой таблицы персонального компьютера. Доступ к отдельному символу может быть получен путем ссылки на него при помощи индекса. Байт в позиции 0, (доступный лишь при отмене проверки диапазона) хранит число, представляющее длину текущего значения переменной типа STRING.

Применение строковых переменных в качестве селектора в операторе CASE недопустимо.

Формат определения констант строкового типа:

Const <идентификатор>=<значение>; Например,... С1 = 'строка 1';...

Формат определения переменных строкового типа:

{Описание переменной типа String с помощью заданного программистом типа}

Type

<имя типа> = string [максимальная длина строки];

Vаr

<Идентификатор,...>:<имя типa>;

{Описание переменной типа String без заданного программистом типа}

<Идентификатор,...>: string [максимальная длина строки];

Максимальная длина строки не более 255; значение 255 можно не задавать. Пример описания строк и считывания строки:

Program StrTest;

const

S1=' Пример константы строкового типа';

var

S2: string[10];

Begin

Write(' Введите отроку:');

ReadLn(S2);

WriteLn(Sl); {Вывод значения строковой константы}

WriteLn(' Длина введенной строки ',8,' равна ',ord(S2[0]));

End.

Запись S[0] дает доступ к нулевому байту, содержащему значение текущей длины строки. Значение нулевого байта не должно превышать 255, нарушение этого правила не вызывает программного прерывания, так как директива компилятора R по умолчанию находится в пассивном состоянии {SR-}. Для обеспечения строгого контроля за диапазоном допустимых значений индекса следует перевести директиву R в активное состояние {SR+}. Активный режим R устанавливается на стадии отладки программ.

5.2 Строковые выражения

Выражения, в которых операндами служат строковые данные, называются строковыми. Они состоят из строковых констант, переменных, указателей функций и знаков операций над ними.

Над строками могут выполняться операции отношения и сцепления (конкатенации):

5.2.1 Операции отношения: <,>, =, <>, >=, <=. Результат операции отношения будет иметь тип BOOLEAN. Строки сравниваются посимвольно слева направо. При обнаружении первого несовпадающего символа принимается решение <больше> или <меньше> в соответствии с таблицей кодов ASCII. Если две сравниваемые строки имеют различную длину, совпадают вплоть до последнего символа более короткой строки, то более короткая строка считается меньшей. Например:

'Pascal'='pascal' -> false

'prim'<'primer' -> true '+'<'-' -> true

5.2.2 Сцепление: +. Использование знака + позволяет разместить строки одну за другой. Например:

'Новый'+' '+'год'='Новый год';

Операция + дает тот же результат, что и функция CONCAT(), присутствующая в языке Turbo Pascal для обеспечения его совместимости с другими версиями (описывается ниже).

5.3 Строковые процедуры и функции. Информация о строковых процедурах и функциях дана в таблице 11.

Таблица 11

Назначение процедуры или функции Заголовок процедуры или функции Пример
Удаление N символов строки St начиная с позиции Роs Delete(St:string, Pos,N:byte) St:='abcdef' Delete(St,4.2); {St='abcf'}
Вставка строки Strl в строку Str2, начиная с позиции Роs Insert(Str1,Stf2:string, Pos:byte) Str2:='abcdef'; lnsert(Sti2,'*',4); {Str2='abc*def'}
Преоброзование числового значения величины V (integer или real) и помещение результата в строку St Str(V:real, St:string) V:=1500; Str(V:6,St); {St=' 1500'}
Преобразование строки St в величину целочнсленного или вещественного типа и помещение результата в V Val(St:string,V:real, Code:byte) St:='1.455'; Val(St,V,Cod); {V=1.455. Cod=0}
Сцепление строк St1, St2,... Concat(Stl,St2,..,Stn:string):string Y:=Concat('AA','BB') {Y='AABB'}
Выделение из строки St подстроки длиной N символов начиная с позиции Роs Copy(St:string, Pos,N:byte):strting St:='abcdef'; Y:=Copy(St,2,3); {Y='bcd'}
Вычисление длины строки St Length(St:string):byte St:='abcdef', Y:=Length(St), {Y=6}
Обнаружение первого появления в строке St2 подстроки St1 Pos(St1,St2:string):byte St2:='abcdef; Y:=Pos('de',St2) {Y=4}

5.4 Пример программы

Программа, осуществляющая ввод массива из 10 слов длиной 6-8 символов и в каждом слове заменяет символы 'а' на 'б', а также осуществляет преобразования вещественной и строковой констант.

Program Prin_Str;

Const X1=12.34;

Х2= '12.34';

Var X: array [1..10] of string[8]; {Массив слов}

St: string[7]; {Параметр для процедуры Str()}

V: real; {Параметр для процедуры Val}

Code: byte; {Параметр для процедуры Val}

D1: integer; { Длина слова в массиве}

п: integer; {Позиция символа 'а'}

i, j: byte; {Переменные цикла}

Begin {---------Ввод массива из десяти слов---------------}

Writeln ('Программа обработки данных строкового типа');

Writeln;

Writeln('Введите 10 слов из 6-8 символов');

For i:=1 to 10 do

begin

Write(i, ' -e слово '};

Readln(X[i]);

end;

{------------Вывод на экран введенных данных--------}

Writeln('Введенные cлова');

For i:=l to 10 do Writein(i, '-e слово ',X[i]);

D1:=length(X[1]);

{------------Вывод кодов символов первого слова---------}

For i:=l to D1 do

Begin

Write(Ord(Xli]);

WriteLn

End;

{----------Преобразование числа в строку -----}

Str(X1:7, St);

WriteLn ('Число ',Х1:7:3,' преобразуется в строку ', St);

{-----------Преобразование строки в число ----------}

Val(X2, V, Code);

Writeln ('Строка ', Х2, ' преобразуется в число ',V);

WriteLn(' код ошибки ', Codе);

{---------------- Поиск в словах символа 'а'-----------}

{---------------- и замена его на символ 'б'------------}

For i:=l to 10 do

begin

{---- Определение наличия символа 'а' в слове X[i] и его позиции } n:=роs('а', X[i]);

{-—Запись символа 'б' на место, занимаемое символом 'а'—---}

if n>0 then X[n]:='б'

end;

{---------Преобразование массива из 10 слов в строку и----}

{---------вывод результата -------------}

End.

5.5 Представление типа запись

5.5.1 Комбинированные типы.

Комбинированные типы, как и регулярные типы, представляют собой правило формирования составных типов. В отличие от массивов, записи позволяют объединять значения различных типов и поэтому являются наиболее гибким механизмом построения данных.

Содержание комбинированного типа представляет собой список описаний его элементов (которые называются полями записи); каждое описание похоже на описание простой переменной. Список полей начинается служебным словом record и завершается end.

type

Person=record

Name, SecondName, SurName: string [20];

Sex: (Male, Female);

Speciality: Word;

end;

Структура записи состоит из фиксированного числа компонент (полей), каждое из которых имеет собственное (уникальное в пределах записи) имя и произвольный тип.

var

Sasha, Masha: Person;

Доступ к элементам (полям) записей производиться с помощью конструкции, называемой — селектор записи.

R. F

где R — переменная комбинированного типа, F — идентификатор поля.

Допустимы следующие конструкции:

Sasha.Name:=’Александр’;

Masha.Sex:=Female;

При записи селектора необходимо помнить, что слева от символа «точка» всегда должна находиться переменная типа запись, а справа идентификатор поля этой записи.

5.5.2 Комбинированные типы с вариантом.

Любой комбинированный тип, помимо фиксированного списка полей, может содержать вариантную часть, предполагающую определение нескольких вариантов структуры этого типа. Различие может касаться как числа компонент, так и их типа.

Вариантная часть содержит несколько альтернатив в каждой из которых в круглых скобках задается список полей, присущих данному варианту. Списку предшествует метка, являющаяся конкретным значение поля, которое является критерием выбора.

type

PersonSex = (Male, Female);

Person = record

Name, SecondName, SurName: string [20];

Speciality: Word;

case Sex: PersonSex of

Male: (Army: integer;

Smoking: boolean);

Female: (EyesColor: (Blue, Brown, Gray

Green))

end;

- в определении комбинированного типа может быть только одна вариантная часть, и она должна быть задана в конце записи;

- альтернативы вариантной части помечаются допустимыми значениями поля Sex, определение этого поля вынесено из фиксированной части и помещено в заголовке вариантной части;

- идентификаторы полей во всех вариантах должны быть различны и отличаться от идентификаторов полей фиксированной части;

- для некоторых значений поля—дискриминанта вариант может отсутствовать, тогда после двоеточия ставится пустой список ().

5.5.3 Оператор присоединения.

Если в некотором месте программы сосредоточено несколько операторов, манипулирующих с полями определенной записи, то существует возможность «вывести» общий для всех составных имен идентификатор записи в отдельный заголовок. После этого достаточно указать только поля записи посредством их идентификаторов. Соответствующая конструкция называется «оператором над записями» или «оператором присоединения».

With Sasha do Name:=’Александр’;

или

With Sasha do

begin

Name:=’Александр’;

end;

5.6 Задание на лабораторную работу

5.6.1 Изучить теоретический материал методического пособия о строковых и комбинированных типах.

5.6.2 Получить вариант задания и подготовить программу в соответствии с ним.

5.6.3 Программа должна входные данные типа String передать в запись с полями: слова, длина слова, код первого символа, код последнего символа. Затем, после выполнения задания, из записи передаются данные обратно в тип String.

5.6.4 Подготовить отчет по лабораторной работе.

5.6.5 Ответить на контрольные вопросы.


5.7 Варианты заданий

Таблица 12

№ варианта Исходные данные Результат Длина слова Количество слов Решаемая задача
      [3-8]    
      [5-9]    
      [4-10]    
      [6-10]    
      [6-9]    
      [5-8]    
      16-8]    
      [5-9]    
      15-8]    
      [3-10]    
      14-7]    
      [3-101    
      [3-9]    
      [3-8]    
      [4-10]    
      [4-9]    
      [6-9]    
      [6.10]    
      [3-8]    
      [5-10]    

Таблица 13

Структура данных
1. Массив слов
2. Строка слов, разделенных пробелом

Таблица 14

Решаемые задачи
1. Поменять местами самое длинное и самое короткое слова при условии что такие слова единственные
2. Заменить окончания (последние два символа) на 'ая’ в словах, длина которых равна 5.
3. Поменять местами слово, начинающееся на 'а' со словом, оканчивающемся на 'я', при условии, что такие слова существуют и являются единственными.
4. Удалить последние 3 символа из слов, начинающихся на 'а'.
5. Удалить первые З символа из слов, оканчивающихся на 'ве'.
6. Дополнить символом '*' слова, имеющие длину меньше максимальной по варианту задания, до максимальной.
7. Заменить первые 3 символа слов, имеющих выбранную длину на символ '*'.
8. Удалить все символы 'а' из слов, длина которых равна выбранной.
9. Заменить все символы 'а' на 'd' в словах, длина которых меньше выбранной.
10. Заменить первые строчные буквы на заглавные в каждом слове, длина которого больше выбранной.
11. Вставить пробел после первых 2-х символов в слова, имеющие длину, на 1 меньше максимальной по варианту задания
12. Заменить первую строчную букву на заглавную в словах, имеющих выбранную длину.
13. Вставить пробел перед последними 2-мя символами в слова, имеющие минимальную по варианту задания длину

5.6 Контрольные вопросы

5.6.1 Что такое строка?

5.6.2 Каким идентификатором определяются данные строкового типа?

5.6.3 Какова максимально возможная длина строки? Как определить текущую длину строки?

5.6.4 Какие выражения называются строковыми?

5.6.5 Какие операции допустимы над строковыми данными?

5.6.6 Каким образом производится сравнение строк?

5.6.7 Как можно обратиться к отдельным символам строки?

5.6.8 Каково назначение специальных процедур и функций обработки данных строкового типа?

5.6.9 Что такое запись и как реализуется этот тип в язык Паскаль?

5.6.10 Как осуществляется доступ к записям?

5.6.11 Что такое запись с выбором? Какие ограничения накладываются на типы полей записей?


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: