4287

Массивы. Основные операции над ними. Алгоритмы обработки массивов

Контрольная

Информатика, кибернетика и программирование

Массивы. Основные операции над ними. Алгоритмы обработки массивов. Структурные типы данных. Способы представления в памяти. Переменные структурного типа содержат более одного значения. К структурным типам относятся множества, массивы, записи, файлы,...

Русский

2012-11-15

131.5 KB

124 чел.

Массивы. Основные операции над ними. Алгоритмы обработки массивов.

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

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

Память, выделяемая под переменные структурного типа, по умолчанию, выравнивается по границам Word (блоками, кратными машинному слову – 4 байта) для более быстрого доступа. Например, для типов Byte, Boolean или Char будет выделено 4 байта,  хотя фактический размер хранимых данных составляет 1 байт. При объявлении структурного типа можно включить зарезервированное слово packed для того, чтобы уменьшить память, которую занимают данные. В этом случае данные структурного типа будут упакованы. Использование этого слова замедляет доступ к данным, но обеспечивает их компактное хранение.

Описание статических массивов в программе. Доступ к элементам.

Все рассмотренные ранее типы данных позволяют обрабатывать одиночные объекты: числа, символы и т.д. Однако, часто при решении задач необходимо использовать структуры данных,  содержащие множество однотипных элементов. Для обработки таких данных и служит массив.

Массив - структурированный тип данных, состоящий из фиксированного числа элементов одного типа.  Например, при обработке результатов многократных замеров температуры воздуха в течение года удобно рассматривать значения температур как массив вещественных чисел. Число элементов массива фиксируется при описании типа и в процессе выполнения программы не изменяется.  Для доступа к элементу массива необходимо указать имя массива и в квадратных скобках его номер.  Для описания массивов используется служебное слово array. Описание переменной типа массив имеет вид:

var <имя переменной>: array [i..i1,j..j1] of <тип элементов>,

где  i, i1 - границы первого индекса массива,

j, j1 - границы второго индекса массива.

Например:

 var   a: array [1..10] of integer; {массив из 10 целых чисел с номерами 1,2, …10}

Каждый элемент массива помечается целым числом или элементом другого порядкового типа, который называется индексом элемента. Массив задается указанием верхней и нижней границ индексов элементов  массива (диапазоном индексов) и типом элементов массива. Диапазоном служат разделенные двумя точками (знак “..”) верхняя и нижняя границы массива. Память для статического массива выделяется в процессе компиляции программы, поэтому в качестве границ диапазонов могут выступать либо целые числа, либо константы, определенные в разделе констант, либо составленные из них выражения. Но необходимо помнить, что эти константы должны быть определены до использования. Статический массив не может быть переменной длины!

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

Примеры:

const N=100;

type

color = (white, black, red, blue, green, yellow, brown);

var

a,s,g:array [1 ..N] of integer;{целочисленные индексы}

b:array [color] of char;{ индексы перечисляемого типа}

c:array [char] of color;{ индексы символьного типа}

d:array[‘a’..’z’] of real;{ индексы символьного типа}

k:array[Boolean] of byte;{ индексы логического типа}

Доступ к каждому элементу массива осуществляется с помощью индекса, т.е. порядкового номера элемента массива. Когда мы хотим обратиться к элементу массива, надо указать имя массива и порядковый номер элемента: a[1], b[red], c['z'], d['s'] . Если указано только имя массива - речь идет обо всем массиве (a, s и d и т.д.). Для массивов определена единственная операция – операция присваивания для однотипных  массивов. Например, s:=a (такая операция означает, что все элементы массива a копируются в соответствующие элементы массива s).  Все остальные операции определены для элементов согласно их типу. При обработке  массива нужно последовательно обрабатывать все его элементы; при вводе массива необходимо  последовательно  вводить  1-й, 2-й и 3-й и т.д. элементы массива; аналогично и при выводе. Если статический массив создан, но значения назначены не во все элементы, неиспользованные элементы занимают память и содержат произвольные данные.

