Файл: Особенности и примеры использования массивов при разработке программ (Языки программирования).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 17.05.2023

Просмотров: 57

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

2.1. Классификация массивов

Массивы бывают четырёх видов (рис.7).

Их достоинства и недостатки:

  • Статические и константные массивы всегда имеют фиксированный размер
  • Динамические массивы делают работу с данными более гибкой, так как не требуют предварительного определения хранимых объёмов данных, а позволяют регулировать размер массива в соответствии с реальными потребностями.
  • Гетерогенные массивы удобны как универсальная структура для хранения наборов данных произвольных типов. Реализация гетерогенности требует усложнения механизма поддержки массивов в трансляторе языка.

Рисунок 7- Виды массивов

2.2.Типы массивов

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

Рисунок 8 - Типы массивов( а-одномерный, b –двумерный, с-трёхмерный)

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

Одномерные массивы (вектора) – это массивы, в которых элементы нумеруются одним индексом.

Массив определяется именем (идентификатором) и количеством размерностей (координат), необходимых для указания местонахождения требуемого элемента массива. Имя массива является единым для всех его элементов[9].

Массив должен обозначаться одним именем. Так всю совокупность чисел 1, 6, 15.9, -15, 28.15, 0.33 можно назвать массивом и дать ему имя, например В. Образующие массив переменные будут называться элементами массива В.

Каждый элемент массива обозначается именем массива с индексом, заключенным в круглые скобки. В(1), В(2), В(3), ..., В(n).

Индекс показывает на каком месте находиться элемент массива относительно его начала. Для рассмотренной выше совокупности данных элементами массива В будут являются: В(1)=1, В(2)=6, В(3)=15.9, В(4)=-15, В(5)=28.15 ,В(6)=0.33.

При работе с массивами используются в основном счётные циклы.


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

В качестве номера (индекса) элемента массива используется выражение порядкового типа (чаще integer).

Таблица 5. Синтаксис объявления одномерного массива[10]:

СИ:

Basic

Pascal

тип_данных имя_массива[размер];

int a[2]; 
double b[20]; 

int a[5] = {1,2,3,4,5},
double x[10] = {0.0}; 
char d[] = {’a’,’b’,’c’}

DIM A(20) - зарезервировать место под одномерный массив чисел А размером 20;

DIM МD$(10) - зарезервировать место под одномерный массив MD$ символьных строк размером 10;

DIM B%(10,10) - зарезервировать место под двумерный массив целых чисел В размером 100(10х10);

var имя_массива: array [a..b] of тип_данных;

var s:array[1..26] of char;

v = array[−100..100] of real;

mas = array[char] of boolean

Рассмотрим более подробно синтаксис объявления одномерного массива в Паскале[11]:

var имя_массива: array [a..b] of тип_данных;

где a, b – номера (индексы) первого и последнего элементов массива соответственно. Тип данных элементов массива может быть как простым, так и составным.

При обращении к элементу массива в квадратных скобках указывается его индекс[12].

Пример объявления массива:

const n=9;

var c: array [1..n] of Real; {Массив из 9 элементов типа integer }

или

const n=9;

type A = array [1..n] of integer; {Тип данных - массив}

var ma: A; {Массив из 9 элементов типа integer }

Пример работы:

ma[1]:=13; {В массив ma в ячейку с индексом 1 записано число 13}

Type mass1=Array [1..14] Of Real ;

{описывается тип одномерного массива с именем mass1 , состоящий из четырнадцати элементов типа Integer}

Var c: mass; {Переменная c описана как переменная типа mass}

y: Array [1..5] Of Real ;

z: Array [1..5] Of Real ;

{Переменные y, z описаны как одномерные массивы из 5-ти элементов типа Real }

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

Существуют двумерные и многомерные массивы, которые выглядят более сложными и при их заполнении используют номера строк и столбцов, для того, чтобы найти значение определённого элемента[13].

В математике массивы называются матрицами и выглядят следующим образом (рис.7):


Рисунок 7. Вид матриц

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

Строка /

столбец

1

2

3

4

1

312

510

-34

-39

2

-23

-64

0

1

3

-5

320

0

2

Тогда значение ячейки под номером А (1, 1 ) = 312, значение

А (2,3) = 0, значение А (3,3) = 67 и т.д.

В памяти двумерный массив располагается по строкам.

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

Таблица 6. Синтаксис объявления двумерного массива[14].

СИ:

Basic

Pascal

тип имя[размер

№1][размер №2];

Пример.

double a[5][10]; 


for(int i=0;i<5;i++) 


for(int j=0;j<10;j++) 

