Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЛАВА 6 Массивы.doc
Скачиваний:
42
Добавлен:
29.02.2016
Размер:
145.92 Кб
Скачать

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

В соответствии с синтаксисом С++ в языке существуют только одномерные массивы. Однако элементами одномерного массива могут, в свою очередь, быть одномерные массивы.

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

тип_элементов имя_массива[размер1][размер2]; где

тип_элементов – допустимый в С++ тип данных;

имя_массива – идентификатор, задаваемый правилами языка;

размер1количество строк; размер2 – количество столбцов.

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

float b[4][3];

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

b[0][0], b[0][1], b[0][2], b[1][0],...,b[1][2],…,b[3][0], …,b[3][2]

Отметим ещё раз, что нумерация элементов по каждому из индексов начинается с нуля.

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

Инициализация двумерных массивов

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

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

int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

Эта запись эквивалентна следующей записи:

a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;

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

int a[2][3] = {1, 2, 3, 4, 5, 6};

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

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

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

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

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

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

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

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

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

cin>>a[i][j];

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

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

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

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

cout.width(4); // задаём ширину поля для элемента

cout<<a[i][j];

}

cout << endl;

}

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

const int N = 3, M = 5;

int a[N][M];

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

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

a[i][j] = rand() % 10 – 5;

// Пример 6.6. Дана матрица a[n][m]. Вычислить сумму элементов

// нижнего треугольника матрицы и произведение элементов

// главной диагонали матрицы.

#include <iostream>

using namespace std;

const int DIM = 20;

int main(){

int a[DIM][DIM], n;

cout<<" Vvdite razmer massiva n: "; cin >> n;

srand(n);

cout<<"\n\tMatrix==\n";

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

for(int j = 0; j < n; j++){

a[i][j] = rand() % 9 - 3;

cout.width(4); cout<<a[i][j];

}

cout << endl;

}

int sum = 0;

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

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

sum = sum + a[i][j]; // сумма элементов нижнего

cout<<"sum = "<<sum<<endl; // треугольника матрицы

long mult = 1;

for(int i = 0; i < n; i++) // произведение элементов

mult = mult * a[i][i]; // главной диагонали матрицы

cout<<"mult = "<<mult<<endl;

system("pause");

}

// Пример 6.7. Дана матрица a[n][m]. Вычислить суммы

// элементов строк матрицы, записав их в массив sum[n].

#include <iostream>

using namespace std;

const int D1 = 10, D2 = 10;

int main(){

int a[D1][D2], sum[D1], n, m;

cout<<" Vvdite razmer massiva: (n, m): "; cin>>n>>m;

srand(n+m);

cout << "\n\tIsxodnaya matrix\n";

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

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

a[i][j] = rand() % 20 - 5;

cout.width(6); cout<<a[i][j];

}

cout<<endl;

}

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

sum[i] = 0;

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

sum[i] = sum[i] + a[i][j];

}

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

cout<<"\nsum "<<i<<" stroki matrix = "<<sum[i]<<endl;

system("pause");

}

// Пример 6.8. Дана матрица a[n][m]. Найти максимальный и

// минимальный элементы матрицы и их индексы.

#include <iostream>

using namespace std;

const int D1 = 10, D2 = 10;

int main(){

float a[D1][D2];

int n, m;

cout<<" Vvеdite razmer massiva (n, m): "; cin>>n>>m;

srand(n + m);

cout << "\nSourse matrix\n";

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

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

a[i][j] = rand() % 15 - 5;

cout.width(4); cout<<a[i][j];

}

cout<<endl;

}

int max = a[0][0], imax = 0, jmax = 0;

int min = a[0][0], imin = 0, jmin = 0;

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

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

if(a[i][j] >= max){ max = a[i][j]; imax = i; jmax = j; }

if(a[i][j] <= min){ min = a[i][j]; imin = i; jmin =j; }

}

cout<<"Maximum element of matrix: ";

cout<<"a[" << imax << "," << jmax << "] = "<<a[imax][ jmax]<<endl;

cout<<"Minimum element of matrix: ";

cout<<"a[" << imin << "," << jmin << "] = "<<a[imin][jmin]<<endl;

system("pause");

}

// Пример 6.9. Дана матрица a[n][m]. Поменять местами элементы

// 0-й и (n-1)-й, 1-ой и (n-2)-й и т.д. строк матрицы.

#include <iostream>

using namespace std;

const int D1 = 10, D2 = 10;

int main(){

int a[D1][D2];

int n, m, temp;

cout<<"\ Vvdite razmer massiva (n, m): "; cin>>n>>m; srand(n + m);

cout << "\nSourse matrix\n";

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

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

a[i][j] = rand() % 15 - 5;

cout.width(4); cout<<a[i][j];

}

cout<<endl;

}

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

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

temp = a[i][j];

a[i][j] = a[n-1-i][j];

a[n-1-i][j] = temp;

}

cout<<"\n\tRezult matrix\n";

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

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

cout.width(4);

cout<<a[i][j];

}

cout<<endl;

}

}