Массив в памяти располагается непрерывным блоком. Для доступа к элементу массива программе необходимо определить его адрес An. Этот адрес определяется по адресу начала массива в памяти Abase, размеру одного элемента R и номеру элемента n.   Если нумерация массива начинается с нуля, то программе для вычисления адреса элемента с номером n потребуется три целочисленные операции –  An= Abase+n*R (к адресу начала массива необходимо прибавить смещение - номер элемента n  умноженный на размер элемента R). Если нумерация начинается с ненулевого значения k, то требуется 4 целочисленные операции - An= Abase+(n-k)*R. Из вышесказанного можно сделать вывод о том что, при описании массивов выгоднее индексацию начинать с нуля (в некоторых языках программирования индексация массивов всегда начинается с нуля). Время обработки  такого массива  может оказаться на 10 –20% меньше времени обработки массива аналогичной длины, но с начальным индексом, отличным от нуля. Этот факт желательно учитывать при многократной обработке больших массивов данных. При работе с небольшим объемом данных  разница во времени будет несущественна.

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

type

<имя типа> = array [ <тип индекса>]  of <тип компонентов>;

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

Пример:

const n=100;

type

vector:array[0..n] of integer;

var a,b,c:vector;

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

Пример описания типа матрицы.

const n=3;m=5;

type

vector:array[1..n] of integer;

 matrix: array[1..m] of vector;

var   v : vector;

C,D:matrix;

При таком описании вектором (vector) является  строка матрицы из 3-х целых чисел, а сама матрица (matrix) это набор из 5 строк (векторов). Матрицы в памяти располагаются  построчно – элементы первой строки, второй и т.д. Для обращения к элементу матрицы необходимо указывать два индекса через запятую, первый индекс определяет – номер строки, второй – положение элемента в строке (номер столбца). Приведем примеры возможных операций для матриц С и D. Если после имени такой  переменной не указывается никаких индексов, то это матрицы целиком, если один индекс – это строка матрицы с указанным номером, если два индекса – это элемент в заданной строке в заданном столбце.

D:=C; {все элементы матрицы С скопировать в соответствующие элементы матрицы D}

V:=C[1]; {все элементы первой строки матрицы  C скопировать в одномерный массив v}

C[2,3]:=5;или C[2][3]:=5; {в третий элемент второй строки матрицы C записать число 5}

V:=D[1]; D[1]:=D[m]; D[m]:=V;  {поменять местами первую и последнюю строки матрицы D, используя третью переменную V}

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

const n=3;m=5;

type    matrix = array [1..m,1..n] of integer;

 vector:array[1..n] of integer;

   var      C,D:matrix; v : vector;

или     

var     C,D:array [1..m,1..n] of integer; v : vector;

При таком описании доступ к отдельным строкам, как к единому целому, невозможен. Можно оперировать или матрицами целиком, или их элементами. Т.е. операция V:=D[1]; недопустима.

Аналогично можно ввести 3-мерный массив или массив большего числа измерений

type   MatrixArray=array [1..10,1..5,1..3]  of integer;

var    b: MatrixArray;

или

const n=3;m=5; k=10

type

vector:array[1..n] of integer;

matrix: array[1..m] of vector;

MatrixArray:array[1..k] of matrix;{массив, состоящий из матриц}

var   b: MatrixArray;

Переменную b можно использовать для хранения оценок по нескольким предметам для нескольких групп. Тогда vector – это оценки одного ученика по трем предметам, matrix – оценки одной группы из пяти человек. Для доступа к значениям такой структуры указываются три индекса, например,   b[2,3,1]:=5 будет означать  запись оценки 5 по первому предмету для третьего ученика из второй группы. Первый индекс обозначает номер группы, второй – номер ученика, а третий – номер предмета. Если переменная b используется с одним индексом (b[2]) – это целиком оценки одной группы с номером два, если два (b[2,4]) – это оценки четвертого ученика из второй группы.

Массивы констант.

Если константа принадлежит составному типу или типу, введенному в разделе type, этот тип должен быть указан (такая константа называется типизированной):

const <имя константы> : <тип> = <значение константы> ;

Константа отличается от переменной тем, что значение ей присваивается при трансляции программы, а не в процессе выполнения, как для переменной. Обычно в раздел констант включают те данные, которые не меняются в процессе работы программы. Описание массива констант выглядит так

const 

<имя константы массива> : array[<диапазон индексов>] of <тип элементов массива> = (<значение1>,<значение1>, ……,<значениеN>) ;

Число значений должно совпадать с числом элементов массива, а тип значений с типом элементов массива.

Пример:

