Конспект лекций по информатике для специальностей 2102, 2103 Автор доц., к т. н. Каширская Е. Н

Вид материалаКонспект

Содержание


6.2. Многомерные массивы
6.3. Упакованные массивы
Подобный материал:
1   ...   11   12   13   14   15   16   17   18   ...   25

6.2. Многомерные массивы


До сих пор мы рассматривали массивы, каждый элемент которых содержал один индекс. Такие массивы называют одномерными.

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

Описание матрицы 3 х 4:
  1. Type T = Array [1..3,1..4] of Integer;

Var A:T;
  1. Type T = Array [1..3] of Array [1..4] of Integer;

Var A:T;

Пример:

Type T1 = Array [1..4] of Integer;

T = Array [1..3] of T1;

Var A:T;

B: T1;

Здесь сначала описывается тип одной строки Т1, а затем, через тип строки Т1, описывается тип всей матрицы Т. В разделе переменных указывается, что А является двумерным массивом (т.е. матрицей), а В – одномерным массивом.

Пример: Найти сумму положительных элементов массива D(n,m)

n10, m20.

Program Summa;

Const n=10;

m=20;

Var i, j:Integer;

Sum: Real;

D: Array [1..n,1..m] of Real;

Begin

Sum: = 0;

For i: = 1 to n do

For j: = 1 to m do

Begin

Read (D[i,j]);

If D[i,j] > 0 then Sum: = Sum + D[i,j];

End;

Writeln (‘Sum=’,Sum);

End.

Пример: Даны две матрицы: A[N*M], B[N*M].

Найти их сумму C[N*M]= A + B.

Cij = aij + bij

Program Summa;

Const N=3; (*количество строк*)

M=5; (*количество столбцов*)

Type Mat = Array [1..N,1..M] of Real;

Var A, B, C: Mat;

I: Integer; (*индекс строки*)

J: Integer; (*индекс столбца*)

Begin

Writeln (‘Ввести А, В’);

For I: = 1 to N do

Begin

For J: = 1 to M do

Begin

Read (A[I,J],B[I,J]);

C[I,J]:= A[I,J] + B[I,J];

End;

Readln;

End;

Writeln (‘Матрица С’);

For I: = 1 to N do

Begin

For J: = 1 to M do

Write (C[I,J]:3:1, ‘ ‘:2);

Writeln;

End;

End.

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


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

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

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

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.

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