Файл: ИНДИВИД ЗАДАНИЕ ЭКОНОМИСТЫ _Методичка.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.07.2024

Просмотров: 139

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Если массив одномерный, то

for i:=1 to n do readln(a[i]); {writeln(a[i]);}

Если массив двухмерный, то

for i:=1 to n do for j:=1 to m do

readln(a[i]); {writeln(a[i]);}

В фигурных скобках приводятся процедуры для вывода массива.

Любая задача с обработкой массива подразумевает его предварительный, обязательный ввод. Ис- ключение: массив считывается с внешнего устройства.

Образцы решения задач

Пример 5. Задана последовательность 100 вещественных чисел, найти наибольший элемент этой по- следовательности.

Решение.

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

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

В качестве промежуточного максимального элемента выбираем первый элемент последо- вательности (массива);

Перебираем поэлементно последовательность, сравнивая каждое очередное значение с промежуточным максимумом. Если очередной элемент превосходит значение промежу- точного максимума, тогда проводим его переопределение, присваивая промежуточному максимуму значение этого элемента. Если очередной элемент не превосходит значение промежуточного максимума, тогда переходим к анализу очередного элемента последова- тельности (массива) без каких либо изменений;

ПРИМЕЧАНИЕ. Перебор элементов последовательности начинаем со второго элемента, поскольку первый элемент уже использован, и нет необходимости сравнивать его с самим собой.

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

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

- 32 -


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

Во-первых, все переменные должны быть описаны. Поэтому в разделе описаний констант опи- шем константу n, имеющую смысл размерности нашего массива (числа элементов последова- тельности), приняв ее значение равным 100. Поскольку регулярный тип массив не относится к стандартным типам данных, в разделе описания типов вводим тип с именем vector, определив его как одномерный массив из n элементов. Наконец, в разделе описаний переменных введем пе- ременные х типа vector в качестве массива исходной последовательности элементов, max ве- щественного типа в качестве максимального элемента последовательности, i в качестве вспо- могательной переменной, параметра цикла обеспечивающего возможность поэлементного пере- бора элементов последовательности. Опишем эту переменную как относящуюся к типу диапазон от 1 до n.

ПРИМЕЧАНИЯ.

1.Константа n обеспечивает возможность правильно описать массив. Если ее не определить, тогда необходимо при описании массива использовать жесткое указание на число его компонент, напрямую указав значение 100.

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

var x: array[1..n] of real;

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

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

-33 -


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

Program max (input, output);

{Заголовок программы}

uses crt;

{Подключение модуля}

const n=100;

{Описание константы}

type vector= array[1..n] of real;

{Описание типа массив}

var x:vector;

 

мах: real;

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

i: 1..n;

{Начало программы}

begin

clrsсr;

{Процедура очистки экрана}

writeln(‘Введи последовательность’);

{Вывод пояснений к программе}

for i:=1 to n do

{Заголовок цикла}

begin

{Открывающая операторная скобка}

write (‘x[‘,i,’]= ‘); readln(x[i]);

{Ввод элементов массива}

end;

{Закрывающая операторная скобка}

мах:=x[1];

{Установка начального значения}

for i:=2 to n do

{Заголовок цикла}

if max<x[i] then max:=x[i];

{Проверка условия}

writeln(‘Максимальный элемент в последовательности - ‘,max);

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

repeat until keypressed;

{Процедура «задержки» экрана }

end.

{Конец программы}

Пример 5. Рассчитать скалярное произведение двух n – мерных векторов Р = S ai bi

Решение.

Из формулы для расчета скалярного произведения векторов

P = åai bi = a1 × b1 + a2 ×b2 + a3 ×b3 + ... + an × bn

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

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

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

·Перебираем поэлементно компоненты векторов, перемножая между собой соответствую- щие компоненты и набирая из этих произведений сумму;

·Выводим найденную сумму, определяющую скалярное произведение двух векторов, на экран и завершаем работу программы.

Замечание. Для корректной работы программы необходимо определить значение размерности массивов элементов исходных векторов. Это можно осуществить различными способами. Мы воспользуемся следующим методом: Сначала зарезервируем память под достаточно большой массив, затем запросим у пользователя на уровне диалога реальную размерность массива, воспользовавшись специальной переменной (например, определив ее имя как n).

- 34 -


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

Замечание. Поскольку число элементов массива указывается при его описании и остается постоянным в процессе работы. Число шагов, которое необходимо выполнить для ввода компонент массива считается известным. В этом случае можно воспользоваться оператором цикла с параметром. В нашем случае необходимо будет применить три оператора цикла с параметром: первый – для ввода компонент вектора - a, второй – для ввода компонент вектора – b, третий – для набора суммы произведений компонент векторов a и b. Поскольку число шагов в этих операторах одинаково (n) в данном случае, в силу специфики задачи, можно применить только один оператор цикла с параметром совместив в его теле три действия: ввод компонент вектора a, ввод компонент вектора b и набор суммы произведений компонент векторов a и b. Такое совмещение возможно, так как при пошаговом выполнении тела цикла сначала будет введена первая компонента вектора a, затем первая компонента вектора b и их можно будет сразу же перемножить между собой и добавить в накапливаемую сумму. На втором шаге будут введены вторые компоненты соответствующих векторов, и их произведение будет добавлено к сумме, в которой находится произведение первых компонент векторов. На третьем шаге соответствующие действия будут выполнены над третьими компонентами векторов a и b, и в сумме окажется накоплена сумма из произведений первых, вторых и третьих компонент. И так далее до последних n –х компонент.