{массив Days хранит количество дней в месяце, номер месяца соответствует номеру элемента в массиве}

const Days:array[1..12] of integer =(31,28,31,30,31,30,31,31,30,31,30,31);

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

Операции с элементами массива.

Практически все операции с массивом следует проводить поэлементно в цикле. Для обработки элементов массива  удобно использовать цикл  for ...do, а верхний индекс массивов определять как предварительно описанную константу. В этом случае все циклы по обработке массива будут заканчиваться значением этой константы.  При изменении числа элементов массива,  в программе достаточно изменить значение константы (т.к. все циклы зависят от константы).

Стандартные функции Low() и High() действуют для идентификаторов типа массива. Они возвращают нижние и верхние границы массива. Стандартная функция Length() возвращает количество элементов первого измерения массива (для матрицы возвращается число строк)

Ввод-вывод элементов одномерного массива.

Паскаль не имеет средств ввода-вывода всего массива, поэтому ввод-вывод следует организовывать поэлементно (см. рис.1, 2). Блок-схема, изображённая на рис.1 и 2 может быть реализована циклами while, for.

Рис. 1 Ввод элементов массива.

Рис.2 Ввод элементов массива

Пример - ввод элементов массива X с помощью цикла while.

const n=10;

var   x: array [1..n]  of real;

 i: integer;

begin

i:=1;

while (i<=N) do

    begin

        write(' x[ ', i , '] =  ');  readln(x[i]);

        i:=i+1 // или inc(i);

    end;

……………….

end.

Пример - ввод элементов массива X с помощью цикла for.

const n=10;

var   x: array [1..n]  of real;

 i: integer;

begin

for i:=1 to N do

    begin

                 write(' x[ ', i , '] =  ');  readln(x[i]);

    end;

………..

end.

Пример – вывод элементов массива Х в одну строку.

     for i: = 1 to n do    write (x[i]:6:2,’  ‘);

или

     for i: = 1 to n do    write (‘X[‘,i,’] = ’,x[i]:6:2,’  ‘);

Алгоритм нахождения суммы и произведения элементов массива.

Рис.3 Нахождение суммы элементов массива Х.

Рис.4 Нахождение произведения элементов массива Х.

Пример – фрагмент программы нахождения суммы и произведения элементов массива Х из n целочисленных элементов.

const n=10;

var   x: array [1..n]  of integer;

 i, s ,p : integer;

begin

{ввод элементов массива}

s:=0;

for i:=1 to N do // нахождение суммы элементов

 s:=s+x[i];

writeln(‘сумма = ‘,s);

p:=1;

for i:=1 to N do // нахождение произведения элементов

 p:=p*x[i];

writeln(‘произведение = ‘,p);

……..

end.

Нахождения максимального элемента массива и его номера.

Алгоритм решения задачи  следующий. Пусть в переменной с именем Max хранится максимальный элемент массива, а в  переменной с именем Nmax - его номер. Предположим, что первый элемент массива является максимальным, и запишем его в переменную Max, а в Nmax запишем его номер (т.е. 1). Затем все элементы, начиная со второго, сравниваем с максимальным. Если текущий элемент массива (i-й) оказывается больше максимального, то записываем его в переменную Max, а в переменную Nmax текущее значение индекса i.

Рис.5 Нахождения максимального элемента массива и его номера

Соответствующий участок программы будет иметь вид:

const n=10;

var   x: array [1..n]  of integer;

 i, Max, NMax : integer;

begin

{ввод элементов массива}

Max:=X[1];

Nmax:=1;

for i:=2 to N do

    if X[i]>Max then

        begin

             Max:=X[i];

            Nmax:=i;

       end;

writeln(‘Max = ‘,Max,’     Max position = ‘, Nmax);

В данном примере можно обойтись одной переменной Nmax, т.к. зная позицию максимального элемента, мы знаем и его значение. Тогда код можно переписать так

Nmax:=1;

for i:=2 to N do

    if X[i]>X[NMax] then

                               Nmax:=i;

writeln(‘Max = ‘,X[NMax],’     Max position = ‘, Nmax);

Упорядочивание массива по возрастанию

