Сформировать двумерный массив по заданному правилу. Используя виртуальный метод c#

Для двух одномерных массивов P и T одинаковой длины составить подпрограмму, которая в случае неубывающего массива T формирует массив R по правилу Ri = f(Pi – Ti). Используя в качестве функции f синус, на основе двумерного массива A сформировать массив B по правилу: первая строка формируется подпрограммой из первых двух строк массива A, вторая строка – из второй и третьей строк массива A и т. д. Затем аналогично сформировать массив D, используя в качестве функции f косинус.

Не понимаю как от заданного шаблона перейти к двумерному массиву


Ответы (1 шт):

Автор решения: Nowhere Man

Вариант решения:

  1. Реализуется абстрактный класс, с методами для генерации одномерного и двумерного массива, которые в свою очередь будут вызывать некий абстрактный метод для вычисления функции.
    Класс может быть обобщённый, в нём следует указать два типа: T -- тип элементов исходных массивов/матрицы, R -- тип результата вычислений.
public abstract class ArrayProvider<T, R> {
    public R[] CalculateArray(T[] arr1, T[] arr2) {
        int n = arr1.Length;
        R[] res = new R[n];
        for (int i = 0; i < n; i++) {
            res[i] = CalculateItem(arr1[i], arr2[i]);
        }
        return res;
    }

    public R[,] CalculateMatrix(T[,] matrix) {
        int rows = matrix.GetLength(0);
        int cols = matrix.GetLength(1);
        R[,] res = new R[rows - 1, cols];
        for (int i = 1; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                res[i - 1, j] = CalculateItem(matrix[i - 1, j], matrix[i, j]);
            }
        }
        return res;
    }
    
    public abstract R CalculateItem(T a, T b);
}
  1. Создаются реализации указанного класса с нужной реализацией метода CalculateItem и указанием типов:
public class IntSine : ArrayProvider<int, double> {
    public override double CalculateItem(int a, int b) {
        return Math.Sin(a - b);
    }
}

public class IntCosine : ArrayProvider<int, double> {
    public override double CalculateItem(int a, int b) {
        return Math.Cos(a - b);
    }
}

Пример использования (для одномерных массивов):

class Program {
    static void Main() {
        var sine = new IntSine();
        
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = {2, 4, 2, 4, 6};
        
        double[] result = sine.CalculateArray(arr1, arr2);
        Console.WriteLine("sine:");
        Array.ForEach(result, Console.WriteLine);
        
        var cosine = new IntCosine();
        
        result = cosine.CalculateArray(arr1, arr2);
        Console.WriteLine("\ncosine:");
        Array.ForEach(result, Console.WriteLine);
    }
}

Результат:

sine:
-0.841470984807897
-0.909297426825682
0.841470984807897
0
-0.841470984807897

cosine:
0.54030230586814
-0.416146836547142
0.54030230586814
1
0.54030230586814
→ Ссылка