- •Предисловие
- •4. Функции
- •4.1. Объявление функций. Прототипы функций
- •4.2. Вызов функции
- •4.3. Завершение работы функции и возвращение результата.
- •4.4. Локальные переменные
- •4.5. Глобальные переменные
- •4.6. Аргументы функции
- •5. Массивы
- •5.1.Понятие массива. Одномерные массивы
- •5.2. Двумерные массивы
- •6. Передача массивов в функции
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;
}