Решим следующую задачу: задан массив из n целых чисел,  упорядочить массив по возрастанию. Блок-схема представлена на рис.6. Алгоритм упорядочивания состоит в следующем.  Сравниваем текущий и последующий элементы массива, если текущий больше последующего, то меняем их местами. В результате этих действий самый большой элемент станет на последнее место, т.е. на N-е.  Теперь повторяем этот алгоритм  для N-1 элемента массива и устанавливаем максимальный элемент на (N-1)-е место. Так повторяем до тех пор, пока не упорядочим весь массив.  Для упорядочивания по убыванию необходимо при сравнении элементов массива заменить знак “больше” на знак “меньше”. Такой метод получил название пузырьковой сортировки.

Рис.6. Алгоритм упорядочивания массива

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

const n=10;

var   i,j,b: integer;

y: array [1..n] of integer;

begin

for i:=1 to n do   //ввод элементов массива

    begin

        write('y[',i']=');  readln (y[i]);

    end;

writeln ('массив y ');

for i:=1 to n do  //вывод элементов массива

                write (y [i],' '); 

writeln;

for j:=1 to n-1 do 

 for i:=1 to n-j do

        if  y[i] > y[i+1]  then

            begin // Меняем элементы местами

                b:=y[i];

                y[i]:=y[i+1];

                y[i+1]:=b;

            end;

writeln('упорядоченный массив');

for i:=1 to n do  

             write (y[i],'   '); 

writeln;

end.

Пузырьковая сортировка является самой медленной. Так как для размещения элемента на свое место необходимо много раз переставить его с соседними элементами. Сортировка выбором (selection sort) работает несколько быстрее пузырьковой, т.к. в ней существенно меньше перестановок элементов. Задача  сортировки выбором - искать наименьший элемент, который затем меняется местами с элементом из начала массива. Затем находится наименьший из оставшихся элементов и меняется местами со вторым элементом. Процесс продолжается до тех пор, пока все элементы не займут свое конечное положение.

const n=10;

var   i,j,x,k: integer;

M: array [1..n] of integer;

{x-значение минимального элемента, k- позиция минимального элемента}

begin
………

   For I:=1 to N-1 do

       begin

           k:=i;{запоминаем начальную позицию и первое значение минимума}

           X:=M[i];

           For J:=i+1 to n do {поиск нового минимального значения}

                      If M[j] < x then

                                     begin

                                     k:=j;

                                     x:=M[k];

                                     end;

           If i<>k then begin

           M[k]:=M[i];{меняем местами i-й и минимальный k-й}

           M[i]:=x; end;

       end;

……

end.

Поиск в массиве.

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

В результате поиска желательно получить индекс искомого элемента, если элемент найден.

Пример – простой перебор в не отсортированном массиве с использование цикла while

{поиск значения X в массиве А}

const n=10;

var   a: array [1..n]  of integer;

 i, X : integer ;found:Boolean ; //признакэлемент найден(true)/не найден(false)

begin

{ввод элементов массива A и значения Х}

  found:=false; //пока не начали поиск – элемент не найден

 i:=1; // поиск начинаем с первого элемента

{условия выполнения цикла while: пока не найдем (not found), пока не переберем все элементы(i<=n) }

 while not found and (i<=n) do

  if a[i] =X then found:=true

  else inc(i);

if found then writeln(‘значение найдено в позиции ‘, i)

else writeln(‘значение не найдено’);

end.

В этом алгоритме выход из цикла осуществляется по двум условиям: элемент найден или достигнут конец массива. В данном примере цикл while можно заменить на цикл for. В данном случае при нахождении искомого элемента необходимо выйти из цикла с помощью процедуры break. Переменная цикла i  не может служить для хранения номера найденного элемента, т.к. ее значение после выхода из цикла неопределенно (это зависит от версии компилятора, от характера оптимизации кода). Поэтому для запоминания номера найденного элемента необходимо ввести дополнительную переменную.

Пример – простой перебор в не отсортированном массиве с использование цикла while

{поиск значения X в массиве А}

const n=10;

var   a: array [1..n]  of integer;

 i, X,p : integer ;found:Boolean ; //признакэлемент найден(true)/не найден(false)

begin

{ввод элементов массива A и значения Х}

 found:=false; //пока не начали поиск – элемент не найден

 for  i:=1  to  n  do

 if a[i] =X then begin 

found:=true; p:=i; break; end;

if found then writeln(‘значение найдено в позиции ‘, p)

else writeln(‘значение не найдено’);

end.

