Форум программистов, компьютерный форум CyberForum.ru

Шаблон функции для нахождения среднего арифметичного элементов масива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Bumer@ng
 Аватар для Bumer@ng
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 69
22.09.2010, 20:43     Шаблон функции для нахождения среднего арифметичного элементов масива #1
Написать шаблон функции для нахождения среднего арифметичного елементов масива.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2010, 20:43     Шаблон функции для нахождения среднего арифметичного элементов масива
Посмотрите здесь:

Написать шаблон функции для поиска среднего арифметического массива C++
C++ Как разработать шаблон функции для пересечения 2-х массивов из элементов типа Т?
Написать шаблон функции для поиска среднего арифметического значений массива C++
Создать шаблон для вычисления среднего C++
Составить код функции вычесления среднего значения для нечетных элементов массива А C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
22.09.2010, 20:57     Шаблон функции для нахождения среднего арифметичного элементов масива #2
а где функция?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
23.09.2010, 01:55     Шаблон функции для нахождения среднего арифметичного элементов масива #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdlib>
#include <iostream>
 
template<typename T>
T amean(T* begin, T* end)
{
    T res=0;
    for(T* i=begin; i!=end; ++i)
        res+=(*i);
    res/=(end-begin);
    return res;
}
 
int main(int argc, char* argv[])
{
    int n[3]={2,3,7};
    std::cout<<amean(n, n+3)<<std::endl;
    std::system("pause");
    return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.09.2010, 09:31     Шаблон функции для нахождения среднего арифметичного элементов масива #4
Bumer@ng,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <numeric>
#include <cassert>
#include <cstddef>
 
template<typename T>
double Average(const T* arr, std::size_t size) {
  assert(arr);
 
  if (size == 0)
    return 0.0;
 
  return static_cast<double>(std::accumulate(arr, arr + size, 0)) / size;
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
23.09.2010, 14:56     Шаблон функции для нахождения среднего арифметичного элементов масива #5
CyBOSSeR,
1. работать с double не совсем корректно, т.к. не все классы могут в него конвертироваться, в т.ч. не все пользовательнские объекты
2. использование STL в данной задаче излишне, т.к. при использовании STL такая функция вообще не нужна
3. если уж говорить об STL, то ваш код работает не со всеми типами контейнеров

PS
Хотя с п.3 погарячился, т.к. задача только про массивы
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.09.2010, 15:03     Шаблон функции для нахождения среднего арифметичного элементов масива #6
gooseim, а то что, если в вашу функцию отправить указатели на такой массив:
C++
1
int n[]={2,3};
И результатом будет 2 это нормально?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
23.09.2010, 15:13     Шаблон функции для нахождения среднего арифметичного элементов масива #7
fasked, нормально, надо пользоваться double/float в таких случаях. Все в руках пользователя.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.09.2010, 18:58     Шаблон функции для нахождения среднего арифметичного элементов масива #8
Цитата Сообщение от gooseim Посмотреть сообщение
1. работать с double не совсем корректно, т.к. не все классы могут в него конвертироваться, в т.ч. не все пользовательнские объекты
Цитата Сообщение от Wikipedia
В математике и статистике сре́днее арифмети́ческое (или просто среднее) набора чисел — это сумма всех чисел в этом наборе, делённая на их количество.
Согласно данному определению среднее фрифметическое наборов целых или вещественных чисел, является числом вещественным. Ваш код в соответствии с данным определением некорректен для массивов целочисленных типов.
Цитата Сообщение от gooseim Посмотреть сообщение
2. использование STL в данной задаче излишне, т.к. при использовании STL такая функция вообще не нужна
Основная причина вынесения кода в отдельную функцию - это обработка массивов нулевого размера. Использование библиотек, упрощающих разработку, не может быть излишним.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
23.09.2010, 19:22     Шаблон функции для нахождения среднего арифметичного элементов масива #9
В математике и статистике сре́днее арифмети́ческое (или просто среднее) набора чисел — это сумма всех чисел в этом наборе, делённая на их количество.
Согласно данному определению среднее фрифметическое наборов целых или вещественных чисел, является числом вещественным. Ваш код в соответствии с данным определением некорректен для массивов целочисленных типов.
С точки зрения математики, да. Но с точки зрения программирования 5/4=1 тоже корректно для int.
Не нужно связывать математику с программированием, т.к. в математике 1/3=0,(3), а в программировании всегда будет округление этого числа. Тоже самое касается int - это, грубо говоря, просто погрешность измерения, от которой никуда не уйти.
Самый разумный способ, который я продемонстрировал, это когда пользователь сам выбирает тип, с которым он будет работать. Будь то простой тип или пользовательский класс.
Основная причина вынесения кода в отдельную функцию - это обработка массивов нулевого размера. Использование библиотек, упрощающих разработку, не может быть излишним.
С этим я соглашусь. Был невнимателен к вашему коду.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.09.2010, 19:35     Шаблон функции для нахождения среднего арифметичного элементов масива #10
Цитата Сообщение от gooseim Посмотреть сообщение
Самый разумный способ, который я продемонстрировал, это когда пользователь сам выбирает тип, с которым он будет работать. Будь то простой тип или пользовательский класс.
Тогда еще разумнее дать пользователю выбирать возвращаемый тип и тип данных, согласитесь, что перегонять весь массив из целочисленных значений в другой массив с вещественными числами только ради того, чтобы посчитать среднее арифметическое более точно, не очень то удобно...
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
23.09.2010, 19:43     Шаблон функции для нахождения среднего арифметичного элементов масива #11
Тогда еще разумнее дать пользователю выбирать возвращаемый тип и тип данных, согласитесь, что перегонять весь массив из целочисленных значений в другой массив с вещественными числами только ради того, чтобы посчитать среднее арифметическое более точно, не очень то удобно...
Для таких целей разумно написать еще одну функцию, вроде вашей.
Это сторона двух медалей.
Объясню.
Например, я хочу создать класс типа несократимая дробь. Который с точки зрения математики будет 100% точным. Вызывая мою функцию мы получим число 100% точности, а вызывая вашу, допустим, если будет перегружен оператор double, мы эту точность потеряем. Таким образом мой вариант в этом случае будет более приближен к математике.
Что касается случаев, когда есть массив int и мы хотим получить double, то да, ваш вариант будет более подходящим.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.09.2010, 19:45     Шаблон функции для нахождения среднего арифметичного элементов масива #12
Цитата Сообщение от gooseim Посмотреть сообщение
С точки зрения математики, да. Но с точки зрения программирования 5/4=1 тоже корректно для int.
С точки зрения программирования понятия среднее арифметическое просто не существует. Поэтому данное понятие нужно трактовать только с точки зрения математики, согласно которой 3/2 = 1.5. А округление - это лишь особенности конкретного языка программирования и никакого отношения к решаемой задаче не имеет.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.09.2010, 19:52     Шаблон функции для нахождения среднего арифметичного элементов масива #13
Цитата Сообщение от gooseim Посмотреть сообщение
Для таких целей разумно написать еще одну функцию, вроде вашей.
вообще я имел в виду что-то подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template <typename Ret, typename T>
Ret avg(T *first, T *last)
{
    Ret res = 0;
    
    for(T *i = first; i != last; ++i)
        res += *i;
    
    return res / (last - first);
}
 
int main()
{
    int a[] = { 0, 1, 2 };
    std::cout << avg<float>(a, a + 2) << std::endl;
}
хотя на мой взгляд это все равно дикое излишество и если уж Вы собрались написать такой вот "математический" класс, то будьте добры предоставьбте набор алгоритмов для работы с ним
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
23.09.2010, 20:00     Шаблон функции для нахождения среднего арифметичного элементов масива #14
С точки зрения программирования понятия среднее арифметическое просто не существует. Поэтому данное понятие нужно трактовать только с точки зрения математики, согласно которой 3/2 = 1.5. А округление - это лишь особенности конкретного языка программирования и никакого отношения к решаемой задаче не имеет.
С точки зрения математики любое вычисление с использованием стандартных типов будет некорректным. Потому что вы никогда не вычислим точное значение например 1/3.
Например, с точки зрения математики, x/y=z и y=x/z. Эти две формулы при определенных параметрах в программировании никогда не сойдутся. А вот округление простых типов, связанное с языком программирования, как раз не из области математики.

Добавлено через 3 минуты
если уж Вы собрались написать такой вот "математический" класс, то будьте добры предоставьбте набор алгоритмов для работы с ним
Вам правда этого хочется? Я ведь могу
А ваша переделка моей функции мне понравилась.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2010, 20:09     Шаблон функции для нахождения среднего арифметичного элементов масива
Еще ссылки по теме:

C++ Разработайте перегруженные функции нахождения среднего арифметического и среднего геометрического трех целых и вещественных чисел
C++ Шаблон функции для нахождения суммы отрицательных элементов массива
C++ Шаблон функции нахождения корней квадратного уравнения

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

Или воспользуйтесь поиском по форуму:
Bumer@ng
 Аватар для Bumer@ng
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 69
23.09.2010, 20:09  [ТС]     Шаблон функции для нахождения среднего арифметичного элементов масива #15
CPASIBA!!!
Yandex
Объявления
23.09.2010, 20:09     Шаблон функции для нахождения среднего арифметичного элементов масива
Ответ Создать тему
Опции темы

Текущее время: 16:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru