78206

Массивы: определение, описание, размещение в памяти, использование

Лекция

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

Массивы: определение описание размещение в памяти использование. Цель: дать определение массиву сформировать знания о массивах приемы составления блок-схем алгоритмов изучить приемы составления программ с использованием массивов. Группа переменных в данном...

Русский

2015-02-07

143 KB

2 чел.

екция: Массивы: определение, описание, размещение в памяти, использование.    Страница 7 из 7

Оглавление

[1] Оглавление

[2] Массивы. Одномерные массивы. Понятие о массиве

[3] Описание массивов

[4] Действия над элементами массива

[5] Использование значений массивов, ввод и вывод значений массивов

[6]    Двумерные массивы

[7] Полная переменная

[8] Примеры использования массивов

[9] Контрольные вопросы

Комбинированный урок №8

Тема: Массивы: определение, описание, размещение в памяти, использование.

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

Массивы. Одномерные массивы. Понятие о массиве

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

    МАССИВ - упорядоченная группа фиксированного количества переменных одного типа, имеющая общее имя.

   "Группа переменных" в данном смысле означает, что каждый элемент массива является переменной, для хранения значения которой в памяти отводится определенная область.

   "Упорядоченная"- означает, что переменные в массиве хранятся не хаотично, а в установленном порядке, по очереди.

   "Фиксированное количество" означает, что количество переменных в массиве не бесконечно, оно ограничено определенным числом (размерностью массива), которое указывается при описании массива.

   "Одного типа" - означает, что переменные, входящие в массив, должны хранить данные одного типа (Real, Integer, Char, Boolean и т.д.), который называется типом элементов массива.

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

   Над переменными, составляющими массив (над элементами массива) можно выполнять те же действия, что и над обычными переменными - присваивать и считывать значения, преобразовывать значения и сравнивать их.

   Каждый элемент массива имеет свое имя, представляющее собой имя массива и стоящие за ним квадратные скобки, в которых указывается индекс элемента - целое число, равное порядковому номеру этого элемента в массиве. Таким образом, для ссылки на отдельный элемент массива используется запись вида: имя массива[индекс]. Например: A[1], D[24], Massiv[5], Mas[12].

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

   В этой программе для хранения в памяти количества киловатт- часов ежедневного потребления энергии можно было бы предусмотреть отдельные переменные:

KWatt1

KWatt2

KWatt3

...

KWatt30

KWatt31

   Такой подход возможен, и ошибки в нем нет, но в этом случае неудобно оперировать данными в виде отдельных переменных: описание большого количества переменных будет громоздким, перебор и сравнение переменных - трудоемким. Между тем указанные переменные содержат однотипные данные, несущие информацию одного и того же характера. В подобных случаях информацию удобнее хранить в массиве, представляющем собой таблицу с одной строкой (вектор), имеющую 31 столбец (по числу дней в месяце):

Массив “KWatt”:

KWatt[1]

KWatt[2]

KWatt[3]

...

KWatt[31]

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

..................

{начальное значение счетчика цикла равно 1}

i:=1;

{начальное значение переменной Max, предназначенной}

Max:=0;

{для хранения максимального значения массива, равно 0}

REPEAT

{начинаем цикл}

IF KWatt[i]>Max 

{если значение очередного элемента массива}

     THEN

{превышает текущее значение переменной Max,}

          Max:=KWatt[i];

{то переменная Max меняет свое значение на}

{значение элемента массива}

i:=i+1

{увеличиваем значение счетчика на единицу}

UNTIL i>31;

{цикл заканчивается, если значение счетчика цикла превысит число 31}

..................

без труда догадаемся, что здесь идет поиск максимального числа (Max) из набора однотипных данных (KWatt[i]).

Описание массивов

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

Возможны два способа описания массивов:

Type имя типа = Array[t ,t1 ,...,tn ] Of тип элементов;

Var имя массива : имя типа;

или

Var имя массива:Array[t ,t1,...,tn ] Of тип элементов;

здесь t , t1 ,...,tn - типы индексов массива (любой скалярный тип, кроме real) или размерность.

    К имени массива предъявляются те же требования, что и к имени переменной.

    Размерность - это диапазон целых чисел, каждое из которых является порядковым номером (индексом) одной из ячеек массива. Обычно диапазон индексов задают, начиная от единицы: [1..100]. Это удобно, но не обязательно. Важно лишь, чтобы правая граница диапазона была больше или равна левой границе.

Program Primer;

Const Max=100;

Var A:Array[1..50] of Real;

{массив "А" состоит из 50-ти вещественных чисел}

B:Array[1..Max] of integer;

{массив "В" состоит из ста целых чисел}

Mas:Array[1999..2000] of integer;

{массив "Mas" состоит из 2-х целых чисел}

Mas2:Array[-700..-1] of Real;

{массив "Mas2" состоит из 700 вещественных чисел}

...................................

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

Если в описании массива задан один индекс, массив называется одномерным, если два индекса - двумерным, если n индексов — n-мерным массивом. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный - понятию прямоугольной таблицы (матрицы, набору векторов). Размерность ограничена только объемом памяти конкретного компьютера.

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

Например, одномерные массивы:

Type

Klass = (К1, К2, КЗ, К4) ;

Znak = array [1..255] of char;

Var

Ml   :  Znak;          {Тип Znak предварительно описан в разделе типов}

М2  :  array[1..60] of integer;          {Прямое описание массива М2}

МЗ  :  array[1..4] of Klass;

Mas :  array[1..4] of integer;

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

Двумерные массивы:

Type

Vector = array[1..4] of integer;

Massiv = array[1..4] of Vector;

Var

Matrix : Massiv;

Ту же структуру можно получить, используя другую форму записи:

Var

Matrix : array[1..4,1..4] of integer ;

Для описания массива можно использовать предварительно определенные константы:

Const

G1 = 4; G2 = 6;

Var

MasY: array[1..Gl, l..G2] of real;

Элементы массива располагаются в памяти последовательно. 

Например, если имеется массив: A:array[1..5,1..5] of integer; 

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

А[1,1] А[1,2] … А[1,5] А[2,1] А[2,2] … А[5,5]

Контроль правильности значений индексов массива может проводиться с помощью директивы компилятора R. По умолчанию директива R находится в пассивном состоянии {$R-}. Перевод в активное состояние вызывает проверку всех индексных выражений на соответствие их значений диапазону типа индекса. Действия над массивами

Для работы с массивом как единым целым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения "равно", "не равно" и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т. е. иметь одинаковые типы индексов и одинаковые типы компонентов.

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

Var

А, В : array[1..20] of real;

то применение к ним допустимых операций даст следующий результат:

Выражение   Результат

А=В True, если значение каждого элемента массива А равно соответствующему значению элемента массива В

А<>В True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В

А:=В  Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.

Действия над элементами массива

После объявления массива каждый его элемент можно обработать, указав идентификатор (имя) массива и индекс элемента в квадратных скобках. Например, запись Mas[2], Vector[10] позволяет обратиться ко второму элементу массива Mas и десятому элементу массива Vector. При работе с двумерным массивом указываются два индекса, с n-мерным массивом - n индексов. Например, запись Matr[4,4] делает доступным для обработки значение элемента, находящегося в четвертой строке четвертого столбца массива Matr.

Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах for, while, repeat, входить в качестве параметров в операторы Read, Readin, Write, Writeln; им можно присваивать любые значения, соответствующие их типу.

Рассмотрим типичные ситуации, возникающие при работе с данными типа array. Для этого опишем три массива и четыре вспомогательные переменные:

Var             

A,D     : array[l..4] of real;

В       : array[1..10,1..15] of integer;

I, J, К : integer;

S : real;

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

Инициализация элементов одномерного массива А:

for I := 1 to 4 do A[I] := 0;

Для инициализации двумерного массива обычно используется вложенный оператор for, например:

Инициализация двумерного массива В:

for I := I to 10 do

for J := 1 to 15 do B[I,J]:= 0;

 Использование значений массивов, ввод и вывод значений массивов

  Для ссылки на отдельные элементы массива используется переменная с индексом: Имя массива[индекс]. Чтобы получить доступ к конкретному элементу массива, в качестве индекса можно использовать не только целое число, соответствующее порядковому номеру этого элемента в массиве, но и выражение, значение которого равно упомянутому целому числу.

Например, при обращении к элементам некоторого массива "A: Array[1..100] of Real", в качестве индекса можно использовать любое арифметическое выражение, значением которого будет целое число из диапазона 1..100:

A[56]; A[i+7]; A[i div j] .

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

Read(A[3]); { ввод значение третьего элемента вектора А } 

Read(B[6,9]);{ ввод значение элемента, расположенного в шестой строке девятого столбца матрицы В }

Оба значения набираются на одной строке экрана, начиная с текущей позиции расположения курсора.

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

Program Vvod_Vivod;

Var i:integer;

A:Array[1..20] of Real;

B:Char;

Begin

     Writeln('Введите числа в массив: ');

     FOR i:=1 TO 20 DO

     begin Write('A[',i,']= '); Readln(A[i]) end;

     Writeln('Массив заполнен, будете выводить');

     Write('значения на экран? ("Y"-да, "N"-нет)=>');

     Readln(B);

     IF UpCase(B)="Y" THEN

{если прописной вариант введенной}

           FOR i:=1 TO 20 DO Writeln('A[',i,']=',A[i]:6:2);

{буквы является "Y", то}

Readln

End.

   Двумерные массивы

    Одномерный массив (вектор) имеет вид таблицы из одной строки, ячейки которой заполнены значениями. Рассматривая ДВУМЕРНЫЙ массив, можно провести аналогию с таблицей, имеющей несколько строк и столбцов. Если отдельный элемент одномерного массива обозначали именем массива с индексом (А[i]), то для обозначения элемента двумерного массива (матрицы) потребуются два индекса: один - для указания номера строки, другой - для указания номера столбца, на пересечении которых находится нужный элемент: А[i,j]. Двумерные массивы описываются сходно с массивами одномерными:

Const Str=4; Stolb=5;

Var A:Array[1..Str,1..Stolb] of Real;

    Заполнение двумерных массивов данными и вывод данных из двумерного массива осуществляется с использованием двух циклов, один из которых вложен в другой. Внутренний цикл перебирает индексы столбцов, наружный - индексы строк:

FOR i:=1 TO Str DO

         FOR j:=1 TO Stlb DO Readln(A[i,j]);

...............

FOR i:=1 TO Str DO

         FOR j:=1 TO Stlb DO Writeln('A[',i,',',j,']=',A[i]:6:2);

    здесь Str - число строк, Stlb - число столбцов.

Пример:

В программе необходимо описать двухмерный массив целых чисел:

4   0   7

2   1   5

Описание этого массива в соответствии с первым способом выглядит следующим образом:

Type mas = Array[1..2,1..3] Of Byte;

Var M : mas;

Для второго способа имеем:

Var M : Array[1..2,1..3] Of Byte;

Для обращения в программе к элементу во второй строке и третьем столбце используется запись M[2,3].

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

Min := A[2*i]+1.3;  {присвоить переменной Min значение элемента A c номером i*2, увеличенное на 1.3}

Sum := Sum - C[k]; {уменьшить значение в переменной Sum на значение из элемента C c номером k}

Rez := B[4] + 5.2; {присвоить переменной Rez значение элемента B c номером 4, увеличенное на 5.2}

Пример описания трехмерного массива:

Var A : Array[char,boolean,1..10 ] of Real;

В этом случае при использовании в программе элемента A [i,j,k] индексы i,j,k должны быть следующих типов: i - символьного, j - логического, k - интервального.

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

Например,

цикл  For k := 1 To 13 Do Read(C[k]); организует ввод 13 значений элементов массива С,

а цикл  For k := 1 To 13 Do Write(C[k],' '); – вывод этих элементов.

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

Type имя типа = Array[тип индекса] Of базовый тип элементов;

Const имя константы : имя типа = (список констант);

или

Const имя константы : Array[тип индекса] Of базовый тип элементов = (список констант);

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

2 3 15 4   

7 18 23 5

1 9 11 10

32 16 6 4

будет выглядеть следующим образом:

Const M : Array[1..4,1..4] Of Byte = (( 2, 3, 15, 4), ( 7, 18, 23, 5), ( 1, 9, 11, 10), (32, 16, 6, 4));

В языке Паскаль допускается использование массива в целом только в операторе присваивания вида:

M1 := M2;

где M1, M2 - два однотипных массива одинаковой размерности.

