Книга программиста/Обработка матриц Си шарп
Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда SharpDevelop 5.1.
Простые задачи
[править]Максимальные элементы столбцов матрицы
[править]using System;
namespace Максимальные_элементы_столбцов_матрицы
{
class Program
{
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int[,] a = new int[N, M];
int[] max = new int[M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = rnd.Next(10);
}
}
System.Console.WriteLine("Матрица:");
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
for (int j = 0; j < M; j++)
{
max[j] = int.MinValue;
for (int i = 0; i < N; i++)
{
if (a[i, j] > max[j]) { max[j] = a[i, j]; }
}
}
System.Console.WriteLine("Максимумы:");
for (int j = 0; j < M; j++)
{
System.Console.Write(System.String.Format("{0, 3}", max[j]));
}
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Наибольший по модулю элемент матрицы
[править]using System;
namespace Найти_наибольший_по_модулю_элемент_матрицы
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int max = 0;
int maxI = 0; int maxJ = 0;
int[,] a = new int[N, M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = -10 + rnd.Next(20);
}
}
Print(a);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if (System.Math.Abs(a[i, j]) > max)
{
max = System.Math.Abs(a[i, j]);
maxI = i; maxJ = j;
}
}
}
System.Console.WriteLine(System.String.Format("Наибольший по модулю элемент матрицы с индексами [{0}, {1}] равен {2}.", maxI, maxJ, max));
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Отбор четных двузначных чисел
[править]Формула, по которой можно узнать сумму цифр двузначного числа: n / 10 + n % 10.
using System;
namespace Отбор_всех_подходящих_двузначных_чисел_по_критерию
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int c = 0;
int[,] a = new int[N, M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = rnd.Next(100);
}
}
Print(a);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if ((System.Math.Abs(a[i, j]) >= 10) && (System.Math.Abs(a[i, j]) < 100) && ((a[i, j] / 10 + a[i, j] % 10) % 2 == 0))
{
c += 1;
}
}
}
System.Console.WriteLine(System.String.Format("Количество двузначных чисел с четной суммой цифр равно {0}.", c));
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Поменять местами строки матрицы
[править]using System;
namespace Поменять_местами_строки_матрицы
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Swap(ref int a, ref int b)
{
int c;
c = a;
a = b;
b = c;
}
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int[,] a = new int[N, M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = rnd.Next(10);
}
}
Print(a);
int i1 = rnd.Next(N);
int i2 = rnd.Next(N);
for (int j = 0; j < M; j++)
{
Swap(ref a[i1, j], ref a[i2, j]);
}
Print(a);
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Сколько раз в матрице встречается данное число
[править]using System;
namespace Сколько_раз_в_матрице_встречается_заданное_число
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int c = 0;
int k = System.Convert.ToInt32(System.Console.ReadLine());
int[,] a = new int[N, M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = rnd.Next(10);
}
}
Print(a);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if (a[i, j] == k) { c += 1; }
}
}
System.Console.WriteLine(System.String.Format("Количество чисел, равных k, равно {0}.", c));
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Средняя сложность
[править]Минимальные элементы на пересечении строк и столбцов
[править]using System;
namespace Минимальные_элементы
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int min = 0; int iMin = 0; int jMin = 0;
bool found = true;
int[,] a = new int[N, M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = -10 + rnd.Next(20);
}
}
Print(a);
for (int i = 0; i < N; i++)
{
min = int.MaxValue;
found = true;
for (int j = 0; j < M; j++)
{
if (a[i, j] < min)
{
min = a[i, j];
iMin = i;
jMin = j;
}
}
for (int i2 = 0; i2 < N; i2++)
{
if (a[i2, jMin] < min) { found = false; }
}
if (found) { break; }
}
if (!found)
{
System.Console.WriteLine("Минимального элемента на пересечении строк и столбцов не найдено.");
}
else
{
System.Console.WriteLine(System.String.Format("Индексы минимального элемента {0} равны [{1}, {2}].", min, iMin, jMin));
}
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Отрицательные элементы под диагональю
[править]using System;
namespace Отрицательные_элементы_под_диагональю
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 6}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Main(string[] args)
{
const int N = 3;
const int M = 3;
int c = 0;
int[,] a = new int[N, M];
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
a[i, j] = -10 + rnd.Next(20);
}
}
Print(a);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if ((i > j) && (a[i, j] < 0))
{
c += 1;
}
}
}
System.Console.WriteLine(System.String.Format("Количество отрицательных элементов под главной диагональю матрицы равно {0}.", c));
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Сложные задачи
[править]Заполнение матрицы по правилу
[править]Правило заполнения:
1 | 2 | 3 | 4 | 5 |
2 | 1 | 2 | 3 | 4 |
3 | 2 | 1 | 2 | 3 |
4 | 3 | 2 | 1 | 2 |
5 | 4 | 3 | 2 | 1 |
using System;
namespace Заполнить_двумерный_массив_по_правилу
{
class Program
{
public static void Print(int[,] a)
{
System.Console.WriteLine("Матрица:");
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
System.Console.Write(System.String.Format("{0, 3}", a[i, j]));
}
System.Console.WriteLine();
}
}
public static void Main(string[] args)
{
const int N = 6;
int[,] a = new int[N, N];
for (int d = 0; d < N; d++)
{
for (int j = d; j < N; j++)
{
a[d, j] = j - d + 1;
}
for (int i2 = d + 1; i2 < N; i2++)
{
a[i2, d] = i2 - d + 1;
}
}
Print(a);
System.Console.ReadKey();
}
}
}
Смотрите также: реализация на PascalABC.Net.
Идем по главной диагонали и заполняем все элементы числами арифметической прогрессии по строке и столбцу вправо и вниз соответственно, начиная с a[d, d]. Более оптимальный вариант через представление формулы индексов в виде некоторой функции.