scanf("%lf”,&a[i][j]); 
  ... 
for(int i=0;i<5;i++){ 


for(int j=0;j<10;j++) 

printf("%8.2lf\t”,a[i][j]); 


printf("\n”); 


  } 

DIM A(n,m) - зарезервировать место под массив размером n x m;

Пример:

n = 5

DIM a(n, n)

'Ввод исходной матрицы

FOR i = 1 TO n

FOR j = 1 TO n

INPUT a(i, j)

NEXT j

NEXT i

' Вывод исходной матрицы

PRINT "Матрица А"

FOR i = 1 TO n

FOR j = 1 TO n

PRINT a(i, j);

NEXT j

PRINT

NEXT i

var имя_массива:

array [a..b, c..d] of тип_данных_массива;

Пример:

Const n=5; m=5;

Var C: array [1..m, 1..n] of real;

i, j : integer; Begin

For j:=1 to n do

For i:=1 to m do begin

Write(‘Введите C[’, i, ’,’, j, ’]=’);

ReadLn(C[i, j]);

end;

{Вывод массива на экран}

Writeln(‘Массив C’);

For j:=1 to n do begin

For i:=1 to m do Write(C[i, j]);

WriteLn;

end;

End.

При работе с двумерным массивом, как правило, используется двойной цикл. При этом будем использовать переменную i для перебора строк и переменную j для перебора столбцов[15]:

for i:=1 to n do

for j:=1 to m do

begin

a[i,j]:=Random(28)-8; тело цикла по j тело цикла по i

end;

Синтаксис объявления двумерного массива в Паскале[16]:

var имя_массива: array [a..b, c..d] of тип_данных_массива;

где a, b – номера первой и последней строк массива соответственно;

с, d – номера первой и последней ячеек строки массива соответственно.


Тип данных также может быть как простым, так и составным.

k: Array [1..3, 1..5] Of Real;

{Переменная k описана как двухмерный массив из 15 элементов типа Real }

Пример объявления и использования:

Const n=3; m=5;

{Объявление массива из 3 строк, в каждой из которых 5 ячеек}

Var A: array [1..m, 1..n] of real;

i, j : integer; Begin

For i:=1 to n do

For j:=1 to m do begin

Write(‘Введите A[’, i, ’,’, j, ’]=’);

ReadLn(A[i, j]);

end;

Writeln(‘Массив А’);

For i:=1 to n do begin

For j:=1 to m do Write(A[i, j]);

WriteLn;

end; End.

Если в теле цикла содержится более одного оператора, то следует обрамлять их составным оператором begin..end, также как в цикле while. Заметим, что для оператора for установка начального значения счетчика (инициализация) выполняется прямо в заголовке цикла[17].

Кроме того, изменение значение счетчика происходит автоматически. Таким образом, специальный оператор для такого изменения в теле цикла (i:=i+1) приведет к ошибке.

Ограничения на использование оператора for:

1) Шаг изменения счетчика циклов может быть только или +1 (при использовании ключевого слова to) или –1 (при использовании ключевого слова downto).

2) Переменная - счетчик цикла может быть только порядкового типа и должна быть локальной для того блока, в котором находится оператор for.

Чтобы сравнить свойств операторов while, repeat и for на рисунке покажем как можно с их помощью реализовать один и тот же фрагмент программы, которая вычисляет сумму элементов массива А (N).

Рисунок 10 . Вычисление суммы элементов тремя способами.

2.3. Выход за границы диапазона

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

Этот механизм – весьма удобное и мощное средство программирования[18].

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

Такую типичную ошибку называется «выход за пределы массива».[19]


В СИ во время выполнения программы не производится контроль за допустимыми значениями индексов элементов.

Поэтому, если индекс элемента выходит за рамки массива, то в программе возможно появление ошибок [20].

Ошибки могут быть:

  • простыми (например «случайное» изменение переменных); 
  • критическими (выход за пределы пространства памяти, отведенной для программы). 

Выводы по главе.

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

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

Глава 3. Решение задач на тему «массивы»

Условия задач взяты из различных источников[22].

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

Пример 1. Дана последовательность из 20 целых чисел. Определите количество четных чисел.

var

a:array[1..20] of integer;

i,k:integer;

begin

k:=0;

for i:=1 to 20 do

begin

readln(a[i]);

if a[i] mod 2 =0 then k:=k+1;

end;

writeln('Кол-во четных чисел ',k);

end.

Демонстрация решения:

Пример 2. Дан массив M(20).К чётным элементам прибавить число A,а из элементов с нечётными номерами вычесть число B.

Program p2;

Program p2;

Const n=20; Type myarray=Array[1..n] Of Integer;

Var m: myarray;

A,b, i: Integer; Begin

Writeln('введите а');Readln(a);

Writeln(' введите b'); Readln(b);

Writeln(в'ведите ', n, ' чисел');

For i:=1 To n Do Read(m[i]);

For i:=1 To n Do

If I mod 2 <>0 then m[i]:= m[i]-b else m[i]:= m[i]+a ;

Writeln('новый массив :' );

For i:=1 To n Do

Write( m[i],' ' );

Readln;

End.

Демонстрация решения:

Пример 3. Дан Массив А(9).Поменять его половины следующим образом: первый элемент с последним, второй с предпоследним и так далее.

Program p3;

Program p3;

Const n=9;

Type myarray=Array[1..n] Of Integer;

Var a: myarray;

I,k,l: Integer;

Begin

Writeln(' введите ', n, ' чисел');