Задача выдает не правильное значение(работа с делегатами и анонимными методами)? Суть задачи проста - нужно создать проект по шаблону Console Application(.NET Core). Создать анонимный метод, который принимает в качестве аргумента массив делегатов и возвращает среднее арифметическое возвращаемых значений методов сообщенных с делегатами в массиве. Методы, сообщенные с делегатами из массива, возвращают случайное значение типа int. Мое решение:using System; namespace ConsoleApp44 { public delegate int Number(); public delegate int MediumCalc(Number[] arrayX); class Program { public static int Randomizer() { Random rand = new Random(); return rand.Next(1, 10); } static void Main(string[] args) { Number[] numArr = new Number[5]; for(int i = 0; i < numArr.Length; i++) { numArr[i] = Randomizer; Console.Write(" " + numArr[i].Invoke() + " "); } Console.WriteLine();
MediumCalc mediumCalc = delegate (Number[] arrayX) { int sum = 0; for (int i = 0; i < arrayX.Length; i++) { sum += arrayX[i](); } return ((sum) / (arrayX.Length)); }; Console.WriteLine(mediumCalc(numArr)); Console.ReadKey(); } } } Но возникает проблема- в результате он выдает не правильное сред. арифметическое значение. Допустим если метод Randomizer() "выплюнул" 5 чисел - {6, 8, 6, 3, 5} А mediumCalc(numArr) возвращает { 3 }. Что совершенно не логично с моей точки зрения( (6 + 8 + 6 +3 + 5) / (5) != 3)Подскажите может я что то где то накосячил или напутал!
Проблема заключается в делении типа int, которое приводит к потере дробной части. Вам нужно явно привести сумму к типу double перед делением, чтобы получить правильный результат. Вот исправленный код:
using System; namespace ConsoleApp44 { public delegate int Number(); public delegate double MediumCalc(Number[] arrayX); class Program { public static int Randomizer() { Random rand = new Random(); return rand.Next(1, 10); } static void Main(string[] args) { Number[] numArr = new Number[5]; for(int i = 0; i < numArr.Length; i++) { numArr[i] = Randomizer; Console.Write(" " + numArr[i].Invoke() + " "); } Console.WriteLine(); MediumCalc mediumCalc = delegate (Number[] arrayX) { double sum = 0; for (int i = 0; i < arrayX.Length; i++) { sum += arrayX[i](); } return ((sum) / (arrayX.Length)); }; Console.WriteLine(mediumCalc(numArr)); Console.ReadKey(); } } }
Проблема заключается в делении типа int, которое приводит к потере дробной части. Вам нужно явно привести сумму к типу double перед делением, чтобы получить правильный результат. Вот исправленный код:
using System;namespace ConsoleApp44
{
public delegate int Number();
public delegate double MediumCalc(Number[] arrayX);
class Program
{
public static int Randomizer()
{
Random rand = new Random();
return rand.Next(1, 10);
}
static void Main(string[] args)
{
Number[] numArr = new Number[5];
for(int i = 0; i < numArr.Length; i++)
{
numArr[i] = Randomizer;
Console.Write(" " + numArr[i].Invoke() + " ");
}
Console.WriteLine();
MediumCalc mediumCalc = delegate (Number[] arrayX)
{
double sum = 0;
for (int i = 0; i < arrayX.Length; i++)
{
sum += arrayX[i]();
}
return ((sum) / (arrayX.Length));
};
Console.WriteLine(mediumCalc(numArr));
Console.ReadKey();
}
}
}
Теперь результат деления будет корректным.