Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ПВМ.doc
Скачиваний:
5094
Добавлен:
21.02.2016
Размер:
2.79 Mб
Скачать

Тема 4. Массивы. Разработка программ с использованием одномерных и двумерных массивов.

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

Объявление массивов. Массив является группой ячеек памяти, логически связанных в том отношении, что все они имеют одно и то же имя и один и тот же тип. Для обращения к элементу массива необходимо указать имя массива и номер позиции этого элемента в массиве. Первый элемент в любом массиве имеет нулевой порядковый номер. Номер позиции элемента, содержащейся внутри квадратных скобок ([]), более формально называют индексом. Индекс должен быть целым числом или целочисленным выражением. Скобки, в которые заключается индекс массива, на самом деле рассматриваются в качестве операции языка Си, они имеют тот же самый приоритет, что и круглые скобки. При объявлении массива необходимо указать имя массива, тип каждого элемента и число элементов массива. При помощи одного объявления можно зарезервировать память для нескольких массивов, например:

int b[100], x[27];

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

/* Инициализация массива */

#include<stdio.h>

main()

{ int n[10], i;

for (i=0; i<=9; i++)

n[i]=0; /* инициализация массива */

for(i=0;i<=9;i++) /* вывод элементов массива */

printf(“%3d%10d\n”, i, n[i]);

return0; }

Результат программы:

0 0

1 0

2 0

3 0

4 0

5 0

6 0

7 0

8 0

9 0

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

/* Инициализация массива при объявлении */

#include <stdio.h>

main()

{ int i, n[10]={2, 27, 64, 18, 95, 14, 90, 70, 6, 3};

for (i=0; i<=9; i++)

printf(“%3d”, n[i]);

return0; }

Результат программы:

2 27 64 18 95 14 90 70 6 3

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

intn[10]={0};

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

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

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

Многомерный массив, подобно одномерному, может быть инициализирован при его объявлении. Например, двумерный массив b[2][2] может быть объявлен и инициализирован посредством

intb[2][2]={{1, 2}, {3, 4}};

Значения группируются в фигурных скобках по строкам. Таким образом, 1 и 2 инициализируют b[0][0] иb[0][1], 3 и 4 инициализируютb[1][0] иb[1][1]. Если для данной строки недостаточно инициализирующих значений, оставшиеся ее элементы инициализируются нулями. Таким образом, объявление

intb[2][2]={{1}, {3, 4}};

инициализировало бы b[0][0] единицей,b[0][1] нулем,b[1][0] тройкой иb[1][1] четверкой.

Следующая программа демонстрирует инициализацию двумерных массивов при их объявлении. В программе объявляются три массива с двумя строками и тремя столбцами (каждый состоит из шести элементов). Объявление массива а1 предусматривает шесть инициализирующих значений в двух подсписках. Первый подсписок инициализирует первую строку массива значениями 1, 2 и 3; второй подсписок инициализирует вторую строку массива значениями 4, 5 и 6. Если из списка инициализирующих значений массива а1 убрать фигурные скобки, в которые заключен каждый подсписок, компилятор автоматически проинициализирует элементы первой строки, а затем элементы второй строки. Объявление массива а2 предусматривает пять инициализирующих значений. Инициализирующие значения присваиваются сначала первой строке, затем второй строке. Элемент а2[1][2] инициализирован нулем. Объявление массива а3 предусматривает три инициализирующих значения в двух подсписках. Соответственно элементы а3[0][2], а3[1][1] и а3[1][2] инициализируются нулями. Для вывода элементов каждого массива в программе вызывается функция printarray.

/* Инициализация многомерного массива */

#include <stdio.h>

void printarray(int [][3]);

main()

{ int a1[2][3] = {{1, 2, 3}, {4, 5, 6}}, a2[2][3] = {1, 2, 3, 4, 5}, a3[2][3] = {{1, 2}, {4}},

printf(“Массив А1”);

printfarray(a1);

printf(“Массив А2”);

printfarray(a2);

printf(“Массив А3”);

printfarray(a3);

printf(“\n”);

return 0; }

void printarray(int a[][3]);

{ int i, j;

for (i=0; i<=1; i++)

{ for (j=0; j<=2; j++)

printf(“%d ”, a[i][j]);

printf(“\n”); }

}

Результат программы:

Массив А1

1 2 3

4 5 6

Массив А2

1 2 3

4 5 0

Массив А3

1 2 0

4 0 0

Основная литература: 1осн[223-253],2осн[244-255]

Дополнительная литература:10доп[41-46]

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

1. Как осуществляется ввод и вывод одномерного массива?

2. Как осуществляется ввод и вывод двумерного массива?

3. При каком условии можно передать все элементы одного массива другому массиву?

4. Каким образом можно сравнить два массива?

5. Приведите примеры инициализации одномерных и двумерных массивов.