Как вычислить среднее значение элементов в массиве беззнаковых символов?


У меня есть быстрый, и я предполагаю, что вопрос, но я не смог ничего найти в интернете.

Как вычислить среднее число элементов в массиве беззнаковых символов? Или, скорее, выполнять операции с неподписанным символом?

3 2

3 ответа:

Арифметические операции прекрасно работают на unsigned char, хотя иногда вас может удивить тот факт, что арифметика В C всегда способствует int.

В стандартной библиотеке шаблонов C++,

#include <numeric>
template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);
Для вычисления суммы unsigned char arr[] можно использовать accumulate(arr, arr + sizeof(arr) / sizeof(arr[0]), 0). (0 - это int здесь. Возможно, вы сочтете более целесообразным использовать другой тип.)

Без STL это тривиально вычисляется с помощью цикла.

Среднее - это сумма, деленная на длину (sizeof(arr) / sizeof(arr[0])).

C++03 и C++0x:

#include <numeric>

int count = sizeof(arr)/sizeof(arr[0]);
int sum = std::accumulate<unsigned char*, int>(arr,arr + count,0);
double average = (double)sum/count;

Онлайн-демонстрация: http://www.ideone.com/2YXaT


Только C++0x (с использованием лямбды)

#include <algorithm>

int sum = 0;
std::for_each(arr,arr+count,[&](int n){ sum += n; });
double average = (double)sum/count;

Онлайн-демонстрация: http://www.ideone.com/IGfht

Примерно так же, как и все остальное, вы складываете их и делите на количество. Чтобы избежать переполнения, вы, как правило, хотите преобразовать их во что-то большее, пока вы делаете математику. Если (как это часто бывает) вы хотите получить результат с плавающей точкой, вы также захотите сделать всю математику с плавающей точкой.