2011-02-10 5 views
2

У меня есть быстрый и я принимаю вопрос, но я не смог найти что-либо в Интернете.Как вычислять среднее значение элементов в массиве без знака?

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

+4

Вы знаете, как взять t он средний набор данных? Вы понимаете концепцию массивов? Вы хотите понять синтаксис работы с массивами? Вы хотите сделать это на C или C++? (** C и C++ - разные языки. ** Для каждого из них будут разные ответы. Теги '[c]' и '[C++]' не эквивалентны!) –

ответ

1

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

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

#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])).

+0

Как сохранить значение unsigned char? Предположим, что sum + = unSignedCharArray [i] [j]. какой тип суммы? – Everton

+0

@ Эвертон: Посмотрите мое полное решение. сумма хранится в переменной типа 'int'! – Nawaz

+0

Можете ли вы показать мне, как реализовать без STL? Я новичок, и это очень помогло мне! Спасибо! – Everton

1

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

+2

Не нужно делать всю математику как плавающую точку. Вы можете дождаться, пока не закончите сумму. Если ваши целые числа 32-разрядные, вам понадобится массив 24 МБ, чтобы иметь возможность переполнения, поэтому я считаю, что вполне разумно хранить сумму в 'unsigned int'. –

+0

(И если есть вероятность переполнения, вам будет сложно получить код с плавающей запятой либо из-за потери точности!) –

+0

@R .: Да, для работы точно так же, как указано, 32-битный int имеет довольно приличный шанс быть адекватным, но 1) он не всегда будет, и 2) это так * относительно * хрупко, поэтому (например), казалось бы, незначительное изменение типа ввода может перерыв "известного рабочего" кода. В свое время использование с плавающей запятой было достаточно дорогостоящим, чтобы было целесообразно избегать по возможности, но это было изменено. Фактически, некоторые процессоры теперь выполняют некоторые целые операции, преобразовывая данные в FP, выполняя операцию, преобразовывая результат обратно в целое. Очевидно, что в этом случае использование FP не является серьезной проблемой ... –

5

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; 

Интернет Demo : http://www.ideone.com/IGfht

 Смежные вопросы

  • Нет связанных вопросов^_^