Мегаобучалка Главная | О нас | Обратная связь


Массивы с большей размерностью



2015-12-04 492 Обсуждений (0)
Массивы с большей размерностью 0.00 из 5.00 0 оценок




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

...: array [... ] of array...

Подобная запись достаточно громоздка (несколько раз записывается служебное слово array и т. д. ), но синтаксис языка Паскаля позволяет описывать многомерные массивы проще.

 

<список идентификаторов — имен, через запятую>:

Array <список поддиапазонов, через запятую> of

<тип элементов>;

Примеры:

1)

М: array[1.. 3] of array [1.. 3] of Real;

Подобное описание эквивалентно следующему:

М: array [1.. 3, 1.. 3] of Real;

В первом случае доступ к простому элементу осуществляется так:

M[i][j],

а во втором

M[i, jl .

 

2)

Т: array[1 .. 2, 1 .. 3, 1 .. 4] of Integer;

U: array[1 .. 10, 'A' .. 'Z'] of char;

 

Работа с n-мерными массивами заставляет программиста организовать n вложенных циклов. Подробнее остановимся на двумерных массивах. Двумерные массивы используются, в основном, для определения матриц (таблиц) с индексами, изменяющимися по строкам и по столбцам.

 

А[1, 1] , А[1, 2] , . . . , A[l, M]

А[2, 1] , А[2, 2] , . . . , А[2, M]

………………………………….

А[N, 1] , A[N,2] , . . . , А[N,M]

 

Здесь приведён пример двух мерного массива с N строками и M столбцами.

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

Примеры:

М[1, 2] := 7;

М[7, 5] :=46;

M[i, j] := 75;

M[k, 1] := SQR(M[i, j] + M[j, i] ) ;

 

Ввод элементов двумерного массива по строкам:

 

for i := 1 to n do

for j:= 1 to m do Read (M[i, j]);

 

или с сообщениями:

 

for i:= 1 to n do

for j:= l to m do

begin

Write('введите М[', i, ‘, ‘ , j, '] ');

Readln(M[i, j]);

end;

 

Вывод элементов двумерного массива в виде матрицы:

for i:= 1 to n do

begin

for j:= 1 to m do Write(M[i, j] : 7: 3, ' ') ;

Writeln;

end;

Часто при работе с двумерными массивами (матрицами) приходится оперировать с элементами, обладающими некоторыми признаками, в частности, связанными с положением элементов относительно диагоналей матрицы. Например, элемент находится на главной диагонали рисунок 12.1,a, на побочной диагонали рисунок 12.1б, ниже главной диагонали, ниже побочной и т. д. (рисунки 12.1,в÷ж).

               
     
   
 
 
 

 


a) б) в) г)

           
   
 
   
 
 

 


д) е) ж)

Рисунок 12.1

 

Положение этих элементов может быть описано следующими математическими соотношениями:

- на главной диагонали - { M[ i , j ] | i = j }

- выше главной диагонали - { M[ i , j ] | i < j }

- выше главной и выше побочной диагонали –

{ M[ i , j ] | i < j } ∩ { M[ i , j ] | i < n-j+1 } и т. д.

 

Задача. Матрица n*n вводится с клавиатуры, заменить все отрицательные элементы выше главной диагонали их квадратами. Вывести новую матрицу на экран.

program p22;

const

n:= 4;

var

М: array[1.. n, 1.. n] of integer;

i, j ; integer;

begin

{ Ввод элементов матрицы }

for i:= 1 to n do

for j:= 1 to n do

begin

Write('введите М[ ' , i, ', ' , j , '] : ');

Readln(M[i, j ] ) ;

end;

for i: = 1 to n do

for j:= 1 to n do

if i < j then { если выше главной диагонали}

if M[i, j] < 0 then M[i, j] := SQR(M[i, j] ) ; { если элемент отрицательный, то заменить его квадратом}

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

for i:= l to n do

begin

for j:= 1 to n do Write( M[i, j]: 3 , ' ');

Writeln;

end;

end.

Констант-массивы

Очень часто возникают сложности, связанные с вводом элементов массива, особенно во время отладки. Приходится по нескольку раз вводить большие объемы информации. Этого можно избежать, описав массив - константу в разделе Const.

 

Одномерный массив

<идентификатор — имя массива>: array [<диапазон изменения индекса> ] of <тип элементов> =

<список элементов, через запятую>);

Примеры:

 

Const

A : array [ 1 .. 5] of integer = (7, 3, 22, 4, 3) ;

B : array [ 1 .. 3] of real = (2.55, 7.1, 3.6) ;

C : array [ 1 .. 3] of char = (‘A’, ‘B’, ‘C’) ;

 

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

