
- •5. Структура простой программы на Паскале
- •7. Разветвляющийся вычислительный процесс и условный оператор
- •7.1. Логические выражения
- •7.2. Операции отношения
- •7.3. Логические операции
- •7.4. Короткий условный оператор
- •7.5. Полный условный оператор
- •7.6. Составной условный оператор
- •7.7. Вложенные условные операторы
- •7.8. Оператор выбора
- •7.9. Примеры программ с условным оператором
- •9. Оператор цикла. Циклы с предусловием и постусловием
- •10. Цикл со счетчиком и досрочное завершение циклов
- •11. Типовые алгоритмы табулирования функций, вычисления количества, суммы и произведения
- •11.1. Алгоритм табулирования
- •11.2. Алгоритм организации счетчика
- •11.3. Алгоритмы накопления суммы и произведения
- •12. Типовые алгоритмы поиска максимума и минимума
- •13. Решение учебных задач на циклы
- •14. Одномерные массивы. Описание, ввод, вывод и обработка массивов на Паскале
- •15. Решение типовых задач на массивы
- •Приложение 6. Правила хорошего кода
- •Приложение 5. Расширенные коды клавиатуры
- •Приложение 1. Таблицы ascii-кодов символов для операционных систем dos и Windows
- •18. Подпрограммы
- •18.1. Процедуры
- •18.2. Функции
- •18.3. Массивы в качестве параметров подпрограммы
- •18.4. Открытые массивы
11.2. Алгоритм организации счетчика
Этот алгоритм применяется, когда требуется подсчитать количество элементов данных, отвечающих какому-либо условию или условиям. В общем виде алгоритм описывается следующим образом:
1. в разделе var описать переменную целочисленного типа, с помощью которой будет вестись подсчет;
2. до цикла присвоить ей начальное значение 0;
3. в теле цикла, если очередной элемент данных отвечает условию подсчета, увеличить эту переменную на 1 оператором вида k:=k+1;.
Необходимость присваивания начальных значений на шаге 2 этого и последующих алгоритмов связана с тем, что после описания в разделе var значение переменной еще не определено. "Пока мы не начали подсчитывать количество, оно равно нулю" -- этот очевидный для человека факт не очевиден для компьютера! Поэтому любой переменной, которая может изменяться в теле цикла, необходимо присвоить до цикла начальное значение, что и делает оператор вида k:=0;.
Рассматриваемый нами алгоритм очень часто встречается в самых различных задачах, поэтому для "быстрой" записи операции по увеличению счетчика (она называется инкремент) или его уменьшению (декремент) существуют специальные стандартные процедуры:
Inc(X,N); -- увеличивает значение переменной.
Здесь параметр X -- переменная порядкового типа, а N -- переменная или выражение целочисленного типа. Значение X увеличивается на 1, если параметр N не определен, или на N, если параметр N определен, то есть Inc(X); соответствует X:=X+1;, а Inc(X,N); соответствует X:=X+N;.
Dec(X,N); -- уменьшает значение переменной.
Параметр X -- также переменная порядкового типа, N -- целочисленное значение или выражение. Значение X уменьшается на 1, если параметр N не определен, или на N, если параметр N определен, то есть Dec(X); соответствует X:=X-1;, а Dec(X,N); соответствует X:=X-N;.
С помощью Inc и Dec генерируется более оптимизированный код, особенно полезный в сложных циклах. Возможно, мы будем использовать их не во всех примерах, но вам советую о них не забывать.
В качестве примера реализации алгоритма рассмотрим следующую задачу.
Последовательность
z(i)
задана соотношениями
,
i=1,2,...,100.
Найти количество элементов
последовательности, больших
значения 0.5.
Обозначив искомое количество за k, составим программу:
var z:real;
i,k:integer;
begin
k:=0;
for i:=1 to 100 do begin
if i mod 2 = 0 then z:=sqr(i)*cos(i)
else z:=sin(i/2);
if z>0.5 then inc(k);
end;
writeln ('Количество=',k);
end.
Так как шаг по переменной i равен 1, в программе использован цикл for, для проверки того, является ли значение i четным, использована операция mod.
В следующей задаче займемся обработкой данных по мере их ввода пользователем.
Известны оценки за экзамен по информатике для группы из n студентов, 2≤n≤25. Оценить количественную и качественную успеваемость группы по формулам:
,
,
где k1
-- количество "троек", "четверок"
и "пятерок", k2
-- количество только "четверок" и
"пятерок".
Для ввода текущей оценки используем целочисленную переменную a, в качестве счетчика цикла for введем переменную i ("номер студента"), остальные величины описаны в условии задачи. При вводе значения n и очередного значения a для простоты не будем контролировать корректность вводимых данных.
var a,i,n,k1,k2:integer;
ykol,ykach:real;
begin
writeln;
writeln ('Введите количество студентов:');
read (n);
k1:=0;
k2:=0;
for i:=1 to n do begin
write ('Введите оценку ',i,' студента:');
read (a);
if a>2 then begin
inc(k1);
if a>3 then inc(k2);
end;
end;
ykol:=k1/n*100;
ykach:=k2/n*100;
writeln
('Количественная успеваемость=',ykol:6:2);
writeln
('Качественная успеваемость =',ykach:6:2);
reset (input); readln;
end.