Полная переменная

    Массив можно рассматривать не только как группу однотипных переменных, но и как единое целое, как одну переменную. Значением этой особой переменной является весь массив. Такую переменную называют ПОЛНОЙ.

    Если полные переменные А и В имеют один и тот же тип (были описаны одинаково) и всем элементам массива "А" были присвоены значения, то для присвоения полной переменной "В" точно такого же значения достаточно выполнить оператор присваивания В:=А.

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

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

    Над значениями полных переменных в Паскале не выполняются операции сравнения.

    Если в левой части оператора присваивания стоит полная переменная, то в правой части может фигурировать только полная переменная того же типа. Например, при наличии в программе следующего описания переменных

VAR X:Real;

                Y:Array[1..1] of Real;

недопустимы операторы присваивания

X:=Y; Y:=X; X:=Y+0.5; Y:=3.14159;

 Примеры использования массивов

  1.  Попарное суммирование элементов массивов А и В.

Program Prim1;

Const N=10;

Var i:integer;

A,B,C:Array[1..N] of Real;

Begin

        FOR i:=1 TO N DO

        begin

                 Write('A[',i,']= '); Readln(A[i]);

                 Write('B[',i,']= '); Readln(B[i])

        end;

        FOR i:=1 TO N DO C[i]:=A[i]+B[i];

        Writeln('----------------------------------');

        FOR i:=1 TO N DO Writeln('C[',i,']=',C[i]:6:1);

        Readln

End.

2. Объединить в массиве “С” массивы “А” и “В” так, чтобы их элементы чередовались: элементы из массива “А” занимали нечетные ячейки, а элементы массива “В” - четные.

Program Prim2;

Const N=10;

Var i:integer;

A,B:Array[1..N] of Real;

C:Array[1..N*2] of Real;

Begin

         FOR i:=1 TO N DO

         begin

                 Write('A[',i,']= '); Readln(A[i]);

                 Write('B[',i,']= '); Readln(B[i])

         end;

         FOR i:=1 TO N DO

         begin

                 C[2*i-1]:=A[i];

                 C[2*i]:=B[i]

         end;

         Writeln('------------------------------');

          FOR i:=1 TO 2*N DO Writeln('C[',i,']=',C[i]:6:1);

          Readln

End.

3. Пример программы ввода-вывода одномерного массива

program priimer1;

uses crt;

var

mas : array [1..10] of integer; {Описание одномерного массива с именем mas, состоящего из 10

элементов типа integer}

n,i : integer;            {n-количество элементов массива, i-счетчик в цикле for}

BEGIN

clrscr;

writeln('Введите количество элементов массива не больше 10: ');

readln(n);

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

begin

writeln('Введите  ',i,' элемент массива');

readln(mas[i]);

end;   {конец ввода}

writeln('Введенный массив: ');

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

write(' ',mas[i],' ');

readkey; {конец вывода}

END.

4. Пример программы ввода-вывода двумерного массива

program primer2;

uses crt;

var

i,j,n,m:integer;

massiv:array[1..10,1..10] of integer; {описан двумерный массив с именем massiv}

BEGiN

clrscr;

write('Введите количество строк массива (не больше 10): ');

read(n);      {n-количество строк}

write('Введите количество столбцов массива (не больше 10):');

read(m);    {m-количество столбцов}

for i:=1 to n do {ввод элементов двумерного массива}

begin

  for j:=1 to m do

     read(massiv[i,j]);

end;    {конец ввода}

writeln('Введенный массив: ');

for i:=1 to n do {вывод элементов двумерного массива}

 begin

  for j:=1 to m do

      write(massiv[i,j]:5);

end;     {конец вывода}

readkey;

END.

5. В квадратной матрице n-го порядка найти и вывести на экран строку, сумма элементов которой максимальна.

Program matrica;

Сonst Nmax = 20;

Var A : Array [1..nmax, 1..nmax ] Of Real;

i,j,N,Nstr : Byte;

S,Smax : Real;

Begin

Writeln ('Ввести порядок матрицы <= ',nmax,' )');

Readln (n);

For i:=1 To N Do

Begin

Writeln ('Введите элементы ',i,'-й строки ');

For j:=1 To N Do Read (A[i,j]);

S:=0;

For j:=1 To N Do S:=S + A[i,j]; {накопление суммы элементов матрицы}

If i=1 Then

Begin   

Nstr:=1; {если это первый элемент столбца, то запомнить в S максимальное значение суммы}

{элементов строки}

Smax:=S;

End

Else if S > Smax Then

Begin  {сумма элементов текущей строки >, то заменить на бóльшую для дальнейшего сравнения}