Проверку выхода за границу массива можно опустить (тем самым, уменьшив время проверки), если искомый элемент гарантированно находиться в массиве. Такой гарантией может служить барьер – нулевой элемент массива, значение которого равно искомому элементу. Установка барьера производиться до цикла поиска. Обратите внимание, что нумерация в массиве начинается с нуля, и этот элемент не используется для хранения данных.

{Пример – поиск с барьером}

const n=10;

var   a: array [0..n]  of integer;

 i, X : integer ;

begin

{ввод элементов массива A и значения Х}

 i:=n; // поиск начинаем с последнего элемента массива

 while a[i] <>X do i:=i-1;

 if i<>0 then writeln(‘значение найдено в позиции ‘, i)

else writeln(‘значение не найдено’);

end.

Результат поиска равен либо индексу найденного элемента, либо нулю, т.е. индексу барьера, если в массиве элемента нет. Для поиска в среднем требуется (n=1)/2 сравнений. Таким образом, порядок алгоритма линейный.

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

{Пример -  бинарный поиск}

const n=10;

var   a: array [0..n]  of integer;

 Left ,Right,m,i, X : integer ;

begin

{ввод элементов массива A и значения Х}

Left:=1; Right:=n; // задаем начальные значения левой и правой границ поиска

Repeat

m:=(Left+Right) div 2;// нахождение номера m среднего элемента

 If x>a[m] then 

  Left:=m+1 //новая левая граница поиска

 Else

  Right:=m-1; // новая правая граница поиска

Until (a[m] =x) or (left> right)

if a[m]=X then writeln(‘значение найдено в позиции ‘, m)

 else writeln(‘значение не найдено’);

end.

Условия выхода из цикла – искомый элемент найден (a[m]=X) или уже негде искать (left> right).

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

Матрицы, как и массивы, нужно вводить (выводить) поэлементно. Блок-схема ввода элементов матрицы изображена на рис.7, построчного вывода на рис.8

Рис.7 Ввод элементов матрицы.

Рис.8 Вывод элементов матрицы.

Пример - Ввод элементов матрицы

const n=3;m=5;

var    A: array [1..n,1..m] of integer;{матрица А из n строк и m столбцов}

 i,j:integer;

begin

for i:=1 to n do // цикл по строкам

 for j:=1 to m do // цикл по элементам i-й строки

 begin

write(‘A[‘ , i ,’,’ , j , ’] = ’); readln(A[i,j])

 end;

end.

Пример - Вывод элементов матрицы

const n=3;m=5;

var    A: array [1..n,1..m] of integer;{матрица А из n строк и m столбцов}

 i,j:integer;

begin

…….

for i:=1 to n do // цикл по строкам

begin

 for j:=1 to m do // цикл по элементам i-й строки

  write(A[i,j]:4);

writeln; // после вывода элементов строки переводим курсор на новую строку

end;

end.

Пример – Фрагмент программы, вычисляющей сумму элементов строк матрицы.

for i:=1 to n do // цикл по строкам

begin

 s:=0; // начальное значение суммы для icnhjrb

 for j:=1 to m do // цикл по элементам i-й строки, суммируем элементы

  s:=s+A[i,j];

writeln(‘Сумма строки №’,i,’ = ‘,s); // вывод суммы

end;

Динамические массивы.

Динамические массивы не имеют фиксированного размера или длины. Память для динамического массива выделяется при вызове процедуры SetLength(var S; NewLength: Integer), где параметры S - динамический массив, а NewLength – новое число элементов. Динамический массив определяется следующей структурой:

 array  of  baseType;

Например, такое объявление:

 Var MyArray :array  of  Real;

задает одномерный динамический массив вещественных чисел. Декларация не распределяет память под элементы массива MyArray. Сама переменная MyArray хранит адрес, по которому располагаются элементы массива. В начале программы самого массива не существует. Для того чтобы создать массив в памяти, необходимо вызвать процедуру SetLength(). Например, такой вызов:

 SetLength(MyArray,20);

