Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TP_теория и практикум.doc
Скачиваний:
11
Добавлен:
20.08.2019
Размер:
861.7 Кб
Скачать

Упакованные массивы

Как правило, одно целое число или один символ занимают в памяти ЭВМ два байта. В то же время для изображения символа достаточно одного байта. С целью экономии памяти машины в языке программирования Паскаль введено понятие упакованного массива. Элементы упакованного массива хранятся по два в двух байтах ЭВМ. И хотя при этом экономится место в памяти, но увеличивается время доступа к компонентам массива.

Элементы упакованного массива используются в программе точно так же, как элементы не упакованного массива. Только память машины при этом автоматически выделяется меньше.

Например, массивы А и АР описаны как

Var AP: Packed Array [1..3] of Boolean;

A: Array [1..3] of Boolean;

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

Упакованный массив можно описывать в разделе переменных или с использованием раздела типов.

Описание в разделе типов:

Type имя типа = Packed Array [имя индекса] of тип элемента;

Var имя переменной:имя типа;

Здесь служебное слово Packed указывает на то, что массив данных является упакованным.

К упакованным символьным массивам в языке программирования Паскаль относится строки символов, которые задаются либо в разделе операторов, либо в разделе констант (строки символов, а не символьные строки String, о которых речь пойдет дальше). Как известно, тип константы однозначно определяется ее записью. Поэтому если, например, в разделе констант определена константа S=’end’, то она принадлежит к типу: Packed Array [1..3] of Char.

Считается, что символьные константы имеют тип упакованных массивов:

Packed Array [1..n] of Char;

где n - длина строки.

Символьные массивы и константы могут участвовать в операциях присваивания и сравнения.

Пусть, например, описание символов массива имеет вид:

Type Mas= Packed Array [1..7] of Char;

Var A:Mas;

Тогда, можно записать такой оператор:

A:=’ZADACHA’;

Если к строкам и упакованным символьным векторам применяют операции сравнения, то при этом аргументы обязательно должны содержать одинаковое количество символов, т.е. их типы д/б идентичными. Операции сравнения выполняются посимвольно, слева направо.

Пример: ‘String’ < ’Strong’, т.к. в алфавите символ ‘i’ стоит раньше, чем ’o’ и его код меньше, т.е. ’i’<’o’.

Пусть, например, имеется строка: “ABCDEFG”. Эту строку можно считать массивом символов, состоящим из 8 символов, включая пробел. Если этот массив символов обозначить именем Sim, то описание примет вид:

Type T = Packed Array [1..8] of Char;

Var Sim:T;

Один элемент массива принимает значение одного символа, например:

Sim[1]=’A’;

Sim[6]=’ ’.

Элементы массива могут принимать свои значения с помощью оператора ввода Read, который располагается внутри цикла.

Пример: ввода.

  1. I: = 1;

While I<=10 do Begin Read (A[I]); I:= I+1; End;

  1. For I:= 1 to 46 do Read (A[I]);

Вывод массива символьных данных также организуется с использованием цикла.

Пример: Дана строка символов, обозначенная именем S1.

‘To be or not to be’

Требуется сформировать новый массив с именем S2, который содержит представленную строку символов с добавлением в конце вопросительного знака.

Program Hamlet;

Type Stroka = Packed Array [1..20] of Char;

Var S1, S2: Stroka;

I: Integer; (*счетчик символов*)

K: Integer; (*параметр цикла*)

Begin

Write (‘Ввести S1=’);

I; = 0;

While I <= 18 do

Begin

I:= I+1;

Raed (S1[I]); Readln;

End;

S2:= S1;

S2[I+1]:= ‘?’;

For K:= 1 to I+1 do Write (S2[K]);

End.

Р азрешается ввод и вывод символьных массивов целой строкой, без организации цикла.

Пример: Даны два символьных массива: А1= ‘Suvorov’ и А2= ‘Suhanov’. Требуется поменять их местами.

Program Zamena;

Const N =12;

Type Mas = Array [1..N] of Char;