Nstr:=i;

Smax:=s;

End;

End;

Writeln ( 'Номер строки = ',nstr );

For j:=1 To N Do Write (A[nstr,j]:10:3); {вывод элементов указанной строки}

Writeln;

End.

Контрольные вопросы

  1.  Массивы. Основные понятия. Приведите определение массива.
  2.  Формат записи массивов. Описание одномерного и двумерного массивов.
  3.  Действия над массивами. Действия над элементами массивов.
  4.  Как описать типизированную константу типа «многомерный массив»?
  5.  Какой тип данных можно использовать в качестве индексов элементов массивов?
  6.  Примеры описания и ввода-вывода линейного и двумерного массивов.


 

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

49910. Методы локализации неисправностей на аппаратуре СВ и РМ 739.72 KB
  Задано внешнее проявление неисправности: В кабине 49Л6 на экране ЭЛТ БИВ АРМ отображается только таблично знаковая информация. Краткое описание тракта прохождения сигнала Тракт прохождения сигнала при отображении информации в режиме ЛУПА x2 и ЛУПА x4 включает следующие устройства: БИВ БГЗ ЦВУ Опишем предназначение и состав устройств участвующих в тракте прохождения данных: Блок индикатора вспомогательный БИВ предназначен для отображения справочной вспомогательной информации а также вторичной радиолокационной информации в режиме...
49911. ОПРЕДЕЛЕНИЕ ТИПА МЫШЛЕНИЯ ЧЕЛОВЕКА 2.08 MB
  Можно сделать вывод что задача успешно решена то есть с помощью нейронной сети мы можем однозначно определить доминирующий тип мышления испытуемого а так же понять на сколько развиты другие типы мышления данного человека. Целью данной работы является попытка использования нейронных сетей в психологии а точнее для определения типа мышления человека. На основе полученных результатов можно будет сказать какие профессии предпочтительнее для данного человека с тем или иным типом мышления.
49912. Определение вероятности получить работу с помощью нейросетевых технологий 372 KB
  Методы искусственного интеллекта позволили создать эффективные компьютерные программы в самых разнообразных, ранее считавшихся недоступными для формализации и алгоритмизации, сферах человеческой деятельности, таких как медицина, биология, социология, культурология, политология, экономика, бизнес, криминалистика и т.п. идеи обучения...
49913. Создание нейронной сети в среде Нейросимулятор v 1.0 789 KB
  Нейронные сети на финансовом рынке Обзор основных нейропакетов. Архитектура сети. Обучение сети Тестирование. Но по сей день нейросети воспринимаются как перспективный но экзотический слабо изученный на российском рынке инструмент.
49914. Методы фокус-групп для сбора социологической информации 177 KB
  Место фокус-групп в системе социологических и маркетинговых методов Понятие метода фокус-групп Соотношение фокус-групп с групповыми методами и интервью Соотношение фокус-групп и наблюдения
49915. Овариоэктомия кошки 425 KB
  Оба длинных тонких рога матки cornu uteri имеют одинаковую толщину и трубчатую форму но не всегда одинаковую длину. Диаметр рога матки у небеременной кошки составляет 34 мм длина рогов матки колеблется между 90 и 100 мм. Каждый рог матки описывает выгнутую вентрально дугу; в каудальной части оба рога матки соединяются. Затем они сливаются полностью образуя тело матки corpus uteri.
49916. Разработка элементов систем искусственного интеллекта с использованием логической модели представления знаний 283.52 KB
  Используя предикаты parent(symbol,symbol), man(symbol), woman(symbol), married(symbol,symbol), записать факты, описывающие Вашу семью. Записать 8 правил вывода для любых родственных отношений в Вашей (или вымышленной)семье (например: мать, отец, сестра, брат, племянница, племянник, тетя, дядя, внучка, внук, бабушка, дедушка, двоюродная сестра, двоюродный брат и т.д.).
49917. Разработка элементов систем искусственного интеллекта с использованием логической модели представления знаний 320.9 KB
  По заданию было построено дерево родственных отношений, составлено 19 фактов и 13 правил, которые описывают родственные связи в моей семье. Используя язык логического программирования Prolog, написана программа, в которой отображаются все родственные отношения с помощью заданных правил и фактов. Использовались такие предикаты, как parent(string, string), man(string), woman(string), married(string ,string).