распределяет массив MyArray из 20-ти вещественных чисел, пронумерованных от 0 до 19. Индекс у динамических массивов всегда целочисленный и начинается с нуля. В процессе выполнения программы размер массива MyArray  можно увеличить с помощью процедура SetLength(), задав новое значение числа элементов  -  SetLength(MyArray,40). Число элементов увеличивается до 40, причем значения первых 20-ти элементов останутся без изменения. В программе не рекомендуется часто увеличивать размер массива на малое число элементов, т.к. изменение размера в большую сторону связано с новым выделением области памяти и копированием туда старых значений массива, с последующим освобождением области памяти, которое они занимали. Такие процедуры могут замедлить выполнение программы. Поэтому лучше увеличивать размер с некоторым запасом.

Для освобождения динамического массива необходимо присвоить переменной массива значение nil (пустой адрес). Динамический массив длины 0 имеет ссылку nil. В программе можно проверить, задан массив или нет сравнив со значением  nil. Например:

If  MyArray=nil then SetLength(MyArray,20);

 При работе с динамическими массивами всегда следует помнить, что переменные хранят ссылки (адреса) на массивы. Поэтому если X и Y – динамические массивы, то оператор X:=Y приведет не к копированию элементов из Y в X, а к распределению элементов X по длине Y (т.е. две переменные будут ссылаться на одну физическую область памяти). Например, после выполнения следующего кода:

Var A, B: array of integer;

Begin

SetLength(A,1);

A[0]:=1;

B:=A;

B[0]:=2;

End.  

получаем,  что величина А[0] будет равна 0. Если бы А и В были статическими массивами, то А[0] было бы равно единице.  Доступ к элементам динамического массива не отличается от доступа к элементам статического массива. Выход за допустимый диапазон индексов не сообщается во время компиляции. В отличие от статических массивов, динамические массивы можно сравнивать  на = и  <>, при этом будут сравниваться ссылки. Таким образом, после выполнения кода:

Var A, B: array of integer;

Begin

SetLength(A,1); SetLength(B,1);

A[0]:=2;B[0]:=2;

End.  

имеем А <>  B, но A[0] = B[0].

Для того чтобы усечь динамический массив, можно использовать функцию Copy(). Например, присваивание A:=Copy(A,0,10) оставляет первые 10 элементов массива А.

Если динамический массив распределен, можно использовать стандартные функции Lenght(), High() и Low(). Функция Lenght() возвращает количество элементов в массиве, High() возвращает самое большое значение индекса массива (равное Lenght()-1), а Low() всегда возвращает 0.

Для объявления многомерного динамического массива повторно используют конструкцию array of …, например, выражение:

 Type Matrix = array of array of integer;

 Var A:Matrix

или  

 Type   Vector = array of integer;

 Matrix = array of vector;

 Var A:Matrix

объявляет двумерный массив (матрицу)  А из целых чисел.

Чтобы выделить память для этого массива, необходимо вызвать процедуру SetLength(A,n,m) с двумя целочисленными параметрами n и m, которые определяют число строк и столбцов в матрице А. Можно создать и непрямоугольный динамический массив. На первом шаге необходимо задать число строк в матрице SetLength(A,9) (задаем 10 строк), далее в цикле зададим число элементов в каждой строке.

For i:=Low(A) to High(A) do 

SetLength(A[i],i+1);

После выполнения цикла в первой строке матрицы А – 1 элемент, во второй – 2 элемента и т.д.

Директива компилятора {$R+}

Директива {$R+} - включить (отключить) контроль границ диапазона.

Синтаксис {$R+} или {$R-}
{$
RANGECHECKS ON} или {$RANGECHECKS OFF}

Значение по умолчанию {$R-}
{$RANGECHECKS OFF}

При включенной директиве в программу добавляется специальный код, проверяющий все операции с массивами на предмет допустимости заданного индекса. Если при обращении к элементу массива задан индекс, выходящий за диапазон допустимых значений, то программа останавливается и выводит сообщение об ошибке. Директиву {$R+} применяют на стадии отладки программы для выявления ошибок при работе с массивами. В окончательном варианте программы директива должна быть выключена {$R-}, т.к. дополнительный код увеличивает размер исполняемого файла и замедляет работу программы.