Var A1,A2,X: Mas;

Begin

Writeln (‘A1-Who?’);

Readln (A1); {Суворов}

Writeln (‘A2-Who?’);

Readln (A1); {Суханов}

Writeln (‘происходит замена’);

X:=A1;

A1:=A2;

A2:=X;

Writeln (‘A1=’,A1);

Writeln (‘A2=’,A2);

End.

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

Строки

Тип String (строка) в Паскале широко используется для обработки текстов и во многом похож на одномерный массив символов Array [0..N] of Char. Однако в отличие от массива количество символов в строке – переменной может меняться от 0 до N, где N – максимальное количество символов в строке. Значение N определяется в разделе объявления типа String [N] и может быть любой константой порядкового типа, но не больше 255: N 255. Можно не указывать N, в этом случае длина строки принимается максимально возможной: N = 255.

Строка трактуется как цепочка символов. К любому символу в строке можно обратится точно так же, как к элементу одномерного массива Array [0..N] of Char.

Пример:

Var st: String;

- - - - - - - - - - - - - -

if st[5]= ‘A’ then …….

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

Пример:

Var st:String[10];

I:Integer;

- - - - - - - - - - - - - -

st[0]:=5;

Значение Ord (st[0]), то есть текущую длину строки можно получить с помощью функции length (st).

К строке можно применить операцию + (сцепление строк), например:

St:=’a’+’b’;{ ab}

St:=st+’c’; { abc}

Если длина сцепленной строки превысит максимально допустимую длину N, то «лишние» символы отбрасываются.

Пример:

Var st :String [1];

Begin st:=’123’;

Writeln(st); { 1}

End;

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

  1. 1) Concat (S1<, S2, S3,…SN>)– функция типа String, сцепление строк;

  2. 2) Copy (имя строки,№ нач. символа, кол-во символов)– функция копирования;

  1. Delete (имя строки,№ нач. символа, кол-во символов)– функция удаления;

  2. Insert (имя подстроки, имя строки, № нач. символа в строке)– вставка;

  3. Length (имя строки)– функция типа Integer, вычисляет длину строки;

  4. Pos (имя подстроки, имя строки)- функция типа Integer, отыскивает в строке первое вхождение подстроки и дает № позиции, с которой она начинается; если подстрока не найдена, значение функции будет = 0;

  5. Str (число Real или Integer <: общая ширина поля<: кол-во симв. в дроб. части>>, имя строки) – процедура, преобразующая число типа Real или Integer в строку символов так, как это делает процедура Writeln перед вызовом; параметры, если они присутствуют, задают формат преобразования;

  6. Val (имя строки, число Real или Integer, параметр) – процедура, преобразующая строку символов во внутреннее представление целое или вещественное числа; параметр = 0, если преобразование проведено успешно, в противном случае он содержит № позиции в строке, где обнаружен ошибочный символ;

  7. Upcase (символ) – функция типа Char, возвращает символ в верхнем регистре, если он определен для него, либо сам символ, если для него нет верхнего регистра.

Пример: Upcase(‘a’) даст A,

Upcase(‘2’) даст 2.

Пример:

Var

x: Real;

y: Integer;

st, st1: String;

  • - - - - - - - - - - - - - - - -

st:= concat (‘12’,’345’); (*получится st  12345*)

st1:= copy (st, 3, lenght(st)-2); (*получится st1  345*)

insert(‘-’,st1,2); (*получится st1  3-45*)

delete(st, pos(‘2’,st),3); (*получится st  15*)

str(pi:6:2,st); (*получится st  3.14*)

st1:=’3.1415’; (*получится st1  3.1415*)

val(st1,x,y); (*получится y=2, x – какой был*)

Операции отношения

= <> > < >= <=

выполняются над двумя строками посимвольно, слева направо, с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением chr(0).

Пример: Операции дают значение true:

‘turbo’<’turbo-pascal’;

‘A’<>’IFF’;

‘ПАскаль’<’Паскаль’;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]