Реферат: Одномерные и двумерные массивы (таблицы)

Массив— это пронумерованная последовательность величин одинакового типа, обозначаемаяодним именем. Элементы массива располагаются в последовательных ячейках памяти,обозначаются именем массива и индексом. Каждое из значений, составляющихмассив, называется его компонентой (или элементом массива).

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

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

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

Пример:числовая последовательность четных натуральных чисел 2, 4, 6, ..., Nпредставляет собой линейный массив, элементы которого можно обозначить А[1]=2,А[2]=4, А[3]=6, ..., А[К]=2*(К+1), где К — номер элемента, а 2, 4, 6, ..., N —значения. Индекс (порядковый номер элемента) записывается в квадратных скобкахпосле имени массива.

Например,A[7] — седьмой элемент массива А; D[6] — шестой элемент массива D.

Дляразмещения массива в памяти ЭВМ отводится поле памяти, размер которогоопределяется типом, длиной и количеством компонент массива. В языке Pascal этаинформация задается в разделе описаний. Массив описывается так:

 имямассива: Array [начальное значение индекса… конечное значение индекса] Ofбазовый тип;

Например,

 Var B: Array [1..5] Of Real, R: Array [1..34] Of Char;

—описывается массив В, состоящий из 5 элементов и символьный массив R, состоящийиз 34 элементов. Для массива В будет выделено 5*6=30 байт памяти, для массива R— 1*34=34 байта памяти.

Базовыйтип элементов массива может быть любым, за исключением файлового.

Заполнитьмассив можно следующим образом:

1)с помощью оператора присваивания. Этот способ заполнения элементов массиваособенно удобен, когда между элементами существует какая-либо зависимость,например, арифметическая или геометрическая прогрессии, или элементы связанымежду собой реккурентным соотношением.

Задача1. Заполнить одномерный массив элементами, отвечающими следующему соотношению:

a1=1; a2=1; ai=ai-2+ai-1 (i = 3, 4, ..., n).

Read(N);{Ввод количества элементов}

A[1]:= 1;

A[2]:= 1;

FOR I := 3 TO N DO

     A[I] := A[I — 1] + A[I — 2];

Другойвариант присваисвания значений элементам массива — заполнение значениями,полученными с помощью датчика случайных чисел.

Задача2. Заполнить одномерный массив с помощью датчика случайных чисел таким образом,чтобы все его элементы были различны.

Program Create;

Type Mas = Array[1..100] Of Integer;

Var A: Mas; I, J, N: Byte; Log: Boolean;

Begin

    Write(''); ReadLn(N);

    randomize; A[1] := -32768 + random(65535);

    For I := 2 To N Do

    Begin

        Log := True;

        Repeat

            A[i] := -32768 + random(65535); J := 1;

            While Log and (j <= i — 1) Do

            begin Log := a[i] <> a[j]; j := j + 1 End

        Until Log

    End;

    For i := 1 to N Do Write(a[i]:7); writeln

End.

2)ввод значений элементов массива с клавиатуры используется обычно тогда, когда междуэлементами не наблюдается никакой зависимости. Например, последовательностьчисел 1, 2, -5, 6, -111, 0 может быть введена в память следующим образом:

Program Vvod;

 Var N, I: Integer;

     A: Array [1..20] Of Integer;

Begin

  Write('Введите количество элементов массива ');  ReadLn(N);

  FOR I := 1 TO N DO

  Begin

   Write('Введите A[', I, '] ');ReadLn(A[I])

End.

Надэлементами массивами чаще всего выполняются такие действия, как

а)поиск значений;

б)сортировка элементов в порядке возрастания или убывания;

в)подсчет элементов в массиве, удовлетворяющих заданному условию.

Cуммуэлементов массива можно подсчитать по формуле S=S+A[I] первоначально задав S=0.Количество элементов массива можно подсчитать по формуле К=К+1, первоначальнозадав К=0. Произведение элементов массива можно подсчитать по формуле P = P *A[I], первоначально задав P = 1.

Задача3. Дан линейный массив целых чисел. Подсчитать, сколько в нем различных чисел.

{Подсчетколичества различных чисел в линейном массиве.

 ИДЕЯРЕШЕНИЯ: заводим вспомогательный массив, элементами

 которогоявляются логические величины (False — если элемент

 ужевстречался ранее, True — иначе)}

Program Razlichnye_Elementy;

Var I, N, K, Kol: Integer;

     A: Array [1..50] Of Integer;

     Lo: Array [1..50] Of Boolean;

Begin

 Write('Введите количество элементов массива: '); ReadLn(N);

   FOR I := 1 TO N DO

     Begin

      Write('A[', I, ']='); ReadLn (A[I]);

      Lo[I] := True; {Заполняем вспомогательный массивзначениями True}

    End;

 Kol := 0; {переменная, в которой будет храниться количество различных чисел}

 FOR I := 1 TO N DO

   IF Lo[I] THEN

    Begin

     Kol := Kol + 1;

     FOR K := I TO N DO

 {Во вспомогательный массив заносим значение False,

 если число уже встречалось ранее или совпадает с текущим элементом A[I]}

      Lo[K] := (A[K] <> A[I]) And Lo[K];

    End;

 WriteLn('Количество различных чисел: ', Kol)

END.

Тест:N = 10; элементы массива — 1, 2, 2, 2, -1, 1, 0, 34, 3, 3. Ответ: 6.

Задача4. Дан линейный массив. Упорядочить его элементы в порядке возрастания.

