Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157

Шаблонный класс Average<T>

24.01.2020, 00:11. Показов 3899. Ответов 45

Студворк — интернет-сервис помощи студентам
Всем доброй ночи. Прошу помощи в таком вопросе. Есть задание
Разработать шаблонный класс Average<T>, который вычисляет среднее для набора значений типа T.
У класса должны быть функции:
- add(T value) - добавить значение T к вычислению среднего;
- T average() - функция вычисляет среднее для всех добавленных значений;
- reset() - сбросить состояние объекта к изначальному.
В качестве типа Т допускаются только числовые типы.

Что у меня получилось.
C#
1
2
3
4
5
6
7
8
 List<List<double>> number = new List<List<double>>();
 
            number.Add(new List<double> { 1, 2, 3 });
            number.Add(new List<double> { 4, 5, 6 });
            double average = number.Average(inner => inner[0]);
            Console.WriteLine($"Среднее{average}");
 
            Console.ReadLine();
Но дело в том, что я ни как не могу написать функцию reset() для сброса в исходное состояние.
Если есть у Вас время , то прошу помогите кодом. Уже 2 день мучаюсь.

Добавлено через 2 минуты
Вот написал второй вариант . Но там я не могу добавить Add() для значения вычисления среднего.

C#
1
2
3
4
5
6
7
8
9
//Console.WriteLine("Операция Average\n\n************\n");
            //IEnumerable<int> numers = Enumerable.Range(1, 10);
           
            //Console.WriteLine("Последовательность чисел\n");
            //foreach (var result in numers)
 
            //    Console.WriteLine(result);
            //double average = numers.Average();
            //Console.WriteLine("Средне" + average);
Помогите как сделать ?. Это ТЗ.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2020, 00:11
Ответы с готовыми решениями:

Шаблонный класс
Здравствуйте! Долго искал в интернете примеры, как написать класс-шаблон на шарпе, но кроме теории ничего не нашел. Из справки MSDN мало...

Частично шаблонный класс
У меня есть класс MainClass, от него наследуются классы Class1, Class2, Class3 Я хочу сделать такой класс Manager&lt;T&gt; чтобы я...

Что такое шаблонный класс, и для чего он нужен?
Объяснительная​ пожалуйста, что такое шаблонный класс, и для чего он нужен? Никак не могу понять, если можно то с примером.

45
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157
24.01.2020, 16:50  [ТС]
Студворк — интернет-сервис помощи студентам
Вобщем я тут так исправил. Мне нужно чтоб выводилось дробное число. Но не всегда. А вот когда вводиш пример; 10,1 или 12,1.
C#
1
2
3
4
5
  Average<decimal> d = new Average<decimal>();
         
            d.add(10);
            d.add(1);
            Console.WriteLine(d.average());
так- как, такая запись, не выводит полностью сумму. Выводит число без запятой.
C#
1
2
3
 Average<double> d = new Average<double>();
            d.add(5);
            d.add(3);
Потому как не всегда нужно целые числа выводить. И Decimal данную ситуацию исправляет.
Но всем большое спасибо за помощь.
Очень помогли .
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.01.2020, 17:12
Цитата Сообщение от QuakerRUS Посмотреть сообщение
where T : unmanaged { }
И что это даёт?
Для unmanaged оператор + всё равно же не определён.

Добавлено через 12 минут
Skriptik, советую вам ещё и конструктор с параметрами добавить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    class Average<T>
    {
        private List<T> datas = new List<T>();
 
        public void add(T value) =>datas.Add(value);
 
        public T average()
        {
            dynamic sum = 0;
            foreach (T t in datas)
                sum += datas[i];
 
            return sum / datas.Count;
        }
 
        public void reset() => datas.Clear();
 
        public Average() { }
        public Average(params T[] items)
        {
            foreach (T t in items)
                add(t);
        }
    }
Тогда использовать будет удобнее
C#
1
2
3
4
5
            Average<decimal> d = new Average<decimal>(10, 1);
 
            //d.add(10);
            //d.add(1);
            Console.WriteLine(d.average());
Ещё есть претензия не к вам, а к заданию - оно нарушает рекомендованные правила Naming Guidelines.
Имена членов типа (Методы, Свойства, Поля) должны начинаться с большой буквы.
1
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
24.01.2020, 17:15
Элд Хасп, можно конвертить тип и пользоваться знаками, но внутри у тебя будет всё равно double какой-нибудь
C#
1
2
3
4
5
6
7
8
9
public class Foo<T> where T : unmanaged
    {
        double c;
 
        public Foo(T a, T b)
        {
            c = Convert.ToDouble(a) + Convert.ToDouble(b);
        }
    }
