Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Тема 19. Алгоритмизация обработки строковой информации. Обработка записей.Содержание книги
Поиск на нашем сайте
Для работы с символьной информацией в ТР используют новый тип данных - строковый, именуемый ключевым словом STRING (или просто строка). Этот тип данных во многом похож на одномерный массив символов (Array[0..N] of char), но длина строки (максимальное количество символов N ограничивается числом 255). Значение N определяется при объявлении типа STRING(N) и может быть любой константой порядкового типа, но не больше 255. Значение N при объявлении типа STRING можно не указывать: в этом случае длина строки принимается равной 255 символам. Строка в ТР трактуется как цепочка символов и к любому символу в строке можно обратиться по адресу (индексу), подобно одномерным массивам типа Array[0..N] of char. Самый первый байт в строке, имеющий адрес 0 (ноль), содержит код, равный числу символов в строке (длине строки). Например, дана строка, имеющая следующее описание: Var St:string; Тогда длину строки St можно определить как значение функции Ord(St[0]). Значением строки может быть любая последовательность символов, заключенная в одинарные кавычки (апострофы). Можно присваивать строке пустое значение, обозначаемое как '' (две одинарные кавычки подряд). При попытке записать в переменную строку длиннее, чем задано в описании, "лишняя" часть будет отсечена. Строки можно присваивать, сливать и сравнивать. Например: Var st1,st2,st3,sts:string; Begin ... { Операции присваивания} st1:='Фамилия'; st2:='Имя'; st3:='Отчество'; { Операция слияния} sto:=st1+' '+st2+' '+st3; { В результате в строке sto будет 'Фамилия Имя Отчество'} End;... Сравнение строк основывается на порядке расположения символов в таблице ASCII. Например: 'abcd' = 'abcd' - результат сравнения True (истина); 'abc'<'bcd' так как код символа 'a' меньше кода символа 'b' и т.п. Для работе со строками в ТР разработан ряд стандартных процедур и функций. Первоначально любая описанная в разделе Var строка содержит "мусор" и рекомендуется инициализировать (заполнять) строки пустыми значениями или чем-либо другим. Для заполнения достаточно длинных строк одинаковыми символами используется встроенная процедура FillChar, например: Var S:string[80]; Begin... FillChar(S[1],80,' '); {Заполнение строки пробелами} S[0]:=Chr(80); {Занесение кода длины строки} ... End; Длину строки можно определить также, используя встроенную функцию Length(S), где S - строка типа String.
В ряде случаев возникает необходимость преобразования числовых значений в строку и наоборот. Для этого можно использовать две процедуры: 1) STR(X,S) - преобразует числовое значение X в строковое S. Возможно задание формата для Х в виде: X:F:n (для вещественных чисел, где F - общее число позиций выделяемых под число, включая десятичную точку, а n - число знаков в дробной части) или X:F (для целых чисел). Эта функция чаще всего используется при работе с процедурами модуля GRAPH. Например: STR(55,s); - строковая переменная s принимает значение, равное '55'. 2) VAL(S,Х,ErrCode) - преобразует строку S в числовое значение, если это возможно. Параметр ErrCode содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования, в противном случае он содержит номер позиции в строке S, где обнаружен ошибочный символ. Например: Val('125',K,kod) - в результате выполнения этой процедуры переменная К получает целое значение, равное 125, параметр kod=0; Val(' 1.05',M,code) - M=1.05, code=0; Val('100, ',N,code) - это ошибочный вызов, т.к. в исходной строке на 4-й позиции располагается недопустимый для числа символ ',' и поэтому параметр code=4, а переменная N остается без изменения. Кроме перечисленных, в ТР имеется еще 5 функций и процедур: 1) Concat (S1,S2,…,Sn) -функция, результат которой равен слиянию строк S1,S2,…,Sn. Например: Ssum:=Concat(s1,s2,s3). 2) Copy (S,Start,L) - функция, результатом которой является подстрока длиной L, начинающаяся с позиции Start строки S. Например: Stcop:=Copy('TTTx1+++',4,2) - результатом является подстрока Stcop='x1'. 3) Delete (S,Start,L) - процедура, которая удаляет из S подстроку длиной L, начиная с позиции Start в строке S. Insert (S,Subs,Start) - процедура, которая вставляет подстроку Subs в строку S начиная с позиции Start строки S. Например: S:='Фамилия Адрес'; Insert(S,' Имя Отчество',9); В результате строка S будет иметь вид: 'Фамилия Имя Отчество Адрес'; Pos(Subs,S) - функция поиска вхождения подстроки Subs в строку S; результатом поиска будет номер (адрес) первого символа подстроки Subs в S, если заданная подстрока найдена, или 0, если подстроки в строке нет.
Множества Под множеством в языке Паскаль понимают ограниченный неупорядоченный набор различных элементов одинакового типа, логически связанных друг с другом. Количество элементов, входящих в множество, может меняться в пределах от 0 до 255. Множество, не содержащее элементов, называется пустым. Множество имеет имя. Тип элементов, входящих в множество, называется базовым. В качестве базового типа можно использовать любой порядковый тип, кроме Word, Integer, Longint.
Множества должны быть объявлены либо в разделе Var, либо в разделах Type и Var, одновременно: Var Имя множества:Set of базовый тип; или Type Имя типа=Set of базовый тип; Var Имя множества:Имя типа; Например: Type TM=Set of 1..100; TS=Set of 'a'..'z'; Var Mch:TM; {Множество целых чисел от 1 до 100} MSym:TS; {Множество строчных латинских букв} M: Set of 1..10; {Множество целых чисел от 1 до 10}
Значения переменных множества задаются в разделе операторов с помощью конструктора множества, который представляет собой список элементов базового типа, заключенный в квадратные скобки. Например: Var M1,M2,M3:set of 1..99; Begin... M1:=[]; { Множество пустое} M2:=[1,3,5,7,9]; { Множество нечетных чисел в первом десятке} M3:=[2,4,6,8]; { Множество четных чисел в первом десятке} ... End. В качестве элементов в изображении множеств допускается использовать константы и выражения, тип которых совместим с базовым типом. Типизированная константа - множество задается в виде правильного конструктора множества, например: Type Type_month=(Jn,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); TDays=Set of 1..31; Tmonth=Set of 1..12; Tsym=Set of 'A'..'Z'; Tmno=Set of Type_month; Const SymMno:Tsym=['A','E','I','O','U']; {подмножество гласных букв} DaysMno:TDays=[1,8,15,22,29]; {подмножество выходных дней месяца} Spring_Mes:Tmonth=[3,4,5]; {подмножество весенних месяцев года} Spring_Month:Tmno=[Mar,Apr,May]; {то же, что и предыдущее}
Над множествами определены следующие операции: * - пересечение множеств: результат содержит элементы, общие для обоих множеств. Например: пусть имеется описание: Var S1,S2,S3,S4,S5:Set of 1..10; Begin S1:=[1,3,4,6]; S2:=[2,4,5,1]; S3:=S1*S2; - в S3 будет содержаться [1,4]. + - объединение множеств: результат содержит элементы первого множества, дополненные недостающими элементами из второго множества: S4:=S1+S2; - в S4 будет содержаться [1,3,4,6,2,5]. - - разность множеств: результат содержит элементы из первого множества, которые не принадлежат второму: S5:=S1-S2; - в S5 будет содержаться [3,6]. = - проверка эквивалентности (или равенства): возвращает TRUE, если оба множества эквивалентны, т.е. содержат все одинаковые элементы. <> - проверка неэквивалентности (или неравенства): возвращает TRUE, если оба множества неэквивалентны, т.е. содержат неодинаковые элементы. <= - проверка вхождения: возвращает TRUE, если первое множество включено во второе (т.е. все элементы первого множества присутствуют также и во втором). >= - проверка вхождения: возвращает TRUE, если второе множество включено в первое. IN - проверка принадлежности элемента множеству. Эта операция возвращает результат TRUE, если элемент (или выражение), стоящий слева принадлежит множеству, указанному справа. Дополнительно к этим операциям можно использовать две процедуры: Include - включает новый элемент во множество: Include(M,elem); где М - множество элементов некоторого базового типа, а elem - элемент того же типа, который необходимо включить в множество М. Exclude - исключает элемент из множества: Exclude(M,elem). В отличие от операций "+" и "-", реализующих аналогичные действия над двумя множествами, эти процедуры оптимизированы для работыс одиночными элементами множества и поэтому отличаются высокой скоростью выполнения. Основным достоинством использования множеств является экономия памяти: внутренне устройство множества таково, что каждому его элементу ставится в соответствие один двоичный разряд (один бит). Если элемент включен в множество, то соотвествующий разряд имеет значение 1, в противном случае - 0. Минимальной единицей памяти является 1 байт, содержащий 8 бит, поэтому для хранения множества мощностью 256 элементов выделяется память 32 смежных байта.
Рассмотрим работу с множествами на следующем примере. Из множества целых чисел от 1 до 20 выделить: множество чисел, делящихся на 2 и 3 одновременно; множество чисел, делящихся на 2 или на 3. Первая задача соответствует нахождению пересечения множеств чисел, одно из которых содержит числа, делящиеся на 2, а другое на 3. Вторая - объединению этих двух множеств. Обозначим множество чисел, делящихся на 2 через М2; множество чисел, делящихся на 3 через М3; множество чисел, делящихся на 2 и 3 через М2and3; множество чисел, делящихся на 2 или 3 через М2or3.
Записи Запись - это структура данных, состоящая их фиксированного числа компонентов, называемых полями. Запись имеет имя. Каждое поле записи также имеет имя. Обращение к любому элементу записи осуществляется по составному имени, имеющему вид: Имя записи.Имя поля В отличие от массива компоненты (поля или элементы) записи могут быть различного типа. Записи удобно использовать в тех случаях, когда необходимо описать атрибуты (характеристики или свойства) одного объекта, имеющие различный тип. Запись может быть объявлена в разделе Var или в разделах Type и Var, одновременно. 1. Var Имя записи:RECORD Имя поля 1:тип; Имя поля 2:тип; ... Имя поля n:тип END; или 2. Type Имя типа для записи=RECORD Имя поля 1:тип; Имя поля 2:тип; ... Имя поля n:тип END; Var Имя записи:Имя типа для записи; Второй способ описания более предпочтителен, будем использовать его. Например, пусть необходимо описать список студентов, имеющий следующую структуру:
Описание представленной структуры будет иметь следующий вид: Type T_Stud=Record Nom:word; FIO:string[40]; Fac:string[5]; Group:string[6]; Ball:array[1..3] of byte; End; Var Stud: T_Stud; {Описание одной записи} Записи могут быть составными частями массивов или других записей. Так для описания всего списка студентов, состоящего, допустим, из 1000 записей необходимо записать: Spisok:Array[1..1000] of T_Stud; {Описание массива из записей} Элементы записи (поля) используются в программе как обычные переменные данного типа. Чтобы обратиться к i - той записи представленного списка (массива Spisok) и к его полю FIO необходимо записать: Spisok[i].FIO. Для того, чтобы обратиться к той же записи и выбрать оценку по математике необходимо записать Spisok[i].Ball[2].
Для упрощения обращения к элементам записи используется оператор присоединения WITH Имя записи DO Begin Операторы обращения к элементам записи End; Для нашего примера используем этот оператор при суммировании трех оценок i-го студента: ... Sum:=0; With Spisok[i] do Begin For j:=1 to 3 do Sum:=Sum+Ball[j]; ... End;
Рассмотрим пример использования записи внутри другой записи. Пусть имеется структура:
Причем поле дата рождения состоит из полей: число, месяц, год. Тогда описание в программе будет иметь вид: Type Date=Record Days:1..31; Month:1..12; Year:1900..2000; End; Tzap=Record Nom:word; FIO:string[40]; Birthday:Date; Pol:(Man,Woman); Nac:string[20]; End; Var Zap:Tzap; Для того чтобы обратиться к элементам записи дата рождения, необходимо записать: D:=Zap. Birthday.Days; M:= Zap. Birthday.Month; G:= Zap. Birthday.Year; или с использованием оператора присоединения With Zap. Birthday do Begin D:=Days; M:=month; G:=Year; End; Типизированные константы - записи имеют вид: Имя константы: Тип = (Список значений полей записи); Список значений полей записи - это список из последовательностей вида: Имя поля: Константа; Например: 1) Type Tdate=Record Day:1..31; Month:1..12; Year:1000..2000; End; Const Date:Tdate=(day:25;month:10;year:1999); 2) Type Tkoord=record Xk,Ykreal; end; Tmas=array[1..3] of Tkoord; Const Maskoord:Tmas=((Xk:0.0; Yk:0.0), Xk:1.5; Yk:2.5), Xk:3.0; Yk:4.5));
|
||||||||||||||||||
Последнее изменение этой страницы: 2016-12-10; просмотров: 402; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.218.219 (0.009 с.) |