<идентификатор - имя массива>: array [ <список диапазонов, через запятую>] of <тип элементов> = (<список элементов массива, разделённых по группам в круглых скобках>);

 

Для двух мерного массива, группы - это строки. Примеры:

Const

M : array [ 1 .. 3, 1 .. 3] of integer = ((1, 2, 4) , (1, 7, 8),

(22, 8, 4)) ;

T : array [ 1 .. 2, 1 .. 2, 1 .. 2] of byte = (((1, 8) , (4, 4)),

((3, 2) , (5, 4))) ;

 

В нашем случае все массивы были описаны как типизированные константы, значит их использование в программе равноценно использованию обычных массивов - переменных.

Задача. В одномерном массиве определить количество последовательностей из нулей. Последовательности - это цепочки из одного или более нулей, разделенные ненулевыми элементами.

program p23;

const

n= 10;

A: array[l..n] of Integer = (0, 1, 0, 0, 5, 0, 1,0, 3, 0, 0, 0, 2) ;

var

zero: Boolean;

i, k: integer;

begin

zero:= false;

k:= 0;

for i : = 1 to n do

if A[i] = 0 then

if not zero then

begin k := k + 1; zero:= true; end;

else zero:= false;

Writeln(' k= ', k);

end.

Строки

Строковый тип

Строки символов, реализованные в языке Паскаль, обладают всеми признаками и свойствами одномерных символьных массивов (... array... of Char ). Символьные массивы могут входить в состав строковых выражений. В этом случае массив преобразуется в строку, длина которой равна длине массива. Символьным массивам можно присваивать значения строковых констант, однако нельзя присваивать значения строковых переменных и значения строковых выражений.

Пример:

program p25;

const

S1= 'ABCDFGHIJK';

var

S2: String[10];

S3: array [1.. 10] of char;

begin

S2:= S3; {- присваивание возможно}

S3:= S1; {- присваивание возможно}

S3:= S2; {- ошибка вида «Type mismatch» }

end.

 

Строковые переменные описываются в разделе описания переменных следующим образом:

 

<список идентификаторов>: String [<максимальное

количество символов>];

 

Примеры:

var

S: String [10] ;

S1: String[40];

S2, S3, S4: String[255];

 

Максимальная длина строки не должна превышать 255 символов. Возможно следующее описание строковой переменной S: String; - это описание соответствует строке с максимальной длиной 255 символов ( String[255] ).

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

В программе доступ к отдельным символам строки осуществляется как к элементам массива, посредством указания индекса (от единицы до максимальной длины строки) в квадратных скобках: S[1]:= 'A'; S[4]:= '$'; S[t]:= '!'; и т. п. Нулевой байт переменной, содержащей строку, равен длине этой строки.

Операции над строками

Возможны строковые присваивания:

S:= 'Мама мыла раму';

S: = ' ABC ' ;

S:= S1;

При работе со строками допустимо использовать операцию сложения {+}.

Пример:

Sl:= 'ABC’ ;

S2: = 'DEF’ ;

S:= S1 +S2;

 

После выполнения последнего оператора присваивания переменная S будет иметь значение 'ABCDEF'.

Как явствует из примера, сложение строк - это простое их объединение, причем первое слагаемое стоит в новой строке на первом месте, второе - на втором и т. д.

Для работы со строками существует набор специфичных процедур и функций.

function Length(S: String): Integer ; - функция определяет реальную длину строки (количество символов).

Примеры:

1)

S : = ' ABCD ' ;

t := length (S) ;

После выполнения оператора присваивания целая переменная t будет иметь значение 4 (символа).

2)

S:= 'Мама мыла раму';

t:= length (S) ;

 

После выполнения последнего оператора присваивания целая переменная t будет иметь значение 14 (символов).

Pos( Sl, S2 ) - функция возвращает число типа byte, равное номеру первой позиции вхождения подстроки S1 в строку S2.

 

Примеры:

1)

S:= 'ABCDEF';

Sl:= 'CDE';

t := pos(Sl , S);

Переменная t будет иметь значение 3.

2)

S:= 'АВСАВСАВСАВС ‘ ;

S1:= 'BС';

t := pos(S1, S) ;

Переменная t будет иметь значение 2.

 

Copy ( S, n, l) - функция копирует вырезает и возвращает часть строки S длиной l символов начиная с символа, имеющего номер позиции n.

Примеры:

1)

S := 'ABCDEFG’ ;

S1 := copy(S, 3, 4);

В данном случае функция возвратит значение 'CDEF'.

2)

S := 'мама мыла раму';

S1 := copy(S, 6, 4);

Функция возвратит значение 'мыла'.

 

Delete( S, n, l ) — процедура удаляет часть строки S, начиная с позиции n, длиной l символов.

Примеры:

1)

S := 'ABCDEFG’;

