Сформировать двумерный массив по заданному правилу. Используя виртуальный метод c#
Для двух одномерных массивов P и T одинаковой длины составить подпрограмму, которая в случае неубывающего массива T формирует массив R по правилу Ri = f(Pi – Ti). Используя в качестве функции f синус, на основе двумерного массива A сформировать массив B по правилу: первая строка формируется подпрограммой из первых двух строк массива A, вторая строка – из второй и третьей строк массива A и т. д. Затем аналогично сформировать массив D, используя в качестве функции f косинус.
Не понимаю как от заданного шаблона перейти к двумерному массиву
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Вариант решения:
- Реализуется абстрактный класс, с методами для генерации одномерного и двумерного массива, которые в свою очередь будут вызывать некий абстрактный метод для вычисления функции.
Класс может быть обобщённый, в нём следует указать два типа: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);
}
- Создаются реализации указанного класса с нужной реализацией метода
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