{Сортировкамассива выбором (в порядке возрастания).

 Идеярешения: пусть часть массива (по K-й элемент включительно)

 отсортирована.Нужно найти в неотсортированной части массива

 минимальныйэлемент и поменять местами с (K+1)-м}

Program Sortirovka;

Var N, I, J, K, Pr: Integer; A: Array [1..30] Of Integer;

Begin

Write('Введитеколичество элементов: '); ReadLn(N);

  For I := 1 To N Do

    Begin

     Write('Введите A[', I, '] ');Readln(A[I]);

    End;

   WriteLn;

   For I := 1 To N — 1 Do

    Begin

     K := I;

     For J := I + 1 To N Do If A[J] <= A[K] Then K := J;

     Pr := A[I]; A[I] := A[K]; A[K] := Pr;

    End;

    For I := 1 To N Do Write(A[I], ' ');

  End.

Тест:N = 10; элементы массива — 1, 2, 2, 2, -1, 1, 0, 34, 3, 3.

Ответ:-1, -1, 0, 1, 2, 2, 2, 3, 3, 34.

Еслидва массива являются массивами эквивалентых типов, то возможно присваиваниеодного массива другому. При этом все компоненты присваиваемого массивакопируются в тот массив, оторому присваивается значение. Типы массивов будутэквивалентными, если эти массивы описываются совместно или описываютсяидентификатором одного и того же типа. Например, в описании

Type Massiv = Array[1..10] Of Real;

Var A, B: Massiv; C, D: Array[1..10] Of Real; E: Array[1..10] OfReal;

типыпеременных A, B эквивалентны, и поэтому данные переменные совместимы поприсваиванию; тип переменных C, D также один и тот же, и поэтому данныепеременные также совместны по присваиванию. Но тип переменных C, D неэквивалентен типам переменных A, B, E, поэтому, например, A и D не совместны поприсваиванию. Эти особенности необходимо учитывать при работе с массивами.

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

Например,данные о планетах Солнечной системы представлены следующей таблицей:

Планета Расст. до Солнца Относ. обьем Относ. масса Меркурий 57.9 0.06 0.05 Венера 108.2 0.92 0.81 Земля 149.6 1.00 1.00 Марс 227.9 0.15 0.11 Юпитер 978.3 1345.00 318.40 Сатурн 1429.3 767.00 95.20

Ихможно занести в память компьютера, используя понятие двумерного массива.Положение элемента в массиве определяется двумя индексами. Они показывают номерстроки и номер столбца. Индексы разделяются запятой. Например: A[7, 6], D[56,47].

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

ProgramVvod2;

 VarI, J: Integer;

    A: Array [1..20, 1..20] Of Integer;

 Begin

  FOR I := 1 TO 3 DO

   FOR J := 1 TO 2 DO A[I, J] := 456 + I

 End.

элементымассива примут значения A[1, 1] = 457; A[1, 2] = 457; A[2, 1] = 458; A[2, 2] =458; A[3, 1] = 459; A[3, 2] = 459.

Приописании массива задается требуемый объем памяти под двумерный массив,указываются имя массива и в квадратных скобках диапазоны изменения индексов.

Привыполнении инженерных и математических расчетов часто используются переменныеболее чем с двумя индексами. При решении задач на ЭВМ такие переменныепредставляются как компоненты соответственно трех-, четырехмерных массивов ит.д.

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

Задача5. Заполнить матрицу порядка n по следующему образцу:

1 2 3 ... n-2 n-1 n 2 1 2 ... n-3 n-2 n-1 3 2 1 ... n-4 n-3 n-2 ... ... ... ... ... ... ... n-1 n-2 n-3 ... 2 1 2 n n-1 n-2 ... 3 2 1

ProgramMassiv12;

  Var I, J, K, N: Integer; A: Array [1..10, 1..10] Of Integer;

  Begin

  Write('Введите порядок матрицы: '); ReadLn(N);

   For I := 1 To N Do

     For J := I To N Do

      Begin

       A[I, J] := J — I + 1; A[J, I] := A[I, J];

      End;

     For I := 1 To N Do

      Begin

       WriteLn;

       For J := 1 To N Do Write(A[I, J]:4);

      End

 End.

Задача6. Дана целочисленная квадратная матрица. Найти в каждой строке наибольшийэлемент и поменять его местами с элементом главной диагонали.

Program Obmen;

 Var N, I, J, Max,Ind, Vsp: Integer;A: Array [1..15, 1..15] OfInteger;

 Begin

 WRITE('Введите количество элементов в массиве: '); READLN(N);

 FOR I := 1 TO N DO

  FOR J := 1 TO N DO

  Begin

   WRITE('A[', I, ',', J, '] '); READLN(A[I, J])

  End;

 FOR I := 1 TO N DO

 Begin

  Max := A[I, 1]; Ind := 1;

   FOR J := 2 TO N DO

      IF A[I, J] > Max THEN

       Begin

        Max := A[I, J]; Ind := J

       End;

   Vsp := A[I, I]; A[I, I] := A[I, Ind]; A[I, Ind] := Vsp

  End;

     FOR I := 1 TO N DO

      Begin

       WriteLn;

       FOR J := 1 TO N Do Write(A[I, J]: 3);

      End; WriteLn

 End.

Список литературы

Дляподготовки данной работы были использованы материалы с сайтаhttp://comp-science.narod.ru

еще рефераты
Еще работы по информатике, программированию