Алгоритмы накопления суммы и произведения
Данные алгоритмы применяются, когда требуется сложить или перемножить выбранные данные. В общем виде эти широко применяемые алгоритмы можно описать так: 1. для подсчета каждой суммы или произведения описать по одной переменной того же типа, что суммируемые или перемножаемые данные; 2. до цикла переменной-сумме присвоить начальное значение 0, а произведению -- значение 1; 3. в теле цикла, если очередной элемент данных t отвечает условию суммирования или перемножения, сумма накапливается оператором вида s:=s+t;, а произведение -- оператором вида p:=p*t; Очевидно, почему начальное значение произведения -- 1, а не 0. После оператора p:=0; оператор p:=p*t;, расположенный в теле цикла, будет возвращать только нули. Рассмотрим типовую задачу. Для функции , найти арифметическое среднее ее положительных значений и произведение ненулевых значений. Для поиска арифметического среднего необходимо сначала найти сумму s и количество k положительных значений функции. Составим следующую программу: var x,f,s,p:real; k:integer; begin s:=0; k:=0; p:=1; x:=-5; while x<=5+1e-6 do begin if x<0 then f:=sqr(ln(abs(x))) else if x>0 then f:=sin(sqr(x)) else f:=0; if f>0 then begin s:=s+f; k:=k+1; end; if f<>0 then p:=p*f; x:=x+0.5; end; s:=s/k; {теперь в s - искомое среднее} writeln ('Среднее положительных =',s:10:6); writeln ('Произведение ненулевых=',p:10:6); reset (input); readln; end. В следующей задаче также применяется алгоритм накопления суммы. Требуется написать программу, имитирующую работу кассового аппарата: пользователь в цикле вводит цену очередного товара или 0 для завершения ввода, программа суммирует цены. По завершении цикла ввода программа начисляет скидку с общей стоимости товара по правилам: скидки нет, если общая стоимость покупки -- менее 10000 руб.; скидка равна 5%, если общая стоимость -- от 10000 до 20000 руб.; скидка равна 7%, если общая стоимость -- свыше 20000 руб. После начисления скидки выводится окончательная стоимость покупки.
Обозначив общую стоимость покупки s, а цену очередного товара -- t, напишем следующую программу: var s,t:real; begin writeln; s:=0; {начальное значение суммы!} repeat writeln ('Введите стоимость товара или ' '0 для завершения ввода:'); {$I-}read(t);{$I+} if (IoResult<>0) or (t<0) then begin writeln ('Ошибка! Повторите ввод'); continue; end; if t=0 then break; {Округляем t до 2 знаков после запятой – на случай, если есть копейки} t:=round (t*100) / 100; s:=s+t; {накопление суммы} until false; {Начисление скидки и вывод ответа} writeln ('Стоимость без скидки:',s:8:2); if s>20000 then s:=s-s*0.07 else if s>10000 then s:=s-s*0.05; writeln ('Стоимость со скидкой:',s:8:2); writeln ('Спасибо за покупку!'); reset (input); readln; end. Тип данных real выбран для s и t не случайно -- выбор integer ограничил бы диапазон обрабатываемых значений и не позволил в удобном виде ввести копейки. Проверки корректности ввода, делаемые программой, знакомы по предыдущим примерам и поэтому не закомментированы.
Читайте также: X. Алгоритмы мотивации пациента к приобретению стоматологических услуг. Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|