Читайте также:
|
|
Данные алгоритмы применяются, когда требуется сложить или перемножить выбранные данные. В общем виде эти широко применяемые алгоритмы можно описать так:
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 ограничил бы диапазон обрабатываемых значений и не позволил в удобном виде ввести копейки. Проверки корректности ввода, делаемые программой, знакомы по предыдущим примерам и поэтому не закомментированы.
Дата добавления: 2015-11-16; просмотров: 89 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Алгоритм организации счетчика | | | Типовые алгоритмы поиска максимума и минимума |