ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.07.2024
Просмотров: 150
Скачиваний: 0
∙В-четвертых, накопление суммы элементов массива, необходимой для расчета среднего ариф- метического значения организуем совместно в цикле для ввода элементов массива, применяя операторные скобки, и не забыв занулить значение переменной s, отвечающей за накопление суммы до начала цикла.
∙В-пятых, до начала цикла по перебору элементов матрицы для поиска количества элементов, не превосходящих среднего арифметического значения необходимо определить начальные значе- ния переменной k – счетчика количества таких элементов, приняв его равным нулю.
С учетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:
program PR3 (input, output); uses crt;
const t=100;
type matr= array[1..t,1..t] of real; var x: matr;
s: real;
i,j,k,n,m: integer; begin
clrscr;
writeln(‘Введи число строк матрицы, n=‘); readln(n); writeln(‘Введи число столбцов матрицы, m=‘); readln(m); writeln(‘Введи массив по строкам’);
S:=0;
for i:=1 to n do begin for j:=1 to m do begin
write (‘х[‘,i,’,’,j,’]= ‘);readln(х[i,j]); S:=S+x[I,j]; end; writeln; end; S:= S/(n*m);
k:=0;
for i:=1 to n do for j:=1 to m do
if S>=x[i,j] then
k:=k+1;
writeln(‘В массиве ’,k,’элементов не превосходят среднего арифме- тического’);
repeat until keypressed; end.
{Заголовок программы} {Подключение модуля} {Описание константы} {Описание типа массив}
{Описание переменных}
{Начало программы} {Процедура очистки экрана}
{Ввод размерности массива}
{Вывод пояснений к программе} {Установка начальных значений} {Заголовок внешнего цикла} {Заголовок внутреннего цикла} {Ввод элементов массива}
{Накопление суммы элементов массива} {Вычисление среднего арифметического}
{Установка начальных значений} {Заголовок внешнего цикла} {Заголовок внутреннего цикла} {Проверка элемента на условие} {Переопределение счетчика}
{Вывод результата на экран}
{Процедура «задержки» экрана } {Конец программы}
Пример 8. Дана матрица n×n. Найти число нулевых элементов в главной диагонали этой матрицы.
Решение.
Для решения задачи образуем из элементов матрицы двумерный массив. Решение будем проводить по следующей схеме:
∙Необходимо ввести реальную размерность массива;
∙Необходимо поэлементно ввести элементы матрицы (массива);
∙Зануляем счетчик нулевых элементов главной диагонали матрицы;
∙Перебираем поэлементно главную диагональ матрицы, проверяя каждый ее элемент на равенство нулю, если элемент главной диагонали матрицы равен нулю, тогда значение не- которого счетчика увеличиваем на единицу, если же элемент не равен нулю, тогда пере- ходим к анализу следующего элемента главной диагонали;
-42 -
Замечание. В данной задаче для перебора элементов главной диагонали матрицы нет необходимости использовать вложенные циклы по двум параметрам i и j, как это реализуется для стандартной обработки двумерного массива. Так как элементы главной диагонали имеют совпадающие индексы, можно обойтись одним единственным оператором цикла по одному параметру, поскольку доступ к элементам массива можно получить, указав его индексы. В этом случае конструкция для перебора элементов главной диагонали матрицы и проверки равенства его значения нулю будет выглядеть следующим образом:
for i:=1 to n do
if x[i,i] = 0 then k:=k+1;
Использование стандартной конструкции перебора элементов двумерного массива потребует введения дополнительной проверки условия на принадлежность элемента главной диагонали, и будет иметь вид:
for i:=1 to n do for j:=1 to n do
if (i= j) and (x[i,j] = 0) then k:=k+1;
Однако, хотя такая конструкция и возможна, она оказывается крайне не эффективной, поскольку в этом случае перебираются абсолютно все элементы матрицы, даже заведомо не принадлежащие главной диагонали. При этом большая часть проверок выполняется «в холостую», приводя к неоправданным затратам времени работы программы.
∙Выводим результат на экран и завершаем работу программы.
Блок схема для решения задачи выглядит следующим образом:
При реализации этой схемы на алгоритмическом языке Паскаль учтем следующие обстоятельства:
∙ Во-первых, все переменные должны быть описаны. В разделе описаний констант опишем кон- станту t, имеющую смысл размерности нашего массива (числа элементов последовательности), приняв ее значение равным 100. Поскольку регулярный тип массив не относится к стандартным типам данных, в разделе описания типов вводим тип с именем matr, определив его как двумер- ный массив размерности t на t элементов. Затем в разделе описаний переменных введем пере- менную x – типа matr в качестве массива компонент исходной матрицы, i и j – целого типа, в
- 43 -
качестве вспомогательных переменных, параметров цикла обеспечивающих возможность поэле- ментного перебора элементов матрицы, а так же переменную k – целого типа в качестве счетчика количества нулевых элементов главной диагонали. Перемененную n – целого типа, имеющую смысл реального значения размерности массива (числа строк и столбцов матрицы).
ПРИМЕЧАНИЯ.
Описать нестандартную переменную типа массив можно и не вводя раздел описания типов и не указывая тип matr. Синтаксис языка Паскаль допускает описание переменной путем указания не имени ее типа, а с указанием описания типа. Например:
var x : array[1..t,1..t] of real;
∙Во-вторых, поскольку число шагов, которые необходимо будет сделать для перебора всех эле- ментов массива и в процессе ввода и в процессе его обработки заранее известно, воспользуемся оператором цикла с параметром. Для ввода элементов массива используем переменную i в каче- стве параметра внешнего цикла (обеспечивая перебор элементов матрицы по строкам) и пере- менную j в качестве параметра внутреннего цикла (обеспечивая перебор элементов матрицы по столбцам). Однако еще раз заметим, что конечным значением параметров цикла будет не значе- ние t (вспомогательное значение, используемое при описании массива), а значение n (реальная размерность массива, где n – число строк и столбцов в матрице);
∙В-третьих, при вводе элементов массива организуем «диалог» с помощью сочетания операто- ров вывода и ввода, применяя операторные скобки, поскольку в операторе цикла с параметром может быть использован только один оператор языка Паскаль.
∙В-четвертых, воспользуемся рассмотренной выше конструкцией для перебора элементов глав- ной диагонали матрицы и проверки равенства их значений нулю;
∙В-пятых, до начала цикла по перебору элементов главной диагонали матрицы для поиска коли- чества нулевых элементов, необходимо определить начальные значения переменной k – счетчика количества таких элементов, приняв его равным нулю.
С учетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:
program PR4 (input, output); uses crt;
const t=100;
type matr= array[1..t,1..t] of real; var x: matr;
i,j,k,n: integer; begin
clrscr;
writeln(‘Введи размерность матрицы, n=‘); readln(n); writeln(‘Введи массив по строкам’);
for i:=1 to n do begin for j:=1 to n do begin
write (‘х[‘,i,’,’,j,’]= ‘);readln(х[i,j]); end; writeln; end; k:=0;
for i:=1 to n do if x[i,i] = 0 then
k:=k+1;
writeln(‘В главной диагонали матрицы содержится ’,k,’ нулевых эле- ментов’);
repeat until keypressed; end.
- 44 -
{Заголовок программы} {Подключение модуля} {Описание константы} {Описание типа массив}
{Описание переменных}
{Начало программы} {Процедура очистки экрана}
{Ввод размерности массива} {Вывод пояснений к программе} {Заголовок внешнего цикла} {Заголовок внутреннего цикла} {Ввод элементов массива} {Установка начальных значений} {Заголовок цикла} {Проверка элемента на условие} {Переопределение счетчика}
{Вывод результата на экран}
{Процедура «задержки» экрана } {Конец программы}
Пример 9. Дана матрица n×n. Найти число положительных элементов в побочной диагонали этой матрицы.
Решение.
Для решения задачи образуем из элементов матрицы двумерный массив. Решение будем проводить по следующей схеме:
∙Необходимо ввести реальную размерность массива;
∙Необходимо поэлементно ввести элементы матрицы (массива);
∙Зануляем счетчик положительных элементов побочной диагонали матрицы;
∙Перебираем поэлементно побочную диагональ матрицы, проверяя каждый ее элемент на равенство нулю, если элемент равен нулю, тогда значение некоторого счетчика увеличи- ваем на единицу, если же элемент не равен нулю, тогда переходим к анализу следующего элемента побочной диагонали;
Замечание. В данной задаче для перебора элементов побочной диагонали матрицы нет необходимости использовать вложенные циклы по двум параметрам i и j, как это реализуется для стандартной обработки двумерного массива. Поскольку доступ к элементам массива можно получить, указав его индексы, можно обойтись одним единственным оператором цикла по одному параметру. Так как в общем случае индекс может быть выражением, необходимо составить такое выражение для второго индекса, которое обеспечит его автоматический пересчет в обратном направлении от n до 1, с учетом прямого перебора первого индекса от 1 до n, обеспеченного оператором цикла с параметром. Это выражением имеет вид:
(n+1) -i;
Тогда с учетом, циклического перебора значений переменной i, значения этого выражения будут вычислять необходимые нам значения второго индекса, обеспечивая доступ к элементам побочной диагонали матрицы. Так при первом проходе тела цикла переменная i получит значение равное 1, что соответствует равенству единицы первого индекса элемента матрицы, а значение выражения окажется равным (n+1) -1 = n, что соответствует значению второго индекса
равному n. Таким образом, на первом шаге оператора цикла мы получим доступ к элементу массива с индексами [1, n], или первому элементу из побочной диагонали матрицы. На втором шаге переменная i получит значение равное 2, что соответствует равенству двойке первого индекса элемента матрицы, а значение выражения окажется равным (n+1) -2 = n-1, что соот-
ветствует значению второго индекса равному n-1. Таким образом, на первом шаге оператора цикла мы получим доступ к элементу массива с индексами [2, n-1], или второму элементу из побочной диагонали матрицы. На третьем шаге - получим доступ к третьему элементу побочной диагонали, и т.д. На последнем n-ом шаге переменная i получит значение равное n, что соответствует равенству n первого индекса элемента матрицы, а значение выражения окажется равным (n+1) -n = 1, что соответствует значению второго индекса равному 1. Таким
образом, на последнем шаге оператора цикла мы получим доступ к элементу массива с индексами [n, 1], или последнему элементу из побочной диагонали матрицы
В этом случае конструкция для перебора элементов побочной диагонали матрицы и проверки положительности его значения будет выглядеть следующим образом:
for i:=1 to n do
if x[i,(n+1) -i] >= 0 then k:=k+1;
- 45 -
Использование стандартной конструкции перебора элементов двумерного массива потребует введения дополнительной проверки условия на принадлежность элемента побочной диагонали, и будет иметь вид:
for i:=1 to n do for j:=1 to n do
if (j = n-+1-i) and (x[i,j] >= 0) then k:=k+1;
Однако, хотя такая конструкция и возможна, она оказывается крайне не эффективной, поскольку в этом случае перебираются абсолютно все элементы матрицы, даже заведомо не принадлежащие побочной диагонали. При этом большая часть проверок выполняется «в холостую», приводя к неоправданным затратам времени работы программы.
∙Выводим результат на экран и завершаем работу программы.
Блок схема для решения задачи выглядит следующим образом:
При реализации этой схемы на алгоритмическом языке Паскаль учтем следующие обстоятельства:
∙ Во-первых, все переменные должны быть описаны. В разделе описаний констант опишем кон- станту t, имеющую смысл размерности нашего массива (числа элементов последовательности), приняв ее значение равным 100. Поскольку регулярный тип массив не относится к стандартным типам данных, в разделе описания типов вводим тип с именем matr, определив его как двумер- ный массив размерности t на t элементов. Затем в разделе описаний переменных введем пере- менную x – типа matr в качестве массива компонент исходной матрицы, i и j – целого типа, в качестве вспомогательных переменных, параметров цикла обеспечивающих возможность поэле- ментного перебора элементов матрицы, а так же переменную k – целого типа в качестве счетчика количества положительных элементов побочной диагонали. Перемененную n – целого типа, имеющую смысл реального значения размерности массива (числа строк и столбцов матрицы).
- 46 -
ПРИМЕЧАНИЯ.
Описать нестандартную переменную типа массив можно и не вводя раздел описания типов и не указывая тип matr. Синтаксис языка Паскаль допускает описание переменной путем указания не имени ее типа, а с указанием описания типа. Например:
var x : array[1..t,1..t] of real;
∙ Во-вторых, поскольку число шагов, которые необходимо будет сделать для перебора всех эле- ментов массива и в процессе ввода и в процессе его обработки заранее известно, воспользуемся оператором цикла с параметром. Для ввода элементов массива используем переменную i в каче- стве параметра внешнего цикла (обеспечивая перебор элементов матрицы по строкам) и пере- менную j в качестве параметра внутреннего цикла (обеспечивая перебор элементов матрицы по столбцам). Однако еще раз заметим, что конечным значением параметров цикла будет не значе- ние t (вспомогательное значение, используемое при описании массива), а значение n (реальная размерность массива, где n – число строк и столбцов в матрице);
∙В-третьих, при вводе элементов массива организуем «диалог» с помощью сочетания операто- ров вывода и ввода, применяя операторные скобки, поскольку в операторе цикла с параметром может быть использован только один оператор языка Паскаль.
∙В-четвертых, воспользуемся рассмотренной выше конструкцией для перебора элементов по- бочной диагонали матрицы и проверки положительности их значений;
∙В-пятых, до начала цикла по перебору элементов побочной диагонали матрицы для поиска ко- личества положительных элементов, необходимо определить начальные значения переменной k
– счетчика количества таких элементов, приняв его равным нулю.
С учетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:
program PR5 (input, output); uses crt;
const t=100;
type matr= array[1..t,1..t] of real; var x: matr;
i,j,k,n: integer;
{Заголовок программы} {Подключение модуля} {Описание константы} {Описание типа массив}
{Описание переменных}
begin |
{Начало программы} |
|||
|
|
clrscr; |
{Процедура очистки экрана} |
|
writeln(‘Введи размерность матрицы, n=‘); readln(n); |
{Ввод размерности массива} |
|||
writeln(‘Введи массив по строкам’); |
{Вывод пояснений к программе} |
|||
for i:=1 to n do begin |
{Заголовок внешнего цикла} |
|||
for j:=1 to n do begin |
{Заголовок внутреннего цикла} |
|||
write (‘х[‘,i,’,’,j,’]= ‘);readln(х[i,j]); end; writeln; end; |
{Ввод элементов массива} |
|||
k:=0; |
{Установка начальных значений} |
|||
for i:=1 to n do |
{Заголовок цикла} |
|||
|
if x[i,(n+1)-i] = 0 then |
{Проверка элемента на условие} |
||
|
|
|
{Переопределение счетчика} |
|
k:=k+1; |
||||
writeln(‘В побочной диагонали матрицы’,k,’ положительных элементов’); |
{Вывод результата на экран} |
|||
repeat until keypressed; |
{Процедура «задержки» экрана } |
|||
end. |
{Конец программы} |
- 47 -