0
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
24.01.2020, 17:17
Цитата Сообщение от QuakerRUS Посмотреть сообщение
public class StatisticItemHits<T> where T : unmanaged { }
это не решит проблемы. все равно придется приводить к какому-нибудь числовому типу, хотя ограничить передачу типов частично получится
0
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157
24.01.2020, 17:19  [ТС]
Да, улучшать до бесконечности. По мне так вообще вот как я бы сделал
C#
1
2
3
4
5
6
7
8
9
IEnumerable<int> numers = Enumerable.Range(1, 10);
 
            Console.WriteLine("Последовательность чисел\n");
            foreach (var result in numers)
 
                Console.WriteLine(result);
 
            double average = numers.Average();
            Console.WriteLine("Средне" + average);
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
24.01.2020, 17:21
Можно попробовать так, но мне кажется, что это изврат.
C#
1
2
3
4
5
6
7
8
public T average()
        {
            double sum = 0;
            foreach (T t in datas)
                sum += Convert.ToDouble(t);
 
            return (T)Convert.ChangeType(sum / datas.Count, GetType());
        }
0
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157
24.01.2020, 17:22  [ТС]
Но в задании надо через Add
и еще reset();
через List не как , только через IEnurable

Ну вот еще вариантик;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  
class GFG { 
  
    // Driver code 
    public static void Main() 
    { 
        // Initialize a string object 
        string str = "0 1 2 3 4 5 6 7 8 9"; 
  
        // Instantiate a CharEnumerator object 
        CharEnumerator chEnum = str.GetEnumerator(); 
  
        // Printing the string 
        while (chEnum.MoveNext()) 
            Console.Write(chEnum.Current); 
  
        // Reset the CharEnumerator object 
        chEnum.Reset(); 
        Console.WriteLine(); 
  
        // Printing the string again 
        while (chEnum.MoveNext()) 
            Console.Write(chEnum.Current); 
    } 
}
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
24.01.2020, 18:54
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И что это даёт?
Да собственно только ограничение и дает.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для unmanaged оператор + всё равно же не определён.
Цитата Сообщение от hamin Посмотреть сообщение
это не решит проблемы. все равно придется приводить к какому-нибудь числовому типу, хотя ограничить передачу типов частично получится

Если нужна работа операторов, то можно, например, в эту тему заглянуть, там есть варианты.
Арифметические операции для классов с обобщенным типом

Добавлено через 21 минуту
А если конкретно про текущую задачу говорить, то достаточно использовать тип decimal. В него любой числовой тип может неявно преобразовываться без потери точности. Правда float придется сначала к double привести.
https://docs.microsoft.com/ru-... onversions
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
24.01.2020, 19:13
Цитата Сообщение от QuakerRUS Посмотреть сообщение
В него любой числовой тип может неявно преобразовываться без потери точности.
попробуте преобразуйте неявно дабл 10^300 в decimal
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
24.01.2020, 19:26
КОП, действительно, невнимательно прочитал. Тогда можно использовать double и проблем с float не будет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.01.2020, 19:31
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Тогда можно использовать double и проблем с float не будет.
long и decimal в double без потерь не преобразуешь.
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
24.01.2020, 19:44
Элд Хасп, да, поспешил с выводом.
0
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157
25.01.2020, 13:18  [ТС]
Мне ответили что не так!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private static void Main(string[] args)
        {
            
            Console.WriteLine("Операция Average\n\n************\n");
           var resultList = new List<decimal>();
           resultList.Add(5);
           resultList.Add(2);
           Console.WriteLine($"Среднее значение:{resultList.Average()}");
           Console.ReadLine();
        }
 
        private class Average<T> // Вот этот класс не используется . В intellisense пишет что класс Average<T> Не используется.То есть можно вообще сделать вот так.
        {
            List<T>_numberList = new List<T>();
 
            public void Add(T value)
            {
                _numberList.Add(value);
            }
            public  T Avverage()
            {
                dynamic sum = 0;
                for (int i = 0; i < _numberList.Count; i++)
                {
                    sum += _numberList[i];
                }
 
                return sum / _numberList.Count;
            }
            public  void Reset()
            {
                _numberList.Clear();
            }
        }
    }

То есть можно вообще сделать вот так.
C#
1
2
3
4
5
6
7
8
9
10
 private static void Main(string[] args)
        {
            
            Console.WriteLine("Операция Average\n\n************\n");
           var resultList = new List<decimal>();
           resultList.Add(5);
           resultList.Add(2);
           Console.WriteLine($"Среднее значение:{resultList.Average()}");
           Console.ReadLine();
        }
