Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_Раб_6С++.doc
Скачиваний:
6
Добавлен:
25.08.2019
Размер:
132.61 Кб
Скачать

1.2 Работа с двумерным массивом

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

Каждый элемент двумерного массива описывается как В[i , j], где:

В – имя массива

i - номер строки

j – номер столбца

Если число строк двумерного массива равняется числу столбцов, то матрицы данного типа называются квадратными. Элементы квадратной матрицы вида B[1,1], B[2,2], B[3,3]… составляют главную диагональ. Элементы главной диагонали можно записать так: В[i,i], т.е. индексы строки и столбца совпадают. Например, заполнение нулями главной диагонали матрицы:

for (i=0; i<n; i++) a[i][j]=0;

Побочная диагональ квадратной матрицы проходит из правого верхнего угла в левый нижний. Элементы вспомогательной диагонали можно записать так: В[i,n-i-1], где n – размер массива. Например, заполнение нулями элементов выше вспомогательной диагонали:

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

for (j=0; j<n-i-1; j++)

a[i][j]=0;

Заполнение нулями элементов по периметру массива:

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

a[i][0]=0;

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

a[0][i]=0;

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

};

Особое значение при работе с квадратными массивами занимает задача «транспонирования», т.е переворачивания массива относительно главной диагонали. Для выполнения этой задачи нужно поменять местами элементы A[i,j] и A[j,i]. Для перестановки двух элементов в массиве необходимо воспользоваться вспомогательной переменной:

Temp=A[2][5]

A[2][5]=A[5][2];

A[5][2]=Temp;

Для переворачивания всего массива используется двойной цикл

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

for (j=i; j<n; j++) {

temp=a[i][j];

a[i][j]=a[j][i];

a[j][i]=temp;

};

Пример. Вводится квадратная матрица с максимальным размером 10 на 10. Программа заменяет все отрицательные числа их модулями.

#include <iostream.h>

#include <conio.h>

void main() {

int a[10][10];

int n,i,j;

cout<<"\n Введите количество строк и столбцов";

cin>>n;

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

cout <<"\nVvedi "<< i<<" stroky";

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

cin>> a[i][j]; // Ввод элементов матрицы

}

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

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

if (a[i][j] < 0) a[i][j]=-a[i][j];

// Вывод матрицы

cout <<"\n";

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

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

cout<< a[i][j]<<" ";

cout<<"\n";

}

getch();

}

1.3 Динамические массивы

Динамическим считается массив, который способен в любой момент изменять свой размер. Эта возможность обеспечивается за счет динамического выделения памяти под массив.

Идеология языка C++ предполагает, что каждый объект создаётся (объявляется) именно в том месте, где он нужен, и является работоспособным сразу после создания. Для этого каждый класс имеет определённый набор конструкторов — функций, которые должны автоматически запускаться при создании объекта (экземпляра данного класса) и инициализировать его члены.

При создании динамического массива необходимо указать его имя (указатель) и размерность. Например, для двумерного массива:

int n=10, m=10;

int** a=new int* [n];

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

a[i]=new int[m];

Будет выделен фрагмент динамической памяти 8х10x10=800 байт и адрес начала этого фрагмента помещен в a.

Освобождение памяти выполняется следующей операцией (квадратные скобки обязательны)

delete[] a;

Пример. Дана целочисленная матрица, состоящая из NxM элементов. Заполнить ее с клавиатуры. Вывести индексы четных элементов второй строки.

Начнем решение задачи с составления алгоритма.

Словесный алгоритм решения задачи следующий:

1. Запрос количества строк и столбцов в матрице.

2. Ввод матрицы a, состоящей из NхМ целых чисел.

3. Просматриваются в цикле все элементы второй строки массива (с номером 1) с целью четные (т.е. остаток от деления на 2 равен 0: a[1,j]%2==0). В случае, если в матрице найдено выполнение указанного соотношения, на экран выдается номер строки 1 и столбца j, для которого выполняется рассматриваемое соотношение.

На рисунке 1 дана детальная блок-схема алгоритма.

Программа, реализующая данный алгоритм, представлена ниже:

#include<iostream.h>

#include <conio.h>

main () {

int N, temp;

int i, k;

cout << "\n Введите количество строк ";

cin >> N;

cout << "\n Введите количество столбцов ";

Рис. 1 Блок-схема

cin >> M;

int** a=new int* [N];

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

a[i]=new int[M];

// Ввод матрицы

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

cout <<"\nVvedi "<< i<<" stroky";

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

cin>> a[i][j];

}

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

if (a[1][i]%2==0) cout<<”1,“<<j<<”\n”;

delete[] a;

getch();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]