C++ для начинающих. Численный алгоритм accumulate

Один из немногочисленных численных алгоритмов С++ — это численный алгоритм accumulate. Задача этого алгоритма достаточно проста — Выполнять различную обработку численных элементов. Тем кто знаком с обычными массивами, тем будет проще понять что такое просуммировать элементы массива, вычислить произведение всех элементов массива, просуммировать только те значения массива, которые лежат в диапазоне и должны быть знакомы подобные задачи.

Я не буду много писать и описывать. Просто продемонстрирую два максимально примитивных примера. (один в разных вариантах)

Максимально простой пример суммы элементов в массиве

  • По умолчанию accumulate суммирует элементы. Нужно указать точку старта, конечную точку и значение от которого начинаем прибавлять. Чаще всего это ноль, но может быть результат других вычислений
  • Пример на массиве

Смотрим на 15 строку. Точка старта a
Если вы знали, что имя массива — это указатель на его первый элемент, то хорошо, если не знали, то теперь знаете. В C++ довольно часто применяется арифметика указателей. Арифметика указателей — это когда вместо обычного сложения чисел происходит смещение адреса. Я могу неправильно пояснить, но понятно. Вы указываете +5 и смещение происходит 5 раз, вы указываете +6 и смещение происходит 6 раз. Сам указатель — это переменная, которая хранит адрес памяти и вот если компилятор видит, что вы складываете не число, а какой-то адрес памяти, то он выполнит смещение, если компилятор видит, что вы используете какую-то переменную — не адрес памяти, то будет произведена попытка сложения. Такая своеобразная двойственность. Еще раз подчеркну, что я мог выразиться неточно, но моя цель в том, чтобы читатель понял как это выглядит и не воспринимал одно за другое.
Вот чтобы нам просуммировать ровно n элементов из массива, то логично, что чтобы получить конечную точку, к стартовой точке надо прибавить n (где n — количество элементов в массиве). Третьим параметром указан 0.0 — этот параметр будет точкой отсчета, а тип этого параметра будет типом значения, которое возвратит accumulate. Так как ноль указан с точкой, то и тип будет с точкой.

Надеюсь верхнюю часть описал более менее ясно. Теперь остается просмотреть и поизучать работу программы. Это совсем несложный материал для понимания.

Чуть другой пример. Тоже для суммирования. Например если надо просуммировать все элементы кроме первого и последнего

Если вы поняли все, что я описывал выше, то должны хорошо понимать, что здесь произошло.

Если рассматривать оговариваемый численный алгоритм на примере какого-нибудь контейнера, такого как вектор, то в точку начала и в конечную точку можно записывать итераторы.

Мало, но все-таки отличается от работы с массивом. К итераторам вектора (точки начала и конечной точке) также можно прибавлять или удалять численные значения. Главное следите за тем, чтобы конечна точка не вылезала за диапазоны вектора. v.end()+1 скорее всего должен выдать ошибку во время выполнения, ибо выход за границы вектора.
……………………………….
Буду считать, что верхнее понятно и уже воспринято. Может возникнуть вопрос о том, умеет ли что-то еще accumulate. Да умеет. Например с помощью него можно перемножить все элементы контейнера. Я покажу пример на векторе. Все равно примеры с массивом очень похожи и относительно того, что я уже сказал не должны возникнуть серьезные вопросы.

  • Перемножить все элементы в векторе

Вы заметили, что был добавлен шаблон. Не все понимают что это такое и зачем нужен. Но думается мне, что с явным указанием типа вам нужно будет думать чуть больше чем с этим шаблоном. Этот шаблон описывается для того, чтоб не думать о типах переменных.
Кроме этого вы должны были заметить, что в численный алгоритм было добавлено еще одно значение, а именно функция, mult, которая возвращает произведение x и y.

В зависимости от вашего желания и ваших потребностей внутри функции, описанной у меня как mult, можно менять результат вычисления, например вычислять только при определенных данных, да и вообще производить разнообразные вычисления, которые зависят только от вас.

mult<double> — в угловых скобках тип, который я хочу получить для результата выполнения функции.

Сообщаю сразу, что описал не всё, что можно. Есть еще то, что можно узнать про этот численный метод accumulate. Я просто не вникал глубже.

Один из примеров работы accumulate

  • Посчитать сколько раз символ встречается в строке

  • Кроме того, что алгоритм способен выполняет стандартные операции для числовых значений, аналогичные показанным выше, благодаря алгоритму несложно выполнять такие операции как конканентация строк. (склеивание строк)

res.c_str(); —> Функция c_str возвращает константный указатель на стандартную строку C, аналогичную строке res
об этой функции Можно прочитать на http://www.cyberforum.ru/cpp-builder/thread145005.html


Есть еще один пример, который лично я не смогу расписать как по нотам, но не думаю, что этот пример будет лишним.

  • В строке string содержаться только цифры. Определить их сумму


В этом примере с помощью accumulate будут суммироваться ASCII коды символов, входящих в строку s. Поэтому при добавлении ASCII кода каждого символа следует вычитать из суммы код ‘0’. Всего символов s.size(), поэтому в целом из суммы будет вычтено число s.size() * ‘0’. Это тоже самое, что суммирование при помощи accumulate начинать со значения -s.size()* ‘0’.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

5 комментариев: C++ для начинающих. Численный алгоритм accumulate

  • андре говорит:

    Подскажите где у меня ошипка

    • admin говорит:

      Вообще весь код — одна ошибка.
      Может быть комментарий при передаче на сайт испортился?

      Это разные пробы?

      Что должно быть? Выделяйте код тегами [php][/php]

  • андре говорит:

    пробую разработать программу компютерная диагностики аудио видео радио аппаратуры пробую всавлять все

  • андре говорит:

    Мне не написать  какие алгоритмы надо и все остальное в этой программе должно быть

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- У меня компьютер сам выключается... че делать? - У тебя системник внизу стоит? - Да. - Поменяй носки... он сознание теряет.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок