Урок 22. Сумма элементов массива
Просмотров 20.3к. Обновлено 23 ноября 2020
Урок из серии: «Язык программирования Паскаль«
При работе с элементами одномерного массива можно выделить несколько видов подзадач. Алгоритмы для решения этих подзадач необходимо знать.
На этом уроке рассмотрим алгоритмы для нахождения суммы (или произведения) элементов одномерного массива. Здесь могут быть различные модификации — найти сумму элементов с заданным свойством.
Пример 1. Найти сумму элементов массива.
Решение.
Воспользуемся написанными ранее процедурами для ввода и вывода массива. Массив заполним случайными числами.
Добавим функцию Sum для нахождения суммы элементов массива. В алгоритме переменная i — является счетчиком элементов массива, s — сумма элементов массива, она вычисляется по реккурентной формуле s = s+m(i).
Обработка элементов массива производится в цикле. Перед циклом сумме присваивается начальное значение равное нулю: sum := 0. В теле цикла записывается рабочая формула для накопления суммы: s := s + m[i].
Текст функции получится таким:
Function Sum(m: myarray): Integer; Var i, s : Integer; Begin sum:=0; For i:=1 To n Do {к уже найденной сумме первых (i-1) элементов прибавляем i-ый элемент} s:=s+m[i]; sum:=s; End;
Составим программу. В ней воспользуемся для заполнения массива процедурой Init2, которая заполняет массив случайными числами из заданного интервала.
Program primer_1; Const n = 30; {n - это количество элементов массива} Type myarray = Array [1...n] Of Integer; Var C : myarray; s : Integer; {s - сумма всех элементов массива} Procedure Init2(a,b: integer; Var m : myarray); {Процедура заполнения массива случайными числами из интервала [a,b] и вывода на экран} ... Function Sum(m: myarray): Integer; {Функция для нахождения суммы элементов массива} ... Begin {main} {заполняем массив случайными числами из интервала [-25, 25] и выводим на экран} Init2(-25, 25, C); s:=Sum(C); {находим сумму элементов} Writeln ('Их сумма равна ',s);{выводим результат} Readln; End.
Для нахождения произведение элементов массива, переменной P перед циклом присваиваем начальное значение равное 1: P:= 1. В теле цикла ставится рабочая рекуррентная формула для нахождения произведения: P:= P* C[i].
Пример 2. Найти сумму элементов массива, кратных заданному числу Решение. Воспользуемся функцией Sum из предыдущей программы, но будем суммировать не все элементы, а только те, которые делятся на заданное число (остаток от деления равен 0)
Function Sum(m : myarray) : Integer; Var i, s, k : Integer; Begin Writeln ('введите число'); Readln(k); s:=0; {начальное значение суммы} For i:=1 To n Do {если элемент кратен k,то прибавляем его сумме} If m[i] Mod k = 0 Then s := s + m[i]; sum:=s;
End;
Все остальное можно оставить без изменения.
Вы познакомились с алгоритмом суммирования элементов массива. На следующем уроке продолжим изучение алгоритмов для одномерных массивов.
Improve Article
Save Article
Improve Article
Save Article
In this article, we will learn how we can find the sum of all elements/numbers of the given array. There are many approaches to solving the problems using for loop, forEach() method, and reduce() method.
Below all the approaches are described with a proper example:
JavaScript for loop: We are simply going to iterate over all the elements of the array using a Javascript for loop to find the sum.
Example:
Javascript
<script>
var
arr = [4, 8, 7, 13, 12]
var
sum = 0;
for
(let i = 0; i < arr.length; i++) {
sum += arr[i];
}
console.log(
"Sum is "
+ sum)
</script>
Output:
Sum is 44
JavaScript forEach() Method: We are going to use the Javascript forEach() method of the array to calculate the sum.
Javascript
<script>
var
arr = [4, 8, 7, 13, 12]
var
sum = 0;
arr.forEach(x => {
sum += x;
});
console.log(
"Sum is "
+ sum);
</script>
Output:
Sum is 44
JavaScript reduce() Method: We are going to use the Javascript reduce() method to find the sum of the array.
Example:
Javascript
<script>
var
arr = [4, 8, 7, 13, 12]
var
sum = arr.reduce(
function
(x, y) {
return
x + y;
}, 0);
console.log(
"Sum using Reduce method: "
+ sum);
</script>
Output:
Sum using Reduce method: 44
Using Recursion:
Javascript
var
arr = [4, 8, 7, 13, 12];
function
sumArray(arr, index) {
if
(index === arr.length) {
return
0;
}
return
arr[index] + sumArray(arr, index + 1);
}
console.log(
"Sum is "
+ sumArray(arr, 0));
Time Complexity: O(n)
Auxiliary Space: O(1)
Improve Article
Save Article
Improve Article
Save Article
In this article, we will learn how we can find the sum of all elements/numbers of the given array. There are many approaches to solving the problems using for loop, forEach() method, and reduce() method.
Below all the approaches are described with a proper example:
JavaScript for loop: We are simply going to iterate over all the elements of the array using a Javascript for loop to find the sum.
Example:
Javascript
<script>
var
arr = [4, 8, 7, 13, 12]
var
sum = 0;
for
(let i = 0; i < arr.length; i++) {
sum += arr[i];
}
console.log(
"Sum is "
+ sum)
</script>
Output:
Sum is 44
JavaScript forEach() Method: We are going to use the Javascript forEach() method of the array to calculate the sum.
Javascript
<script>
var
arr = [4, 8, 7, 13, 12]
var
sum = 0;
arr.forEach(x => {
sum += x;
});
console.log(
"Sum is "
+ sum);
</script>
Output:
Sum is 44
JavaScript reduce() Method: We are going to use the Javascript reduce() method to find the sum of the array.
Example:
Javascript
<script>
var
arr = [4, 8, 7, 13, 12]
var
sum = arr.reduce(
function
(x, y) {
return
x + y;
}, 0);
console.log(
"Sum using Reduce method: "
+ sum);
</script>
Output:
Sum using Reduce method: 44
Using Recursion:
Javascript
var
arr = [4, 8, 7, 13, 12];
function
sumArray(arr, index) {
if
(index === arr.length) {
return
0;
}
return
arr[index] + sumArray(arr, index + 1);
}
console.log(
"Sum is "
+ sumArray(arr, 0));
Time Complexity: O(n)
Auxiliary Space: O(1)
Сегодня мы начнём рассматривать алгоритмы обработки
информации в массивах. Достаточно часто встречается ситуация, при которой нам
необходимо сложить элементы массива, рассмотрим задачу. На складе яблоки
хранятся в мешках, известно количество мешков и количество яблок в каждом
мешке. Директор склада попросил нас написать программу, которая вычисляет
количество яблок на складе.
Обозначим через n количество мешков на складе, через i
– номер текущего мешка, а через s – сумму яблок в мешках. Очевидно, что
для решения данной задачи нам удобно будет представить склад в виде массива
целых чисел a, элементами которого будут мешки с яблоками. Значениями
элементов будут количества яблок в мешках.
Составим блок-схему алгоритма решения задачи.
Блок-схема начинается с блока «Начало», далее будет следовать блок ввода
количества мешков на складе – n.
За ним будет следовать цикл «Для i от 1 до n», в котором будет блок ввода i-того
элемента массива. Далее мы должны задать значение суммы яблок в мешках, равной
нулю, так как пока ни одного мешка мы не просмотрели, s =
0.
Потом снова будет следовать цикл «Для i от 1 до n», внутри
которого будет одна команда – присваивания переменной s сумму её
текущего значения и значения количества яблок в i-том мешке, s = s + a[i].
Таким образом, после просмотра всех n мешков, s будет содержать
сумму яблок во всех мешках. Далее будет следовать блок вывода s, блок-схема всегда заканчивается
блоком «Конец».
Блок-схема
алгоритма решения задачи
Начнём написание программы. Запишем служебное слово program. Назовём нашу программу sklad.
В разделе описания переменных var укажем,
что нам нужен массив a,
так как количество мешков в момент написания программы неизвестно, возьмём
размерность массива равной максимально возможному количеству мешков, например 100 элементов типа integer. А также нам понадобится
переменная n,
в которой будет храниться количество мешков на складе, переменная i,
которая будет хранить индекс текущего элемента массива, и переменная s, которая будет хранить значение
суммы яблок в мешках. Так как в данной задаче все величины выражаются в целых
числах, все переменные будут типа integer.
Между
служебными словами begin и end запишем тело программы.
Для начала выведем на экран поясняющее сообщение о том, что это программа
подсчёта яблок на cкладе
с запросом на ввод количества мешков на складе. Затем запишем команду
считывания значения переменной n с переходом на следующую строку. Далее запишем цикл for i:=1
to
n
do,
который будет содержать команду вывода на экран запроса на ввод количества
яблок в i-том мешке и команду считывания с переходом на следующую строку
значения
i-того элемента массива a.
Таким образом, мы ввели количество яблок в мешках.
Теперь
присвоим переменной s значение 0 и запишем цикл for i:=1
to
n
do,
который будет содержать всего одну команду – присваивание переменной «С», суммы
её текущего значения и значения И-того элемента массива «A»,
s:=
s
+ a[i].
Далее будет следовать команда вывода на экран поясняющего сообщения с текстом
«Количество яблок на складе:», а также значения переменной s.
Программа
решения задачи
Запустим программу на выполнение, пусть на складе
будет 4 мешка яблок, в первом мешке будет 100 яблок, во втором – 200, в третьем
– 300, а в четвёртом – 400. Действительно, всего на складе должна быть тысяча
яблок. Программа работает верно.
Пример
работы программы
Ещё раз рассмотрим нахождение суммы элементов массива
на примере нашей программы. В начале для хранения суммы элементов массива
выделяется ячейка памяти, в нашем случае это переменная s, затем ей присваивается значение,
равное 0, после чего для каждого элемента массива этой переменной присваивается
сумма её значения и значения элемента массива.
Теперь мы знаем, как найти сумму элементов массива.
Рассмотрим ещё одну задачу. Написать программу для нахождения суммы цифр целого
положительного числа. Длина числа до девяти цифр.
Обозначим число, которое вводится – k, количество его цифр – n, номер текущей цифры – i,
сумму цифр – s,
а также нам понадобится массив a, элементами которого будут цифры данного числа.
Для
начала составим блок-схему данного алгоритма. Она будет начинаться с блока
«Начало», за которым будет следовать блок ввода числа k, далее нам нужно
проинициализировать переменную i –
она
будет равна нулю, так как массив цифр a пока не содержит ни одной цифры.
Теперь
нам нужно сделать из числа k
массив цифр. Запишем для этого цикл «Пока» с условием k >
0, который
будет содержать команду выделения последней цифры числа k и записи её в
массив a.
Для этого достаточно использовать функцию нахождения остатка от деления,
которая в языке Pascal
называется mod,
так в начале нам нужно определить, в какой элемент массива a мы будем записывать данную цифру.
Для этого к числу i нужно прибавить единицу.
Теперь
i-тому элементу массива a присвоим значение последней цифры числа k, это будет остаток от его деления на
10. Теперь нужно убрать из числа k его последнюю цифру, для этого
достаточно присвоить числу k результат его безостаточного
деления на 10, данная операция записывается в языке Pascal
словом div.
Таким образом, после выполнения указанного цикла действий в массиве a
будут содержаться цифры числа k,
а в переменной i будет содержаться номер элемента массива a, в который была сохранена старшая по
разряду цифра. Он будет совпадать с количеством цифр в числе, поэтому присвоим
переменной n
значение переменной i. А также присвоим
переменной s
значение 0. Далее будет следовать уже знакомый нам цикл вычисления суммы
элементов массива a.
После него будет блок вывода
s
–
суммы цифр числа. Блок-схема будет заканчиваться
блоком «Конец».
Блок-схема
алгоритма решения задачи
Посмотрим, как работает наш алгоритм на примере числа
345. В начале переменной i присваивается значение 0. Так как 345 больше 0 – i увеличится
на 1, после чего первому элементу массива будет присвоено значение остатка от
деления 345 на 10, то есть 5. Само число k будет без остатка поделено на 10, и
станет равным 34. Далее так как 34 больше 0, значение переменной i
снова
увеличится на 1 и станет равным 2. Так i-тому элементу массива
будет присвоен результат остатка от деления 34 на 10, то есть 4. А число k снова будет поделено без остатка на
10 и станет равным 3. Так как 3 больше 0, переменная i станет равной 3, третьему
элементу массива a
будет присвоено значение 3, а число k снова будет поделено без остатка на
10 и станет равным 0. После завершения работы цикла массив a будет
содержать цифры числа k
в порядке, обратном их следованию в числе, а переменная i
будет
содержать номер элемента массива, который хранит цифру числа k с
самым высоким разрядом, это же число будет равно количеству элементов массива,
поэтому присвоим переменной n
значение i.
Теперь остаётся лишь просуммировать элементы массива. И вывести значение суммы
на экран. Она будет равна 12.
Приступим к написанию программы. Назовём нашу
программу sum.
Так как число по условию не длиннее 9 цифр и значение цифры может быть только
целым, раздел описания переменных будет содержать массив a из 9 элементов типа integer, а также переменные i,
n,
s
и k
типа integer.
Тело программы будет начинаться с команды вывода на экран поясняющего сообщения
о том, что пользователь работает с программой нахождения суммы цифр числа, и
запрос на ввод числа. Далее будет следовать команда считывания числа k. Теперь присвоим переменной i
значение ноль и запишем цикл преобразования числа k в массив цифр. Он будет
продолжаться, пока k
больше 0 и будет содержать команду увеличения i на 1, команду
присваивания i-тому элементу массива a значения остатка от деления k на 10 и команду присваивания
переменной k
её значения, поделённого без остатка на 10.
После окончания цикла присвоим переменной n значение переменной i,
а переменной s
– ноль. После чего запишем цикл for i:=1
to
n
do,
который будет содержать команду присваивания переменной s суммы её текущего значения и
значения i-того
элемента массива a.
Далее будет следовать команда вывода на экран поясняющего сообщения «Сумма цифр
числа:», а также значения переменной s.
Исходный
код программы
Запустим программу на выполнение. Введём число 34 964.
Получим ответ. Сумма цифр данного числа будет равна 26. Программа работает
правильно, следовательно, задача решена.
Пример
работы программы
Обратим внимание, что данную задачу можно решать и без
использования массива. Для этого достаточно присвоить переменной s значение 0 в начале программы, и при
выделении каждой цифры числа сразу добавлять её значение к s.
Изменим нашу программу. Уберём из неё цикл нахождения
суммы элементов массива, команду присваивания переменной s значения 0 перенесём сразу после
ввода числа, а также изменим цикл выделения цифр числа. Теперь можно убрать из
раздела описания переменных переменные i и n, а также массив a.
Изменённая
программа
Из-за того, что изменённая программа имеет в своём
составе меньшее количество команд и использует меньшее количество переменных,
то есть потребляет меньше оперативной памяти, она будет работать быстрее. Снова
запустим программу на выполнение и введём то же число, что и в первый раз, 34
964. Как и в первый раз, программа вывела ответ 26. Программа работает верно.
Пример
работы изменённой программы
Важно запомнить:
Алгоритм
нахождения суммы элементов массива состоит из трёх шагов:
1)
Выделения ячейки памяти для хранения
суммы.
2)
Присваивания ей значения 0.
3) Перебора элементов массива с вычислением для каждого суммы
его значения и значения ячейки памяти для хранения суммы и с присваиванием
результата ячейке памяти для хранения суммы.
Мы научились применять алгоритм нахождения суммы
элементов массива при решении задач.
Длина массива задается аргументом этой функции.
Эта фраза мне кажется неоднозначной. Имеется в виду, что единственный аргумент ф-ии – сам массив, и по нему определяем его длину? Или же ф-ии передаётся два параметра: сам массив и кол-во элементов, которое надо просуммировать, причём, это кол-во может быть меньше, равно, или даже больше, чем длина массива, и все эти случаи нужно обработать?
Ориентируюсь на самое простое объяснение, передаётся только сам массив.
function get_sum($arr) { // убрал значение по умолчанию (=100)
// – здесь ожидается массив, а не число
$sum = 0; // ок, инициализируем сумму
for ($i = 0; $i < count($arr); $i++) { // длина массива: count($arr)
// перебираем элементы от 0 и до длина_минус_1:
// напр. массив [0,1,2] а длина его 3. Поэтому верхнее значение
// $i < 3
$sum = $sum + $arr[$i]; // к общей сумме надо прибавить очередное значение из массива – внутри цикла, а не снаружи
}
return $sum; // есть смысл, чтобы ф-я возвращала результат,
// а что с ним делать дальше - выводить на экран или ещё что
// пусть решают там, снаружи ф-ии.
}
// теперь надо как-то использовать эту функцию:
echo "Сумма массива [1,2,3] = ";
echo get_sum( array(1,2,3) );
echo PHP_EOL; // символ новой строки
P.s. и если это не учебное задание, в PHP есть встроенная функция, которая суммирует все элементы данного массива быстрее, array_sum()
:
echo "Сумма [1,2,3] = " . array_sum([1,2,3]) . PHP_EOL;
В этом посте мы обсудим, как найти сумму элементов в массиве C++.
1. Использование STL accumulate()
функция
Стандартным решением является использование std::accumulate
предоставляется стандартной библиотекой. Он определен в заголовочном файле numeric
. Операция по умолчанию заключается в добавлении элементов до но, чтобы сделать контекст более понятным. Мы также можем передать функцию в необязательном четвертом параметре, которая выполняет операцию сложения двух чисел и возвращает результат.
#include <iostream> #include <numeric> int main() { int arr[] = { 5, 3, 7, 9, 2 }; int sum = std::accumulate(std::begin(arr), std::end(arr), 0, std::plus<int>()); std::cout << sum; return 0; } |
Скачать Выполнить код
2. Использование Boost accumulate()
функция
Еще одна хорошая альтернатива — использовать boost accumulate()
функция, которая определена в заголовочном файле boost/range/numeric.hpp
.
#include <iostream> #include <boost/range/numeric.hpp> int main() { int arr[] = { 5, 3, 7, 9, 2 }; int sum = boost::accumulate(arr, 0); std::cout << sum; return 0; } |
Скачать код
3. Использование STL for_each()
функция
Мы также можем написать логику суммирования в предикате для std::for_each
стандартный алгоритм. Это показано ниже с использованием лямбда-выражений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <algorithm> int main() { int arr[] = { 5, 3, 7, 9, 2 }; int sum = 0; std::for_each(std::begin(arr), std::end(arr), [&] (int &i) { sum += i; }); std::cout << sum; return 0; } |
Скачать Выполнить код
4. Цикл for/цикл for на основе диапазона
Мы также можем написать собственную процедуру для этой простой задачи. Идея состоит в том, чтобы пройти массив, используя простой цикл for или цикл for на основе диапазона, и накопить сумму каждого элемента в переменной.
⮚ Для цикла
#include <iostream> int main() { int arr[] = { 5, 3, 7, 9, 2}; int n = sizeof(arr) / sizeof(int); int sum = 0; for (int i = 0; i < n; i++) { sum += arr[i]; } std::cout << sum; return 0; } |
Скачать Выполнить код
⮚ Цикл for на основе диапазона
#include <iostream> int main() { int arr[] = { 5, 3, 7, 9, 2 }; int sum = 0; for (int i: arr) { sum += i; } std::cout << sum; return 0; } |
Скачать Выполнить код
5. Использование valarray sum()
функция
Если valarray
используется вместо стандартного массива, операция суммирования может быть применена непосредственно к valarray
объект, вызвав его функцию-член sum()
.
#include <iostream> #include <valarray> int main() { int arr[] = { 5, 3, 7, 9, 2 }; int n = sizeof(arr) / sizeof(int); std::valarray<int> valarray (arr, n); std::cout << valarray.sum(); return 0; } |
Скачать Выполнить код
6. C++17 — Свернуть выражения
С C++17 мы можем использовать складывать выражения, как показано ниже:
#include <iostream> template<typename ...T> auto sum(T ...args) { return (args + ...); } int main() { std::cout << sum( 5, 3, 7, 9, 2 ); return 0; } |
Выполнить код
Это все, что касается нахождения суммы элементов в массиве C++.
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Основные операции обработки массивов:
- вычисление суммы элементов массива;
- поиск максимального или минимального значения в массиве;
- поиск максимального или минимального среди всех элементов массива, удовлетворяющих некоторому условию;
- обмен значениями между элементами;
- реверс — перестановка элементов массива местами в обратном порядке (последний становится первым, первый — последним и т. д.
Рассмотрим подробнее каждую операцию.
Вычислим сумму элементов массива из предыдущей теории — усовершенствуем программу. Цикл, с помощью которого выводился массив, заменим на цикл, который будет прибавлять к переменной (s) каждый последующий элемент массива.
Ответ: (55).
Задачи на поиск в массиве
Поиск максимального значения.
Идея поиска максимального значения заключается в следующем: каждый элемент массива поочерёдно сравнивается со следующим. Если он больше, то некоторой переменной max будет присвоено значение этого элемента. Напишем программу.
Ответ: (100).
Найдём наибольшее число, удовлетворяющее некоторому условию.
Задача: найти максимальное чётное число. Для этого добавим в условие проверку на чётность при помощи операции mod.
Ответ: (8).
Обмен значениями между элементами
Допустим, нам нужно удалить некоторый элемент массива.
Удалим элемент с индексом (6). Для этого добавляем ещё одну переменную, которая будет обозначать индекс удаляемого элемента. Далее массив будем выводить по частям. До удаляемого элемента — без изменений, пропустим удаляемый элемент и выведем остаток массива.