Загрузка данных


using System;
using System.Text;

class Program
{
    static Random rnd = new Random();

    static void Main()
    {
        Console.OutputEncoding = Encoding.UTF8;

        Console.WriteLine("ЗАДАЧА 1. Рекурсивная сортировка Хоара");
        int n1 = Rd("n = ", 1, 100);
        int[] x = new int[n1];

        for (int i = 0; i < n1; i++)
            x[i] = Rd("x[" + i + "] = ");

        Qs(x, 0, n1 - 1);

        Console.WriteLine("Отсортированный массив:");
        Pr(x);

        Console.WriteLine();
        Console.WriteLine("ЗАДАЧА 2. Матрица B = A * F");

        int n = Rd("n = ", 1, 100);
        int m = Rd("m = ", 1, 100);

        int[,] f =
        {
            { 1, 0, 1 },
            { 0, 1, 0 },
            { 1, 0, 1 }
        };

        int k = f.GetLength(0);

        if (n < k || m < k)
        {
            Console.WriteLine("Ошибка: n и m должны быть не меньше k = " + k);
            Console.ReadKey();
            return;
        }

        int a = Rd("a = ");
        int b;

        do
        {
            b = Rd("b = ");
            if (b < a) Console.WriteLine("b должно быть >= a");
        }
        while (b < a);

        int[,] A = new int[n, m];

        int v = Rd("Ввод A: 1 - вручную, 2 - случайно: ", 1, 2);

        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i, j] = v == 1 ? Rd("A[" + i + "," + j + "] = ", a, b)
                                  : rnd.Next(a, b + 1);

        int[,] B = Cb(A, f);

        Console.WriteLine();
        Console.WriteLine("Матрица A:");
        Pr(A);

        Console.WriteLine();
        Console.WriteLine("Матрица F:");
        Pr(f);

        Console.WriteLine();
        Console.WriteLine("Матрица B:");
        Pr(B);

        Console.ReadKey();
    }

    static void Qs(int[] x, int l, int r)
    {
        int i = l, j = r;
        int p = x[(l + r) / 2];

        while (i <= j)
        {
            while (x[i] < p) i++;
            while (x[j] > p) j--;

            if (i <= j)
            {
                int t = x[i];
                x[i] = x[j];
                x[j] = t;
                i++;
                j--;
            }
        }

        if (l < j) Qs(x, l, j);
        if (i < r) Qs(x, i, r);
    }

    static int[,] Cb(int[,] A, int[,] F)
    {
        int n = A.GetLength(0);
        int m = A.GetLength(1);
        int k = F.GetLength(0);

        int[,] B = new int[n - k + 1, m - k + 1];

        for (int i = 0; i <= n - k; i++)
            for (int j = 0; j <= m - k; j++)
            {
                int s = 0;

                for (int p = 0; p < k; p++)
                    for (int q = 0; q < k; q++)
                        s += A[i + p, j + q] * F[p, q];

                B[i, j] = s;
            }

        return B;
    }

    static int Rd(string s)
    {
        int x;

        while (true)
        {
            Console.Write(s);

            if (int.TryParse(Console.ReadLine(), out x))
                return x;

            Console.WriteLine("Ошибка ввода.");
        }
    }

    static int Rd(string s, int mn, int mx)
    {
        int x;

        while (true)
        {
            x = Rd(s);

            if (x >= mn && x <= mx)
                return x;

            Console.WriteLine("Введите число от " + mn + " до " + mx);
        }
    }

    static void Pr(int[] x)
    {
        for (int i = 0; i < x.Length; i++)
            Console.Write(x[i] + " ");

        Console.WriteLine();
    }

    static void Pr(int[,] x)
    {
        for (int i = 0; i < x.GetLength(0); i++)
        {
            for (int j = 0; j < x.GetLength(1); j++)
                Console.Write("{0,5}", x[i, j]);

            Console.WriteLine();
        }
    }
}