Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_1_С++.doc
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
290.82 Кб
Скачать

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

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

ТипМассива ИмяМассива [КонстВыражение1] [КонстВыражение2];

Здесь константное выражение, КонстВыражение1, определяет размер одномерного массива, элементами которого являются одномерные массивы размера КонстВыражение2.

Например, объявление float B[10][4];

определяет двумерный массив, первый индекс которого изменяется от 0 до 9, второй - от 0 до 3. Таким образом, элементы этого массива можно перечислить так: B[0][0], B[0][1], B[0][2], B[0][3], B[1][0], ..., B[9][0], B[9][1], B[9][2], B[9][3]

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

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

int A[2][3]={{2,1,2},{4,4,-5}};

Эта запись эквивалентна последовательности операторов присваивания: A[0][0]=2; A[0][1]=1; A[0][2]=2; A[1][0]=4; A[1][1]=4; A[1][2]=-5;

Тот же результат можно получить с одним списком инициализации:

int A[2][3]={2,1,2,4,4,-5};

С помощью инициализации можно присваивать значения не всем элементам многомерного массива. Например, чтобы инициализировать только элементы первого столбца матрицы, ее можно объявить так:

int B[4][3]={{2},{1},{2},{4}};

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

y= А[1][4] * 3;

A[3][1] = 15 * x;

Ввод и вывод двумерных массивов

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

Пример ввода целочисленного двумерного массива:

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

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

{

cout << "A[" << i << "][" << j << "]=";

cin >> A[i][j];

}

Параметр i в ходе выполнения цикла изменяется от 0 до n-1, таким образом, перебираются все строки. Для каждого значения параметра i выполняется вложенный цикл, в котором параметр j изменяется от 0 до m-1, таким образом, в каждой строке перебираются все ее элементы.

Оператор cout выводит приглашение вида:

A[индекс][индекс]= , в ответ на которое пользователь вводит значение элемента массива с помощью оператора cin.

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

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

{

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

{

cout.width(9); //Задаем ширину поля для вывода значения

cout << A[i][j];

}

cout << endl;

}

Аналогичным образом можно присвоить всем элементам массива некоторое случайное значение:

const int K=3;

const int N=5;

int A[K][N];

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

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

A[i][j] = random(10) – random(10);

Пример 5.6. Дана матрица A (DIM , DIM) . Вычислить сумму элементов нижнего треугольника матрицы и произведение элементов главной диагонали.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int DIM = 10;

int A [DIM][DIM];

cout << "\n\tИсходная матрица\n";

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

{

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

{

A[i][j] =random(DIM);

cout.width(6); //Выделяем в строке 6 позиций для размещения

//элемента A[i][j]

cout << A[i][j];

}

cout << endl;

}

int Summa = 0;

for (int i = 1; i < DIM; i++)

for int j= 0; j < i ; j++)

Summa+= A[i][j];

cout << "\nСумма элементов нижнего треуг. матрицы "<<Summa;

long Mult = 1;

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

Mult*=A[i][i];

cout << "\nПроизведение элементов главной диаг. матрицы "<<Mult;

cout << endl;

system("pause");

return 0;

}

Пример 5.7. Дана матрица A (N ,M) . Вычислить суммы элементов строк матрицы.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int N = 10, M=10;

int A [ N][M];

cout << "\nИсходная матрица\n";

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

{

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

{

A[i][j] =random(N);

cout.width(6);

cout << A[i][j];

}

cout << endl;

}

int Summa[N] ={ 0};

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

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

Summa[i]+= A[i][j];

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

cout<< "\nСумма элементов "<<i<<" строки матрицы "<<Summa[i];

cout << endl;

system("pause");

return 0;

}

Пример 5.8. Дана матрица A (N ,M) . Найти индексы первого по счету максимального элемента матрицы.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int N = 5, M=5;

int A [N][M];

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

{

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

{

A[i][j] = random(N*M);

cout.width(4);

cout << A[i][j];

}

cout << endl;

}

int iMax = 0, jMax = 0;

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

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

if (A[i][j] > A[iMax][jMax])

{

iMax = i;

jMax =j;

}

cout << "\nМаксимальный элемент матрицы ";

cout << "A[" << iMax << "," << jMax << "] = ";

cout << A[iMax][ jMax];

cout << endl;

system("pause");

return 0;

}

Пример 5.9. Дана матрица A (n , m), элементы которой вычисляются по правилу A[i][j] =(i*j+1)/(i+j+1) . Найти максимальный и минимальный элементы матрицы.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int N = 10, M=5;

float A[N][M];

cout << "\nSourse matrix\n";

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

{

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

{

A[i][j] =(i*j+1.)/(i+j+1);

cout.width(10);

cout << A[i][j];

}

cout << endl;

}

int iMax = 0, jMax = 0, iMin = 0, jMin = 0;

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

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

{

if (A[i][j] > A[iMax][jMax])

{

iMax = i;

jMax =j;

}

if (A[i][j] < A[iMin][jMin])

{

iMin = i;

jMin =j;

}

cout << "Maximum element of matrix: ";

cout << "A[" << iMax << "," << jMax << "] = ";

cout << A[iMax][ jMax] << endl;

cout << "Minimum element of matrix: ";

cout << "A[" << iMin << "," << jMin << "] = ";

cout << A[iMin][ jMin] << endl;

system("pause");

return 0;

}

Пример 5.10. Дана матрица A (n , m). Поменять местами элементы 0-ой и (n-1)-ой, 1-ой и (n-2)-ой и т. д. строк матрицы.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int N = 5, M=3;

int A [N][M];

cout << "\nВведите элементы матрицы :\n ";

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

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

{

cout << "A[" << i << "][" << j << "]=";

cin >> A[i][j];

}

cout << "\n\tИсходная матрица\n";

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

{

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

{

cout.width(4);

cout << A[i][j];

}

cout<<endl;

for(int i = 0; i < N / 2; i++)

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

{

int Temp=A[i][j];

A[i][j]=A[N-1-i][j];

A[N-1-i][j]=Temp;

}

cout << "\n\tПолученная матрица\n";

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

{

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

{

cout.width(4);

cout << A[i][j];

}

cout << endl;

}

system("pause");

return 0;

}