Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика / ИНДИВИД ЗАДАНИЕ ЭКОНОМИСТЫ _Методичка

.pdf
Скачиваний:
16
Добавлен:
12.04.2015
Размер:
659.27 Кб
Скачать

При реализации этой схемы на алгоритмическом языке Паскаль учтем следующие обстоятельства:

Во-первых, все переменные должны быть описаны. В разделе описаний констант опишем кон- станту t, имеющую смысл размерности нашего массива (числа элементов последовательности), приняв ее значение равным 100. Поскольку регулярный тип массив не относится к стандартным типам данных, в разделе описания типов вводим тип с именем matr, определив его как двумер- ный массив размерности t на t элементов. Затем в разделе описаний переменных введем пере- менную x типа matr в качестве массива компонент исходной матрицы, i и j целого типа, в качестве вспомогательных переменных, параметров цикла обеспечивающих возможность поэле- ментного перебора элементов матрицы, а также, переменную k целого типа в качестве счетчика количества элементов матрицы не превосходящих среднего арифметического значения. Переме- ненные n и mцелого типа, имеющие смысл реального значения размерности массива (числа строк и столбцов матрицы). Кроме того, понадобятся вспомогательные переменная Sвещест- венного типа, в качестве среднего арифметического значения элементов матрицы.

ПРИМЕЧАНИЕ.

Описать нестандартную переменную типа массив можно и не вводя раздел описания типов и не указывая тип matr. Синтаксис языка Паскаль допускает описание переменной путем указания не имени ее типа, а с указанием описания типа. Например:

var x : array[1..t,1..t] of real;

Во-вторых, поскольку число шагов, которые необходимо будет сделать для перебора всех эле- ментов массива и в процессе ввода и в процессе накопления суммы заранее известно, воспользу- емся оператором цикла с параметром. Используя переменную i в качестве параметра внешнего цикла (обеспечивая перебор элементов матрицы по строкам) и переменную j в качестве пара- метра внутреннего цикла (обеспечивая перебор элементов матрицы по столбцам). Однако еще раз заметим, что конечным значением параметров цикла будет не значение t (вспомогательное значение, используемое при описании массива), а значения n и m (реальная размерность массива, где n – число строк в матрице, m число столбцов матрицы);

В-третьих, при вводе элементов массива организуем «диалог» с помощью сочетания операто- ров вывода и ввода, применяя операторные скобки, поскольку в операторе цикла с параметром может быть использован только один оператор языка Паскаль.

- 41 -

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

Пример 10. Дана матрица n×n. Найти сумму элементов первой и последней строки этой матрицы.

Решение.

Для решения задачи образуем из элементов матрицы двумерный массив. Решение будем проводить по следующей схеме:

Необходимо ввести реальную размерность массива;

Необходимо поэлементно ввести элементы матрицы (массива);

Зануляем суммы элементов первой и последней строк матрицы;

Перебираем поэлементно матрицу, суммируя элементы первой и последней строк;

Замечание. В данной задаче для набора сумм элементов первой и последней строк матрицы нет необходимости использовать вложенные циклы по двум параметрам i и j, как это реализуется для стандартной обработки двумерного массива. Поскольку доступ к элементам массива можно получить, указав его индексы, можно обойтись одним единственным оператором цикла по одному параметру. Так как в общем случае индекс может быть выражением или константой, необходимо составить такое выражение или подобрать такую константу которые обеспечат автоматический пересчет нужных нам индексов. Все элементы первой строки имеют один и тот же первый индекс – единицу, поскольку первый индекс нумерует строки матрицы. Второй индекс у элементов первой строки изменяется от 1 до n. У элементов последней строки матрицы также одинаковый первый индекс – он равен n, а вторые индексы также изменяются от 1 до n. Для набора сумм элементов соответствующих строк, в операторе цикла обеспечим автоматический пересчет вторых индексов, а первые укажем при помощи констант – единицы для первой строки, и n – для последней. Поскольку число элементов в строках одинаково, можно воспользоваться одним единственным оператором цикла с параметром. В этом случае конструкция для перебора элементов матрицы и накопления соответствующих сумм будет выглядеть следующим образом:

for j:=1 to n do begin

S1 := S1+ x[1,j];

S2 := S2+ x[n,j]; end;

Операторные скобки необходимы, поскольку оператор цикла с параметром организует выполнение только одного оператора языка Паскаль, а нам необходимо выполнить два действия по накоплению сумм соответствующих строк.

Выводим результат на экран и завершаем работу программы.

Блок схема для решения задачи выглядит следующим образом:

- 48 -

При реализации этой схемы на алгоритмическом языке Паскаль учтем следующие обстоятельства:

Во-первых, все переменные должны быть описаны. В разделе описаний констант опишем кон- станту t, имеющую смысл размерности нашего массива (числа элементов последовательности), приняв ее значение равным 100. Поскольку регулярный тип массив не относится к стандартным типам данных, в разделе описания типов вводим тип с именем matr, определив его как двумер- ный массив размерности t на t элементов. Затем в разделе описаний переменных введем пере- менную x типа matr в качестве массива компонент исходной матрицы, i и j целого типа, в качестве вспомогательных переменных, параметров цикла обеспечивающих возможность поэле- ментного перебора элементов матрицы, а так же переменную. Перемененную n целого типа, имеющую смысл реального значения размерности массива (числа строк и столбцов матрицы). А так же переменные S1и S2 вещественного типа для накопления сумм элементов первой и по- следней строк матрицы соответственно.

Во-вторых, поскольку число шагов, которые необходимо будет сделать для перебора всех эле- ментов массива и в процессе ввода и в процессе его обработки заранее известно, воспользуемся оператором цикла с параметром. Для ввода элементов массива используем переменную i в каче- стве параметра внешнего цикла (обеспечивая перебор элементов матрицы по строкам) и пере- менную j в качестве параметра внутреннего цикла (обеспечивая перебор элементов матрицы по столбцам). Однако еще раз заметим, что конечным значением параметров цикла будет не значе- ние t (вспомогательное значение, используемое при описании массива), а значение n (реальная размерность массива, где n – число строк и столбцов в матрице);

В-третьих, при вводе элементов массива организуем «диалог» с помощью сочетания операто- ров вывода и ввода, применяя операторные скобки, поскольку в операторе цикла с параметром может быть использован только один оператор языка Паскаль.

В-четвертых, для накопления сумм первой и последней строк матрицы воспользуемся рассмот- ренной выше конструкцией.

В-пятых, до начала цикла по накоплению сумм элементов первой и последней строк матрицы необходимо определить начальные значения переменных S1и S2, приняв их равными нулю.

-49 -

С учетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:

program PR6 (input, output); uses crt;

const t=100;

type matr= array[1..t,1..t] of real; var x: matr;

i,j,n: integer; S1,S2: real;

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; S1:=0; S2:=0;

for j:=1 to n do begin

S1 := S1+ x[1,j];

S2 := S2+ x[n,j]; end;

writeln(‘Сумма элементов первой строки матрицы - ’,S1:6;3); writeln(‘Сумма элементов последней строки матрицы - ’,S2:6;3); repeat until keypressed;

end.

{Заголовок программы} {Подключение модуля} {Описание константы} {Описание типа массив}

{Описание переменных}

{Начало программы} {Процедура очистки экрана} {Ввод размерности массива} {Вывод пояснений к программе} {Заголовок внешнего цикла} {Заголовок внутреннего цикла} {Ввод элементов массива}

{Установка начальных значений} {Заголовок цикла} {Открывающая операторная скобка}

{Расчет суммы элементов первой строки} {Расчет суммы элементов последней строки} {Закрывающая операторная скобка}

{Вывод результата на экран}

{Процедура «задержки» экрана } {Конец программы}

- 50 -

Соседние файлы в папке Информатика