Задача выдает не правильное значение(работа с делегатами и анонимными методами)? Суть задачи проста - нужно создать проект по шаблону 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)Подскажите может я что то где то накосячил или напутал!

21 Авг 2019 в 07:00
422 +1
1
Ответы
1

Проблема заключается в делении типа 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();
}
}
}

Теперь результат деления будет корректным.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 727 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир