Задание:
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за итоговый тест по информатике. Опишите на русском языке или на одном из языков программирования алгоритм, который позволяет найти и вывести количество учащихся, чья оценка за тест выше средней оценки в классе. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
const N=30; |
Си |
#include<stdio.h> |
Естественный язык |
Объявляем массив A из 30 элементов. Объяв-ляем целочисленные переменные i, j. Объявляем действительную переменную s. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. ... |
Решение:
Эта задача в целом напоминает упрощенный вариант этой задачи, поэтому можно сразу привести решение. Единственная тонкость – можно исключить операции с вещественными числами, которые (теоретически) могут привести к ошибкам. Подробно этот прием описан в решении предыдущей задачи.
Решение на естественном языке. Записываем в переменную s начальное значение 0. В цикле добавляем все значения элементов массива, от 1-ого до 30-ого, к значению переменной s. После завершения цикла делим значение s на 30, чтобы найти среднее значение. Далее записываем в переменную j начальное значение 0. В цикле рассматриваем все элементы массива, от 1-ого до 30-ого, сравниваем значение текущего элемента со значением переменной s. Если значение текущего элемента больше значения s, увеличиваем счетчик j на 1. После завершения цикла выводим значение переменной j.
В приведенном выше решении на естественном языке дан «чистый» алгоритм. При работе на реальном компьютере нужно заботиться о точности вычислений, поэтому в программе на Паскале вместо проверки условия a[i] > среднего мы используем равносильное ему a[i]*N > суммы элементов. При этом переменную s можно было бы сделать и целой (но она вещественная по условию задачи, это нельзя менять!).
const N=30;
var a: array [1..N] of integer;
i, j: integer;
s: real;
begin
for i:=1 to N do readln(a[i]);
s:= 0;
for i:=1 to N do s:= s + a[i];
j:= 0;
for i:=1 to N do
if a[i]*N > s then j:= j + 1;
writeln(j)
end.