Перейти к содержанию

Книга программиста/Обработка матриц Си шарп

Материал из Викиучебника — открытых книг для открытого мира

К оглавлению

Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда 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]. Более оптимальный вариант через представление формулы индексов в виде некоторой функции.