С учетом замечания, блок схема для решения задачи может быть представлена следующим образом:

- 35 -

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

Во-первых, все переменные должны быть описаны. Для описания массива необходимо будет указать его размерность (число элементов). Но оно заранее не известно, поскольку будет введено пользователем в ответ на запрос о размерности массива. Однако указать неизвестное число эле- ментов массива при его описании невозможно. Для решения этой проблемы поступим так. В раз- деле описаний констант опишем константу k, имеющую смысл размерности нашего массива (числа элементов последовательности), приняв ее значение равным 100. Таким образом, мы как бы резервируем пространство памяти, отведенное для хранения массивов. Значение константы k можно взять любым, достаточно большим значением, обеспечивающим работу с реальными мас- сивами компонент исходных векторов. Поскольку регулярный тип массив не относится к стан- дартным типам данных, в разделе описания типов вводим тип с именем vector, определив его как одномерный массив из k элементов. Затем в разделе описаний переменных введем переменные a и b типа vector в качестве массива компонент исходных векторов, Р вещественного типа в качестве значения скалярного произведения, i в качестве вспомогательной переменной, пара- метра цикла обеспечивающего возможность поэлементного перебора элементов последователь- ности. Опишем эту переменную как относящуюся к типу диапазон от 1 до k. И наконец переме- ненную n целого типа, имеющую смысл реального значения размерности векторов (числа ком- понент векторов).

ПРИМЕЧАНИЯ.

1.Константа k обеспечивает возможность правильно описать массив. Если ее не определить, тогда необходимо при описании массива использовать жесткое указание на число его компонент, напрямую указав значение 100. Но в этом случае размерность массива будет жестко определена и придется вводить все сто элементов без возможности работать с произвольной размерностью.

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

var a,b : array[1..k] of real;

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

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

может быть использован только один оператор языка Паскаль.

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

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

Program Scal (input, output); uses crt;

const k=100;

type vector= array[1..k] of real; var a,b:vector;

P: real; i: 1..k;

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

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

- 36 -


n: integer;

begin

{Начало программы}

clrsсr;

{Процедура очистки экрана}

writeln(‘Введи число элементов векторов, n=‘); readln(n);

{Ввод размерности массива}

writeln(‘Вводи элементы векторов’);

{Вывод пояснений к программе}

P:=0;

{Установка начального значения суммы}

for i:=1 to n do

{Заголовок цикла}

begin

{Открывающая операторная скобка}

write (‘a[‘,i,’]= ‘); readln(a[i]);

{Ввод элементов первого вектора}

write (‘b[‘,i,’]= ‘); readln(b[i]);

{Ввод элементов второго вектора}

P:=P+a[i]*b[i];

{Накопление суммы произведений}

end;

{Закрывающая операторная скобка}

writeln(‘Скалярное произведение векторов равно - ‘,P:8:6);

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

repeat until keypressed;

{Процедура «задержки» экрана }

end.

{Конец программы}

Пример 6. Дана матрица размерностью 3×4 (три стоки, четыре столбца), найти максимальный и ми- нимальный элемент, указать их индексы.

Решение.

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

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

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

Замечание. Для корректной работы программы необходимо определить значение размерности массива элементов исходной матрицы. Это можно осуществить различными способами. Мы воспользуемся следующим методом: Сначала зарезервируем память под достаточно большой массив, затем запросим у пользователя на уровне диалога реальную размерность массива, воспользовавшись специальными переменными (например, определив ее имя как n для числа строк

иm – для числа столбцов).

В качестве промежуточного максимального элемента выбираем первый элемент последо- вательности (массива), а его индексы принимаем как индексы максимального элемента;

В качестве промежуточного минимального элемента выбираем первый элемент последо- вательности (массива) а его индексы принимаем как индексы минимального элемента

Перебираем поэлементно массив, сравнивая каждое очередное значение с промежуточ- ным максимумом. Если очередной элемент превосходит значение промежуточного мак- симума, тогда проводим его переопределение, присваивая промежуточному максимуму значение этого элемента. А текущие индексы данного элемента используем для определе- ния индексов максимального элемента. Если очередной элемент не превосходит значение промежуточного максимума, тогда переходим к анализу очередного элемента последова- тельности (массива) без каких либо изменений;

Вновь перебираем поэлементно массив, сравнивая каждое очередное значение с промежу- точным минимумом. Если очередной элемент не превосходит значение промежуточного минимума, тогда проводим его переопределение, присваивая промежуточному минимуму значение этого элемента. А текущие индексы данного элемента используем для определе- ния индексов минимального элемента. Если очередной элемент превосходит значение

-37 -