Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебники по паскалю / паскаль уч.doc
Скачиваний:
85
Добавлен:
25.03.2015
Размер:
659.97 Кб
Скачать

11.3. Алгоритмы накопления суммы и произведения

 

Данные алгоритмы применяются, когда требуется сложить или перемножить выбранные данные. В общем виде эти широко применяемые алгоритмы можно описать так:

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 ограничил бы диапазон обрабатываемых значений и не позволил в удобном виде ввести копейки. Проверки корректности ввода, делаемые программой, знакомы по предыдущим примерам и поэтому не закомментированы.