Задачи.

  1.   Задан массив S(N). Определить максимальный и минимальный элементы массива и их номера. Если таких элементов несколько, то определить сколько их.
  2.  Задан массив S(М). Вычислить сумму двух наибольших элементов массива (М>5).
  3.  Задан массив S(М). Вычислить сумму двух наименьших элементов массива (М>5).
  4.  Задан массив Х(К). Найти разность между средним арифметическим и минимальным элементом массива.
  5.  Задан массив Х(К). Найти разность между средним арифметическим и максимальным элементом массива.
  6.  Задан массив S(К). Найти сумму элементов с четными индексами и произведение элементов с нечетными индексами.
  7.  В массиве Н(N) все отрицательные элементы замените максимальным.
  8.  В массиве Н(N) все положительные элементы замените минимальным.
  9.  В массиве Х(N) поменять местами минимальный и максимальный элементы.
  10.  Задан массив Т(К). Найти минимальный элемент среди элементов с нечетными индексами.
  11.  Задан массив Т(К). Найти максимальный элемент среди элементов с четными индексами.
  12.  Задан массив Р(M). Найти номер элемента, наиболее отличающегося (по модулю) от среднего значения.
  13.  Заданы массивы Х(N), У(N) - координаты точек на плоскости. Определить, какая из точек наиболее  удалена от точки А с координатами (x,y).
  14.  Заданы массивы Х(N), У(N) - координаты точек на плоскости. Определить, какая из точек наименее удалена от точки B с координатами (k,m).
  15.  Задан массив R(K). Вычислить количество элементов, больших среднего арифметического.
  16.  Задан массив R(K). Вычислить сумму элементов, меньших среднего арифметического.
  17.  Найти максимальный по модулю элемент массива X(N) и поставить его первым.
  18.  Найти минимальный по модулю элемент массива X(N) и поставить его последним.
  19.  Найти сумму положительных элементов массива У(K) с нечетными индексами.
  20.  Найти произведение отрицательных элементов массива Z(K) с четными индексами.
  21.  Найти произведение элементов массива H(N), меньших среднего арифметического.
  22.  Определить, какой элемент в массиве H(N) расположен раньше: наибольший или наименьший?
  23.  Найти сумму и произведение отрицательных элементов массива Z(N).
  24.  Задан массив Р(N). Переписать все его элементы, за исключением максимального в массив D.
  25.  Задан массив Р(N). Переписать все его элементы, за исключением минимального в массив D.
  26.  Задан массив U(K). Вычислить количество элементов, принадлежащих интервалу [a,b].
  27.  Задан массив Р(N). Переписать все его элементы, за исключением элементов, принадлежащих интервалу [a,b] в массив D.
  28.  Найти количество элементов массива X(N), больших среднего арифметического.
  29.  Найти количество элементов массива X(N), меньших среднего арифметического.
  30.  Задан массив X(K). Сформировать массив L — номеров положительных элементов массива X.
  31.  Проверить является ли матрица Х(N,N) единичной. Матрица является единичной если диагональные(i=j) элементы равны 1, а все остальные – 0.
  32.  Задана матрица Х(N,M). Найти номер строки с наибольшим средним значением.
  33.  Найти произведение положительных элементов матрицы X(М,N), расположенных по периметру.
  34.  Задана матрица Т(N,М). Вычислить максимальный элемент среди лежащих выше диагонали.
  35.  Задана матрица Т(N,М). Вычислить минимальный элемент среди  лежащих ниже диагонали.
  36.  Задана матрица М(N,M). Сформировать вектор Р(N), куда записать максимальные элементы каждой строки.
  37.  Задана матрица T(N,M). Максимальный элемент в каждой строке заменить на  0.
  38.  Задана матрица T(N,M). Минимальный элемент в каждой строке заменить на 1.
  39.  Задана матрица T(N,M). Сформировать вектор Р(M), куда записать максимальные элементы каждого столбца.
  40.  Задана матрица H(N,N). Найти максимальный и минимальный элементы, среди лежащих на главной диагонали.
  41.  Преобразовать матрицу таким образом, чтобы последний элемент каждой строки был равен среднему арифметическому предыдущих элементов той же строки.
  42.  Задана матрица U(M,M).Найти произведение ненулевых элементов матрицы, лежащих выше главной диагонали.
  43.  Задана матрица U(M,M). Найти сумму элементов матрицы, лежащих ниже главной диагонали.
  44.  Задана матрица U(N,N). Найти максимальный по модулю элемент матрицы и сумму элементов, лежащих на главной диагонали матрицы.
  45.  Задана матрица T(N,N). Сформировать массив Р, куда записать номера тех строк, у которых диагональный элемент больше суммы всех остальных.
  46.  Задана матрица T(N,M). Сформировать вектор Р(N), где Pi -среднее  арифметическое элементов i-ой строки.
  47.  Задана матрица P(N,M). Найти сумму положительных  элементов и произведение отрицательных элементов матрицы.
  48.  Задана матрица T(N,M).Поменять местами К-ю и L-ю строки.(Предварительно проверив существование строк с номерами K и L)
  49.  Задана матрица P(N,M). Вывести номера строк, не содержащих нулевые элементы.
  50.  Задана матрица P(N,M). Вывести номера столбцов, не содержащих нулевые элементы.


 

