Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
      1. Определение и инициализация двумерных массивов

Общий формат определения одномерного массива в стиле стандарта С89 имеет следующий:

<α> <>[<γ1>][<γ2>] = <μ>;

Здесь α- тип элементов, хранящихся в массиве; - имя массива, [..] – оператор индексирования; γ1 – константное выражение, определяющее количество строк в двумерном массиве, а γ2 - константное выражение, определяющее количество столбцов в двумерном массиве. Конструкция «= <μ>» используется для инициализации массива; μ – список инициализаторов.

Приведем пример определения двумерного массива.

#define MROW 2 #define MCOL 3 int main(void) { double m[MROW][MCOL] = { {1, 3, 5}, {2, 4, 6} }; }

В этом примере содержится определение двумерного массива m, в котором может храниться не более 2 строк и не более трех столбцов. Элементы массива инициализированы во время его определения. Первая строка массива содержит числа 1, 3 и 5, а вторая строка - 2, 4 и 6. Элементы массива имеют типdouble.

    1. Операции с массивами

Все операции с элементами массива выполняются поэлементно. Приведем два примера.

Пример 1. Копирование одномерных массивов.

Постановка задачи. Даны два массива одинаковых размеровx1 иx2. Скопировать частьnэлементов массиваx1 в массивx2.

Решение. Организуем арифметический цикл, рассчитанный наnповторений. Поэлементно будем копировать элементы массиваx1 в массивx2. Программный код, представленный ниже, решает рассматриваемую задачу.

#defineMSIZE20 #include<stdio.h>intmain(void)

{ int x1[MSIZE] = {1, 3, 5}; int x2[MSIZE]; int n; printf(“n=”); scanf(“%d”, &n); for(int i = 0; i < n; i++) x2[i] = x1[i]; //.. }

В рассматриваемом коде «n» элементов массиваx1 копируется в массивx2. Если ввести значение «n», равноеMSIZE, то весь массивx1 , будет скопировани в массивx2. Заметим, что инстукцияx1 =x2; в связи с тем,x1 – константный указатель.

Пример 2. Обработка двумерных массивов.

Постановка задачи. В двумерном массиве, хранятся данные типаdouble. Массив состоит изnrстрок иncстолбцов. Требуется вычислить две суммыsumma_rowиsumma_col. Здесьsumma_row- сумма элементов в каждой строке, аsumma_col– сумма элементов для каждого столбца.

Решение

При обращении к элементам двумерного массива следует использовать два индекса, причем каждый из индексов должен записываться в своих индексных скобках. Отметим, левый индекс определяет номер строки, в которй находится элемент массива, а правый – номер столбца. Например, если m– матрицы, тоm[1][2] – элемент этой матрицы, находящийся в строки с индексом 1 и столбце с индексом 2.

Каждая из сумм summa_rowиsumma_colдолжна вычисляться отдельно с использованием вложенных циклов. Дело в том, что при вычислении суммыsumma_rowматрица должна просматриваться по строкам, а при вычисленииsumma_colматрица должна просматриваться по стобцам.

Алгоритм просмотра по строкам реализуется с помощью вложенных циклов. Причем:

  • внешний цикл должен фиксировать индекс строки,

  • внутренний цикл - изменять индекс столбца.

В алгоритме просмотра по столбцам наоборот:

  • внешний цикл должен фиксировать индекс столбца,

  • внутренний цикл – изменять индекс строки.

#defineMROW5 #defineMCOL10intmain(void) {doublesumma_row[MROW];intnr;printf(“nr= ”);scanf(“%d”, &nr);intnc;printf(“nc= ”);scanf(“%d”, &nc);doublem[MROW][MCOL]; // Ввод матрицы по строкамfor(intr= 0;r<nr;r++) {for(c= 0;c<nc;c++) {printf(“m[%d][%d]”,c,r);scanf(“%lf”, &m[r][c]); } } // Вычисление суммы для каждой строкиdoublesumma_row[MROW];// массив для хранения суммы по // строкамfor(intr= 0;r<nr;r++) {doubles= 0;for(c= 0;c<nc;c++) {s+=m[r][c]; }summa_row[r] =s; } // Вычисление суммы для каждого столбцаdoublesumma_col[MROW];// массив для хранения суммы по // столбцамfor(intc= 0;c<nc;c++) {doubles= 0;for(r= 0;r<nr;r++) {s+=m[r][c]; }summa_col[c] =s; } // вывод результатов вычислений }return0;