delete (S, 3, 4) ;

После вызова процедуры переменная S будет иметь значение 'ABG'.

2)

S := 'мама мыла раму';

delete (S, 6, 5);

Переменная S будет иметь значение 'мама раму'.

 

Insert( S1, S2, n ) - процедура вставляет строку S1 в строку S2, начиная с позиции n.

Примеры:

1)

S:= 'ABCDE';

S1:= 'GHIJ’;

insert(S1, S, 3);

После вызова процедуры Insert переменная S будет иметь значение 'ABGHIJCDE'.

2)

S := 'мама раму';

S1 := 'мыла ';

insert(S1, S, 6) ;

Переменная S будет иметь значение 'мама мыла раму'.

В отличии от массивов, строки можно выводить на экран и вводить с клавиатуры используя операторы Write и Writeln, Read, Readln.

Примеры:

Write('мама ');

Write('мыла ') ;

S': = 'раму' ;

Writeln (S) ;

Read(S);

Readln(S1) ;

 

Задача:

С клавиатуры вводится строка символов, в которой некоторая подстрока заключена в круглые скобки (например: 'ABC(DEFG)HUK' или 'мама (мыла) раму' ). Требуется отделить фрагмент в скобках и вывести его на экран.

program р26;

var

S: String;

nl, n2: integer;

begin

Writeln('Введите строку');

Readln(S) ;

{ находим позицию первого вхождения '(' }

nl := pos( '(', S); {- находим позицию первого

вхождения ')'}

n2 := роз( ')', S); { по двум позициям определяем длину

фрагмента = n2 - nl -1 }

S := copy (S, nl + 1, n2 - nl - 1}; {и вырезаем фрагмент}

Writeln('S= ', S);

end.

Задача:

С клавиатуры вводится строка. Рассматривая ее как предложение, слова в котором разделяются одним или несколькими пробелами, разбить ее на слова, а слова вывести на экран. Каждое с новой строки.

program p28;

Const

S: String = 'ABC DEFG HIJ KL';

var

i: integer;

S1: String;

begin

i: = 1;

while i < = length(S) do

begin

{проходим по возможной цепочке пробелов}

While ( S[i] = ' ') and (i <= length(S)) do i : = i + 1 ;

S1 : = '' ; { S1 – пустая строка }

{ проходим по слову }

While ( S[i] <> ' ') and ( i <= length(S)) do

begin

S1:= S1 + S[i];

i : = i + 1 ;

end;

Writeln(S1);

end;

end.

 

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

Val( S, X, Er) – процедура преобразует строку S в число, которое записывает в переменную X. В процессе перевода строки в число может возникнуть ошибка, например, строка содержит нецифровой символ. Поэтому, в параметр Er записывается значение ноль, если перевод в число прошел успешно и номер символа, на котором перевод был прерван, в обратном случае. Тип параметра Х может быть целым и вещественным, по желанию пользователя. Примеры:

1)

{X: Integer}

S:= ‘ 423' ;

Val (S, x, Er);

{после вызова процедуры целая переменная X будет иметь

значение 123, а Ег – 0 }

2)

{R: Real}

S:= ‘ 423. 5' ;

Val (S, R, Er);

{ R = 123. 5, Er = 0 }

3)

{ X: Integer}

S := ' 342ABC ' ;

Val(S, X, Er);

{ после вызова процедуры Ег = 4, на четвертом символе

произошел сбой }

Ниже приведена программа для преобразования строки символов в целое число.

program р30;

var

I, Code: Integer;

S: String;

begin

WriteLn('Введите строку для преобразования ');

ReadLn(S);

Val (ParamStr (1) , I, Code) ;

{ Если произошла ошибка... }

if code <> 0 then Writeln('Ошибка в позиции: ' , Code)

else Writeln( 'начение: ', I);

end.

 

Процедура Str преобразует число (целое или вещественное) в символьный вид - строку. Обращение к процедуре - Str ( X, S) , X – целое или вещественное число, S – символьный вид этого числа. При переводе числовых значений можно указывать формат перевода, подобно тому, как мы это делали при вызове Write и WriteLn.

Примеры:

{Т: Integer}

Str(T: 6, S) ;

 

{М: Real}

Str(M : 4: 2, S);

Str(T, S);

Str(M, S);

Ниже приведена программа для преобразования произвольного числа в строку.

program p31;

 

function IntToStr(I: Longint) : String;

var

S: string [11] ;

begin

Str(I, S) ;

IntToStr:= S;

end;

 

begin

Writeln(IntToStr(-5322) ) ;

end.



2015-12-04 492 Обсуждений (0)
Массивы с большей размерностью 0.00 из 5.00 0 оценок









Обсуждение в статье: Массивы с большей размерностью

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (492)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.012 сек.)