И все так же будет работатью. А класс Average<T> вообще не используется. Проверьте.

Добавлено через 5 минут
Так что коллеги , все что мы с вами делали это не так.
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
25.01.2020, 13:23
Цитата Сообщение от Skriptik Посмотреть сообщение
Так что коллеги , все что мы с вами делали это не так.
коллега вы не смогли даже код минимально скопировать))
может ну его это программирование раз оно так тяжко дается?)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
25.01.2020, 13:33
Цитата Сообщение от Skriptik Посмотреть сообщение
А класс Average<T> вообще не используется. Проверьте.
??? !!!
И в чём смысл?
Вы писали
Цитата Сообщение от Skriptik Посмотреть сообщение
Есть задание
Разработать шаблонный класс Average<T>, который вычисляет среднее для набора значений типа T.
У класса должны быть функции:
- add(T value) - добавить значение T к вычислению среднего;
- T average() - функция вычисляет среднее для всех добавленных значений;
- reset() - сбросить состояние объекта к изначальному.
В качестве типа Т допускаются только числовые типы.
А сейчас выясняется, что вы просто не знали как посчитать среднее значение последовательности?
А задание сами себе придумали?
1
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
25.01.2020, 13:36
Цитата Сообщение от Элд Хасп Посмотреть сообщение
??? !!!
И в чём смысл?
посмотрите на Main
коллега использует List а не класс Average который ему написали
конечно код проверку не прошел))
0
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157
25.01.2020, 13:37  [ТС]
Тут не в копи паст дело. А дело в том, что этод код не правильный. Я скопировал ровно то, что Вы мне набросали. И привел примеры вашего кода. Хотя я сделал по другому. И он прошел проверку.

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  Console.WriteLine("Операция Average\n\n************\n");
            var d = new Average<decimal>();
         
           d.Add(5);
           d.Add(2);
           Console.WriteLine($"Среднее значение:{d.avverage()}");
           Console.ReadLine();
        }
 
    }
    class Average<T>
    {
        List<T> _numberList = new List<T>();
 
        public void Add(T value)
        {
            _numberList.Add(value);
        }
Коллега и вот это тоже не правильно.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
25.01.2020, 13:42
Цитата Сообщение от FateOri Посмотреть сообщение
посмотрите на Main
коллега использует List а не класс Average который ему написали
конечно код проверку не прошел))
Ну, и я об этом же.

Добавлено через 1 минуту
Skriptik, вы толком объясните, что за задание у вас и откуда оно.
Найти среднее значение последовательности или создать класс с заданным функционалом?
1
-26 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 157
25.01.2020, 13:47  [ТС]
Да в том то и дело, что задание не я придумал а один и… от работодатель. Когда я ему отправил код, то его программисты сказали ему что код не правильный . Но когда я попросил его мне обосновать, то он сказал что все не так и код проверку не прошел. Хотя что не так я так и не понял. Я ему 3 варианта послал и все не так .

Добавлено через 1 минуту
К вам у меня претензий нет все хороше обьяснили и я считаю что код соответствует полностью заданию который мне этот И...от прислал.

Добавлено через 2 минуты
У меня все четко считает я поменял double на decimal. Я имею в виду var d = new Average<decimal>();И все норм . Но по его мнению код не правильный . Что не так , я б...ь ума не приложу. За мат извеняюсь.
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
25.01.2020, 13:50
Цитата Сообщение от Skriptik Посмотреть сообщение
Да в том то и дело, что задание не я придумал а один и… от работодатель.
та вам рано просто идти работать
почитайте книжки набейте руку на простых заданиях
а потом уже пытайтесь устроится а то так только позоритесь перед работодателем))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2020, 13:50
Помогаю со студенческими работами здесь

Генерик от переменной Type, создать шаблонный класс с нужным типом
Type type_ = typeof(int); //например ListBin&lt;type_&gt; LB = new ListBin&lt;type_&gt;(str); выдает ошибку =/ типо type_ не тип... как то так ...

Шаблонный класс: параметр для шаблона должен быть классом и иметь поле ID
Мне нужно (точнее весьма желательно) сделать такую вещь. Шаблонный класс, но вот с таким ограничением - параметр для шаблона должен быть...

Используя шаблонный класс vector, напишите функцию нахождения скалярного произведения векторов
Помогите реализовать

Используя шаблонный класс vector, напишите функцию нахождения максимального элемента в одномерном массиве
Не понимаю, как это сделать, можете написать программу

Помогите разобраться с кодом расчета min, max, average
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru