Сегодня мы начнём рассматривать алгоритмы обработки информации в массивах. Достаточно часто встречается ситуация, при которой нам необходимо сложить элементы массива, рассмотрим задачу. На складе яблоки хранятся в мешках, известно количество мешков и количество яблок в каждом мешке. Директор склада попросил нас написать программу, которая вычисляет количество яблок на складе.
Обозначим через 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) Перебора элементов массива с вычислением для каждого суммы его значения и значения ячейки памяти для хранения суммы и с присваиванием результата ячейке памяти для хранения суммы.
Мы научились применять алгоритм нахождения суммы элементов массива при решении задач.