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

Var a:array[1..N,1..N] of integer;

I, j, count: integer;

sred: real;

begin

for i:=1 to N do { ввод матрицы }

for j:=1 to N do readln(A[i,j]);

sred := 0; { находим сумму главной диагонали }

for i:=1 to N do

sred := sred + A[i,i];

sred := sred / N; { находим среднее }

count := 0; { считаем нужные элементы }

for i:=1 to N do

for j:=1 to N do

if (A[i,j] > 0) and (A[i,j] > sred) then

count := count + 1;

writeln(count);

end.

Заметим, что можно немного улучшить программу. В условном операторе в последнем двойном цикле можно заменить сложное условие простым, если вместо 0 и sred использовать максимальное из этих значений. Перед двойным циклом нужно добавить оператор

if sred < 0 then sred := 0;

а условный оператор изменить так:

if A[i,j] > sred then

count := count + 1;

Во-вторых, можно немного более грамотно обработать условие A[i,j] > sred. Дело в том, что при делении в операторе

sred := sred / N; { находим среднее }

может получиться вещественное число (с дробной частью). Вещественные числа (за редким исключением4) хранятся в памяти компьютера неточно, потому что в двоичном коде содержат (теоретически) бесконечное число разрядов. Поэтому лучше НЕ делить полученную сумму sred на N, а для проверки вместо условия A[i,j] > sred/N использовать равносильное ему A[i,j]*N > sred. Плюс в том, что в последнем случае все операции выполняются с целыми числами и ошибок из-за неточного представления дробных чисел в памяти гарантированно не будет. Однако, есть и минус: вместо одного деления (на всю программу) придется выполнять N2 умножений (для каждого элемента матрицы). Вот еще одна версия программы:

const N=5;

Var a:array[1..N,1..N] of integer;

I, j, count: integer;

sred: real;

begin

for i:=1 to N do { ввод матрицы }

for j:=1 to N do readln(A[i,j]);

sred := 0; { находим сумму главной диагонали }

for i:=1 to N do

sred := sred + A[i,i];

count := 0; { считаем нужные элементы }

if sred < 0 then sred := 0;

for i:=1 to N do

for j:=1 to N do

if A[i,j]*N > sred then

count := count + 1;

writeln(count);

end.

  1. Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за итоговый тест по информатике. Опишите на русском языке или на одном из языков программирования алгоритм, который позволяет найти и вывести количество учащихся, чья оценка за тест выше средней оценки в классе. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.

Паскаль

Естественный язык

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]);

...

end.

Объявляем массив A из 30 элементов. Объявляем целочисленные переменные i, j.

Объявляем действительную переменную s.

В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й.

...

В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Borland Pascal 7.0) или в виде блок-схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).

Эта задача в целом напоминает упрощенный вариант предыдущей, поэтому можно сразу привести решение. Единственная тонкость – можно исключить операции с вещественными числами, которые (теоретически) могут привести к ошибкам. Подробно этот прием описан в решении предыдущей задачи.

Решение на естественном языке. Записываем в переменную 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]