А также другие работы, которые могут Вас заинтересовать

50519. Закрытый склад. Расчет деревянной конструкции 373.77 KB
  В курсовом проекте произведен расчет деревянных конструкций гнутоклееной рамы. Определены расчетные и нормативные нагрузки на перекрытие и поперечную раму здания. Подобрано сечение элементов поперечника. Выбраны конструктивные решения. Осуществлены расчеты узлов поперечника.
50520. Исследование процессов во влажном воздухе 138.5 KB
  Изучение процессов изменения состояния влажного воздуха приобретение навыков измерения влажности с помощью аспирационного психрометра и Id диаграммы. Смесь сухого воздуха с водяным паром называется влажным воздухом. Соответственно этому влажный воздух бывает: насыщенным влажным воздухом – смесь сухого воздуха с насыщенным водяным паром; ненасыщенным влажным воздухом – смесь сухого воздуха с перегретым водяным паром. При дальнейшем охлаждении влажного воздуха происходит конденсация пара.
50521. Определение настроек BIOS персонального компьютера 62 KB
  Раздел Power Параметр CPI PIC support установлен в положение Enbled разрешено. Возможные значения: Enbled Disbled. Следует оставить данный параметр без изменений Enbled поскольку данным процессором используется технология HyperTreding в противном случае можно нарушить нормальное функционирование системы либо снизить ее производительность. Параметр Microcode Updtion установлен в положение Enbled.
50523. ДОСЛІДЖЕННЯ ПРИНЦИПІВ РОБОТИ ВИМІРЮВАЛЬНИХ КАНАЛІВ ТЕМПЕРАТУРИ НА БАЗІ МІКРОПРОЦЕСОРНОГО ВИМІРЮВАЧА-РЕГУЛЯТОРА ТРМ1 869.5 KB
  Ознайомлення з методами вимірювання температури. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ Методи вимірювання температури і температурні шкали Виміряти температуру якогонебудь тіла безпосередньо тобто так як вимірюють інші фізичні величини наприклад довжину масу обєм або час не представляється можливим тому що в природі не існує еталона або зразка одиниці цієї величини. Тому визначення температури речовини роблять за допомогою спостереження за зміною фізичних властивостей іншої так званої термометричної речовини яка при зіткненні з нагрітим...
50525. Склад сыпучих материалов. Расчет деревянных конструкций поперечника 276.98 KB
  В данном курсовом проекте подобрано наиболее рациональное кон-структивное решение проектируемого здания, сконструированы и рассчитаны основные несущие и ограждающие конструкции, узловые соединения, выбраны мероприятия по защите элементов здания от гниения и возгорания. Все принятые конструктивные решения и расчетные алгоритмы соответствуют требованиям действующих нормативных документов
50526. Исследование системы управления виртуальной памятью Windows с использованием системного монитора 777 KB
  Целью работы является исследование системы управления виртуальной памятью в ОС Windows, а также оценка эффективности работы в режиме страничного обмена программ с известным распределением обращений к памяти (сортировок). Для этого используются стандартные средства администрирования...
50527. Моделирование работы программ в виртуальной памяти и исследование эффективности их выполнения 37 KB
  Задание Собирать статистику работы по каждому исследуемому алгоритму для заданного ряда процентного объема физической памяти например 2510153550759095100 и всех алгоритмов вытеснения LRU FIFO OPT FRU. Выводы Сортировка выбором: трудоёмкость N2 2 алгоритм неадаптивный показатели эффективности алгоритмов LRU и FIFO практически одинаковы аномальный алгоритм замещения FRU превосходит по эффективности LRU и FIFO реально применимые алгоритмы LRU и FIFO уступают теоретическому максимуму в 23 раза что говорит об их...