3.3.3 Вычислительные циклические алгоритмы Алгоритм вычисления суммы чисел описывает последовательное накопление слагаемых в одной переменной, содержащей значение суммы. Пусть имя переменной суммы – S. Алгоритм следует начинать с задания начального значения переменной суммы. начало S 0 S=0 α Совет программиста Не стоит полагаться на способность транслятора обнулять переменные — в более сложных программах это может привести к ошибке. Далее многократно повторяются действия: s = s + x, которые следует понимать следующим образом: к текущему значению переменной суммы прибавить значение очередного слагаемого; результат присвоить той же переменной суммы. Действия повторяются от значения первого слагаемого х1 до конечного слагаемого хn, если количество слагаемых n. Если слагаемые изменяются от значения х1 до значения хn с постоянным шагом, можно использовать цикл с параметром, в котором эти изменения будет производить компьютер. Тогда алгоритм вычисления суммы будет выглядеть так: S0+х К переменной прибавляется слагаемое x1. 1 суммы первое x = x1, хn S0+х +х К полученному прибавляется слагаемое х2. S0+х +х +…х Действия повторяются до xn, каждое следующее слагаемое прибавляется к переменной суммы. 1 … 1 2 2 n α результату второе s=s+x Вывод s конец Таким образом, на последнем шаге цикла в переменной S накапливается итоговая сумма, которая может быть выведена на экран монитора или использована в дальнейших вычислениях. Задача. Легенда о Гауссе I этап. Постановка задачи Описание задачи Существует легенда об известном немецком ученом Карле Фридрихе Гауссе. Школьный учитель математики предложил своим ученикам сосчитать сумму чисел от 1 до 100, предполагая, что дети будут долго заниматься вычислениями. Однако юный Гаусс заметил, что попарные суммы чисел с противоположных концов последовательности одинаковы: 1+100=101, 2+99=101 и т. д., и довольно быстро получил результат. А вы знаете, какой? Этот результат можно использовать для тестирования программы, находящей сумму произвольной последовательности от a до b. Цель Вычислить значение суммы целых чисел в диапазоне от a до b. Формализация Уточняющий вопрос Ответ Что моделируется? Вычисление суммы Каково значение первого числа – первого слагаемого суммы? Задается с клавиатуры Каково значение последнего числа – последнего слагаемого суммы? Задается с клавиатуры Какова закономерность изменения чисел от начального значения до конечного? Следующее число больше предыдущего на 1 II этап. Разработка модели 1. Информационная модель Параметры реального объекта числовая последовательнос ть Объект моделир ования название значение первого слагаемого значение последнего слагаемого текущее слагаемое сумма переменной в среде программирования значение имя тип задается с клавиатуры a целое число задается с клавиатуры b целое число результат расчета x целое число результат расчета s целое число 2. Моделирование последовательности действий 2.1 Алгоритм вычисления суммы 2.2 Программа BASIC INPUT “введите первое и последнее число”; a, b s=0 FOR x=a TO b s=s+x NEXT x PRINT “сумма чисел от “; a; “ до “; b; “=”; s Pascal var x, s, a, b: integer; begin writeln (‘введите первое и последнее число’); readln (a, b); s:=0; for x:=a to b do s:=s+x; writeln(‘сумма чисел от ’, a, ‘до’, b, ‘=’, s); end. III этап. Компьютерный эксперимент 1. Отладка и тестирование компьютерной модели При a=1, b=100 Гаусс получил результат 5050. 2. Эксперимент 1 Выполните вычисление суммы чисел в диапазоне от a до b при различных значениях a, b. Результаты эксперимента оформите в тетради следующим образом: № значение a значение b значение s 1 2 3 4 5 Задача. «За первый гвоздь – полушка…» Рассмотрим задачу из первой в России учебной энциклопедии по математике Леонтия Филипповича Магницкого, составленной им в 1703 г. «Один человек продал коня за 156 рублей. Покупатель же передумал и возвратил его продавцу, говоря: «Нет мне расчета покупать за эту цену коня, который таких денег не стоит». Тогда продавец предложил иные условия: «Если тебе эта цена кажется слишком большой, заплати только за гвозди в подковах, а коня возьми себе в дар. Гвоздей в каждой подкове по шесть, и за первый гвоздь дай мне полушку (четверть копейки), за второй – две полушки, за третий копейку и т. д.». Покупатель, видя столь малую цену и желая получить коня в дар, согласился на эту цену, думая, что за гвозди придется заплатить не более 10 рублей. Требуется узнать на сколько проторговался покупатель». Цель Определить на сколько больше заплатил покупатель в результате торга. Формализация задачи Уточняющий вопрос Ответ Что моделируется? Вычисление суммы Сколько слагаемых в сумме? 24 (4 подковы по 6 гвоздей) Какое значение первого слагаемого? 1 4 Какова закономерность изменения чисел в последовательности? Каждое следующее слагаемое в 2 раза больше предыдущего II этап. Разработка модели 1. Информационная модель Параметры числовая последовательность Объект моделирования переменной в среде программирования реального объекта название значение первого слагаемого текущее слагаемое количество слагаемых сумма значение 1 4 результат расчета х=х*2 имя тип x вещественное число x вещественное число 24 n целое число результат расчета s вещественное число Решение этой задачи отличается от предыдущей тем, что текущее слагаемое не может быть параметром цикла. Параметром цикла можно сделать номер текущего слагаемого. Изменение слагаемого должен задать программист: каждое следующее значение переменной Х в два раза больше предыдущего. Это пример рекуррентной формулы. Рекуррентными называются формулы, выражающие элемент последовательности через один или несколько предыдущих элементов. Примерами рекуррентных последовательностей, известных из школьного курса математики, могут быть: арифметическая прогрессия 2, 4, 6, 8, 10…; 1, 4, 7, 10, 13…; описываемая рекуррентной формулой an+1=an+d, геометрическая прогрессия 1, 2, 4, 8, 16, 32…; 1, 3, 9, 27, 81, 243…; описываемая рекуррентной формулой bn+1=bn*q. 2. Моделирование последовательности действий 2.1 Алгоритм начало s=0 x=1/4 n=1,24,1 s=s+x x=x*2 Вывод s-156 конец 2.2 Программа BASIC s=0 x=1/4 FOR n=1 TO 24 s=s+x x=x*2 NEXT n PRINT “Покупатель проторговался на ”; s-156; “ рублей” Pascal var n: integer; s, x: real; begin s:=0; x:=1/4; for n:=1 to 24 do begin s:=s+x; x:=x*2; end; writeln(‘Покупатель проторговался на’, (S-156):10:2, ' рублей'); end. III этап. Компьютерный эксперимент 1. Отладка и тестирование компьютерной модели Если гвоздей было бы всего два, тогда N=2, а S=0,75, т.е. разница между начальной ценой и ценой при N=2 составляет –155,25. 2. Эксперимент 1 Определите результат при N=24. 3. Эксперимент 2 Изменяя конечное значение N, определите, при каком количестве гвоздей на каждой подкове покупатель остался бы в выигрыше, если бы за первый гвоздь пришлось заплатить 1 копейку. Задания на освоение инструментария программирования 1. Составьте программу вычисления: a. S 12 2 2 3 2 ... 10 2 2 3 99 b. S 1 ... 3 4 100 1 1 1 1 1 c. S 1 2 3 4 5 6 1 1 1 1 d. S ... 1 2 3 25 e. S 2 2 2 2 2 f. S 1 2 3 ... 100 1 g. S 1 1 1 2 1 3 4 1 1 6 1 1 2 1 2 3 1 2 3 4 h. S 1 1 2 1 2 3 1 2 3 4 2. С клавиатуры задано натуральное число N. Составьте программу вычисления: 1 1 1 a. S ... 2 3 N 1 1 1 b. P (1 )(1 )...(1 ) 1 2 N 3 5 7 N N N N9 c. S N 3 5 7 9 2 3 N d. S 1 3 3 3 ... 3 1 3 5 2N 1 e. S 1 2 3 ... 2 2 2 2N 3. Составьте программу вычисления квадрата натурального числа N, не используя операцию возведения в степень, а учитывая закономерность: 12=1 22=1+3 32=1+3+5 42=1+3+5+7 … 4. Составьте программу возведения числа N в третью степень, учитывая закономерность: 13=3 23=3+5 33=7+9+11 43=13+15+17+19 53=21+23+25+27+29 5 1 1 1 . 1* 2 2 * 3 3 * 4 Учитывая закономерность, увеличьте количество слагаемых. Убедитесь, что чем больше слагаемых в этой сумме, тем ближе она к значению 1. 1 1 1 6. Составьте программу вычисления суммы числового ряда s . 1* 3 3 * 5 5 * 7 Учитывая закономерность, увеличьте количество слагаемых. Определите экспериментально, к какому значению стремится эта сумма при увеличении числа слагаемых. 1 1 1 7. Составьте программу вычисления суммы числового ряда s 1 . Используйте 2 4 8 рекуррентное соотношение. Учитывая закономерность, увеличьте количество слагаемых. Определите экспериментально, к какому значению стремится эта сумма при увеличении числа слагаемых. 1 1 1 8. Составьте программу вычисления суммы числового ряда s 1 . Используйте 2 4 8 рекуррентное соотношение. Учитывая закономерность, увеличьте количество слагаемых. Убедитесь, что чем больше слагаемых в этой сумме, тем ближе она к значению 2/3. 9. Дано пятизначное число N. Определите сумму его цифр. 10. Найти произведение цифр четырехзначного числа. 11. Найти сумму цифр даты рождения человека, при условии, что день, месяц и год рождения вводятся как три числа: два двузначных и одно четырехзначное. 12. Произведение 1* 2 * 3 * ... * N называется факториалом числа N. Определите максимальное целое число N, для которого в данной среде программирования вычисление факториала выполняется корректно. Попробуйте сделать вывод, как ограничение на корректное вычисление факториала зависит от типа результирующей переменной 5. Составьте программу вычисления суммы числового ряда s Задачи по моделированию 1. В математическом папирусе Ахмеса — древнеегипетском учебном руководстве по арифметике и геометрии периода Среднего царства (1650 г. до н. э.) — есть такая задача: «У семи человек есть по 7 кошек. Каждая кошка съедает по 7 мышей. Каждая мышь съедает по 7 колосьев. Из каждого колоса может вырасти по 7 мер зерна. Как велики числа этого ряда и какова их сумма?» Составьте программу для решения этой задачи. 2. Верно ли, что сумма первых N чисел последовательности Фибоначчи (1, 1, 2, 3, 5, 8, 13, 21, …, где каждое следующее число, начиная со второго, является суммой двух предыдущих) есть четное число? 3. «Аквариум» (УМК под редакцией профессора Н.В. Макаровой «Задачник по моделированию»). Мальчик решил почистить аквариум. Начал с переселения рыб в банку. Семейство рыб, проживающих в аквариуме, составляло 40 штук. Первую рыбку он поймал быстро, затратил 5 с и еще 2 с потратил на перекладывание в банку. Но чем меньше становилось в воде рыбок, тем труднее их поймать. На то, чтобы поймать каждую последующую, он затрачивал времени больше на 5%, чем на предыдущую. Сколько времени он потратит на переселение рыб? 4. Подберите параметры компьютерной модели так, чтобы ответить на вопросы. Сколько рыбок он пересадит в течение минуты? Если быстро устающий мальчик будет тратить на ловлю каждой следующей рыбки на 10% больше времени, то сколько времени он потратит на переселение рыб? Вырастет ли в этом случае время переселения в два раза? «Награда» (УМК под редакцией профессора Н.В. Макаровой «Задачник по моделированию»). Шахматы были изобретены в Индии. Индусский царь Шерам решил наградить изобретателя шахмат, вызвал его к себе и сказал, что исполнит любую его просьбу. Изобретатель удивил царя беспримерной скромностью просьбы: – Прикажи выдать мне за первую клетку шахматной доски 1 пшеничное зерно, за вторую – 2, за каждую последующую в 2 раза больше, чем за предыдущую. Сколько килограммов зерен было выдано изобретателю, если 1 зерно весит 0,05 г? Если бы на шахматной доске было всего 4 ряда по 4 клетки, смог бы изобретатель унести наградное зерно? А если бы – 5 рядов по 5 клеток?