Двухмерные массивы Матрица
Ввод
n,m
i
= 1
j = 1
Ввод
a(i,j)
j = j + 1
j ≤ m ?
i
= i + 1
i ≤ n ?
В дальнейшем вместо такой блок- схемы будем использовать один блок:
Ввод
массива a(n,m)
int n, m, i, j;
string s;
n = int.Parse(Console.ReadLine());
m = int.Parse(Console.ReadLine());
double [,] a = new double[n, m];
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
{
s = Console.ReadLine();
a[i, j] = double.Parse(s);
}
Пусть числовая матрица имеет вид:
A
=
Набираем числа в следующем порядке:
6
5
-5.2
4
…
9
4.2
и т.д.
-7
Массив будет заполнен данными
-5.2
a[0,0]
4
…
9
a[0,4]
4.2
6
a[1,1]
…
6.4
a[1,4]
…
8.1
51.2
a[5,1]
…
-7
П ечать матрицы:
i
= 1
j = 1
Печать
a(i,j)
j = j + 1
j ≤ m ?
i
= i + 1
i ≤ n ?
Вместо такой блок-схемы будем использовать следующую блок-схему:
Печать
массива
a(n,m)
for(i=0; i<n; i=i+1)
{
for(j=0; j<m; j=j+1)
Console.Write(“ {0:f3} ”, a[i, j]);
Console.WriteLine();
}
1) Вычислить сумму всех элементов матрицы.
Ввод
массива a(n,m)
s =0
i
= 1
j = 1
Печать
a(i,j)
s = s + a(i,j)
j = j + 1
j ≤ m ?
i
= i + 1
i ≤ n ?
Печать
массива
a(n,m)
и s
int n, m, i, j;
double Sum;
string s;
Console.WriteLine(“Введите число строк и число столбцов матрицы”);
n = int.Parse(Console.ReadLine());
m = int.Parse(Console.ReadLine());
double [,] a = new double[n, m];
Console.WriteLine(“Введите элементы матрицы”);
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
{
s = Console.ReadLine();
a[i, j] = double.Parse(s);
}
Sum = 0;
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
Sum = Sum + a[i, j];
Console.WriteLine(“Исходная матрица”);
for(i=0; i<n; i=i+1)
{
for(j=0; j<m; j=j+1)
Console.Write(“ {0:f3} ”, a[i, j]);
Console.WriteLine();
}
Console.WriteLine(“ Сумма элементов матрицы {0:f3} ”, Sum);
Console.ReadKey();
2) Вычислить и переслать в одномерный массив сумму элементов каждой строки.
Ввод
массива a(n,m)
i =1
s = 0
j = 1
Печать
a(i,j)
s = s + a(i,j)
j = j + 1
j ≤ m ?
b(i)
= s
i = i + 1
i ≤ n ?
Печать
массива
a(n,m)
и b(n)
int n, m, i, j;
double Sum;
string s;
Console.WriteLine(“Введите число строк и число столбцов матрицы”);
n = int.Parse(Console.ReadLine());
m = int.Parse(Console.ReadLine());
double [,] a = new double[n, m];
double [] b = new double [n];
Console.WriteLine(“Введите элементы матрицы”);
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
{
s = Console.ReadLine();
a[i, j] = double.Parse(s);
}
for(i=0; i<n; i=i+1)
{
Sum = 0;
for(j=0; j<m; j=j+1)
Sum = Sum + a[i, j];
b[i] = Sum;
}
Console.WriteLine(“Исходная матрица”);
for(i=0; i<n; i=i+1)
{
for(j=0; j<m; j=j+1)
Console.Write(“ {0:f3} ”, a[i, j]);
Console.WriteLine();
}
Console.WriteLine(“ Вектор из сумм элементов строк матрицы ”);
for(i=0; i<n; i=i+1)
Console.Write(“ {0:f3} ”, b[i]);
Console.WriteLine();
Console.ReadKey();
3) Вычислить сумму 2-х матрицы.
int n, m, i, j;
string s;
Console.WriteLine(“Введите число строк и число столбцов матрицы”);
n = int.Parse(Console.ReadLine());
m = int.Parse(Console.ReadLine());
double [,] a = new double[n, m];
double [,] b = new double[n, m];
double [,] c = new double[n, m];
Console.WriteLine(“Введите элементы 1 – ой матрицы”);
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
{
s = Console.ReadLine();
a[i, j] = double.Parse(s);
}
Console.WriteLine(“Введите элементы 2 – ой матрицы”);
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
{
s = Console.ReadLine();
b[i, j] = double.Parse(s);
}
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
c[i, j] = a[i, j] + b[i, j];
Console.WriteLine(“Сумма 2 - х матриц”);
for(i=0; i<n; i=i+1)
{
for(j=0; j<m; j=j+1)
Console.Write(“ {0:f3} ”, с[i, j]);
Console.WriteLine();
}
Console.ReadKey();
4) Найти максимальный элемент и его индексы среди всех элементов матрицы.
max = a(1,1) k
= 1 p = 1
i
= 1
j = 1
max = a(i,j) k = i p = j
a(i,j)>max ?
j = j + 1
j ≤ m ?
i
= i + 1
i ≤ n ?
int n, m, i, j, k, p;
double max;
string s;
Console.WriteLine(“Введите число строк и число столбцов матрицы”);
n = int.Parse(Console.ReadLine());
m = int.Parse(Console.ReadLine());
double [,] a = new double[n, m];
Console.WriteLine(“Введите элементы матрицы”);
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
{
s = Console.ReadLine();
a[i, j] = double.Parse(s);
}
max = a[0, 0]; k = 0; p = 0;
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
if(a[i, j] > max)
{
max = a[i,j]; k = i; p = j;
};
Console.WriteLine(“Исходная матрица”);
for(i=0; i<n; i=i+1)
{
for(j=0; j<m; j=j+1)
Console.Write(“ {0:f3} ”, a[i, j]);
Console.WriteLine();
}
Console.WriteLine(“ Максимальный элемент {0:f3} Индексы: {1:d} {2:d}”, max, k, p);
Console.ReadKey();
5) Найти максимальный элемент и его индекс в каждой строке матрицы и переслать их в одномерные массивы.
for(i=0; i<n; i=i+1)
{
max = a[i, 0]; k = i;
for(j=0; j<m; j=j+1)
if(a[i, j] > max)
{
max = a[i,j]; k = j;
}
Maxa[i] = max;
Ind[i] = k;
}
Console.WriteLine(“ Вектор из максимальных элементов строк матрицы ”);
for(i=0; i<n; i=i+1)
Console.Write(“ {0:f3} ”, Maxa[i]);
Console.WriteLine();
Console.WriteLine(“ Вектор из индексов максимальных элементов строк матрицы”);
for(i=0; i<n; i=i+1)
Console.Write(“ {0:f3} ”, Ind[i]);
Console.WriteLine();
6) Переслать в одномерный массив отрицательные элементы матрицы.
k = 0;
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
if(a[i, j] < 0)
{
b[k] = a[i,j]; k = k + 1;
};
Console.WriteLine(“ Вектор из отрицательных элементов матрицы ”);
for(i=0; i<n; i=i+1)
Console.Write(“ {0:f3} ”, b[i]);
Console.WriteLine();
7) Найти максимальный элемент в каждой строке матрицы и поменять его с первым отрицательным элементом в этой же строке матрицы.
for(i=0; i<n; i=i+1)
{
// Нахождение максимального элемента в строке
max = a[i, 0]; k = i;
for(j=0; j<m; j=j+1)
if(a[i, j] > max)
{
max = a[i,j]; k = j;
}
// Нахождение первого отрицательного элемента в строке
for(j=0; j<m; j=j+1)
if(a[i, j] < 0)
{
p = j; break;
}
// Обмен первого отрицательного элемента и максимального в строке
s = a[i, k];
a[i, k] = a[i, p];
a[i, p] = s;
}
8) Продублировать максимальный элемент в каждом столбце матрицы.
for(j=0; j<m; j=j+1)
{
// Нахождение максимального элемента в столбце
max = a[0, j]; k = 0;
for(i=0; i<n; i=i+1)
if(a[i, j] > max)
{
max = a[i,j]; k = i;
}
// Сдвиг всех элементов столбца вниз, начиная с индекса максимального
for(i=n; i>=k; i=i-1)
a[i+1, j] = a[i, j];
}
Включить заданный вектор в качестве строки, в которой находится максимальный элемент матрицы.
// Максимальный элемент матрицы
max = a[0, 0]; k = 0;
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
if(a[i, j] > max)
{
max = a[i,j]; k = i;
}
// Сдвиг элементов матрицы на одну строку, начиная с последней
// и до строки, в которой находится максимальный элемент матрицы
for(i=n; i>=k; i=i-1)
for(j=0; j<m; j=j+1)
a[i+1, j] = a[i,j];
// Включение заданного массива в качестве строки
for(j=1; j<m; j=j+1)
a[k, j] = b[j];
10) Удалить строку и столбец, которые содержат максимальный элемент матрицы.
// Максимальный элемент матрицы
max = a[0, 0]; k = 0; p = 0;
for(i=0; i<n; i=i+1)
for(j=0; j<m; j=j+1)
if(a[i, j] > max)
{
max = a[i,j]; k = i; p = j;
}
// Удаление строки матрицы, где расположен максимальный элемент
n = n-1;
for(i=k; i<n; i=i+1)
for(j=0; j<m; j=j+1)
a[i+1, j] = a[i,j];
// Удаление столбца матрицы, где расположен максимальный элемент
m = m-1;
for(j=p; j<m; j=j+1)
for(i=0; i<n; i=i+1)
a[i, j+1] = a[i,j];
11) Упорядочить элементы одномерного массива b(n) в убывающем порядке.
Алгоритм упорядочения массива заключается в выполнении n-1 проходов:
В первом проходе в массиве b находим максимальный элемент и меняем его с первым элементом массива b,
во втором проходе снова находим максимальный элемент, начиная со второго элемента массива b и меняя его со вторым элементом,
в третьем проходе находим максимальный элемент, начиная с третьего элемента и меняя его с третьим элементом, и т.д. и, наконец,
в n-1 проходе остается два элемента, их и располагаем в возрастающем порядке.
for(i=0; i<n-1; i=i+1)
{
max=b[i]; k=I;
// Нахождение максимального
for(j=i+1; j<n; j=j+1)
if(b[j]>max
{
max=b[j]; k=j;
}
// Обмен текущего элемента с максимальным
p = b[i]; b[i] = b[k]; b[k] = p;
}
Упорядочить элементы каждой строки матрицы в убывающем порядке.
for(k=0; k<n; i=i+1)
{
// Проходы
for(i=0; i<m-1; i=i+1)
{
max = a[k,i]; p=i;
// Нахождение максимального
for(j=i+1; j<m; j=j+1)
if(a[k,j]>max)
{
max = a[k,j]; p=j;
}
}
// Обмен текущего элемента строки с максимальным элементом строки
t = a[k,i]; a[k,i] = a[k,p]; a[k,p] = t;
}
13) Переставить строки и столбцы матрицы таким образом, чтобы максимальный элемент матрицы оказался на главной диагонали с заданным индексом p.
Алгоритм решения задачи:
Находим максимальный элемент матрицы, его индексы k и q.
Для перемещения столбца на пересечение с главной диагональю, проверяем q с p?. Если q<p, то обмениваем соседние столбцы с номерами q, q+1, …, p (прямой обмен). Если q>p, то обмениваем соседние столбцы с номерами q, q-1, …, p (обратный обмен). В результате столбец, в котором найден максимальный элемент, переместится на нужное место.
Для перемещения строки на пересечение с главной диагональю, проверяем k с p?. Если k<p, то обмениваем соседние строки с номерами k, k+1, …, p (прямой обмен). Если k>p, то обмениваем соседние строки с номерами k, k-1, …, p (обратный обмен). В результате строка, в которой найден максимальный элемент, переместится на нужное место.
Ввод
n,m,p
Ввод
массива
a(n,m)
max = a(1,1) k
= 1 q = 1
i
= 1
j = 1
max = a(i,j) k = i q = j
a(i,j)>max ?
j = j + 1
j ≤ m ?
i
= i + 1
i ≤ n ?
q < p ?
h =1
h = -1
i = 1
j = l
Меняем
a(i,j) с
a(i,j+h)
j = j + 1
j ≤ p-h?
i = i + 1
i ≤ n ?
k < p ?
h =1
h = -1
i = k
j = 1
Меняем
a(i,j) с
a(i+h,j)
j = j + 1
j ≤ m ?
i = i + 1
i ≤ p-h ?
Печать
массива
a(n,m)
// Максимальный элемент матрицы
max = a[0,0]; k=0; q=0;
for(i=0; i<n; i=i+1)
{
for(j=0; j<m; j=j+1)
if(a[i,j]>max
{
max = a[i,j]; k = i; q = j;
}
}
// Перестановка столбцов
if(q<p) h = 1; else h = -1;
for(i=0; i<n; i=i+1)
for(j=0; j<p-h; j=j+h)
{
t = a[i,j]; a[i,j] = a[i,j+h]; a[i,j+h] = t;
}
// Перестановка строк
if(k<p) h = 1; else h = -1;
for(i=k; i<p-h; i=i+h)
for(j=0; j<m; j=j+1)
{
t = a[i,j]; a[i,j] = a[i+h,j]; a[i+h,j] = t;
}
