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

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

24.01.2020, 00:11. Показов 3976. Ответов 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
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 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
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 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
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 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
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru