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

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

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

Тема 3

Регулярный тип данных (тип – массив)

Краткая теория

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

Основные характеристики этого типа:

1- число компонентов всегда заранее известно; 2- все компоненты массива имеют один и тот же тип;

3- отдельные компоненты отделяются с помощью индекса.

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

type <имя регулярного типа> = array [<тип индекса>] of <тип компонент>;

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

или

matr = array [1.. 3, 1..3] of real;

Доступ к компонентам массива осуществляется указанием имени массива, за которым в квад- ратных скобках следует значение индекса (или индексов).

a = ( ax ay az) = (a1 a2 a3)

аi - A[i]

Размерность массива может быть любой. Компоненты массива могут быть любого (в том числе и структурированного) типа. В качестве типа индекса может выступать любой скалярный тип, кроме вещественного и типа LongInt, так как число компонент должно быть заранее известно. Вместо це- лого типа используют ограничение на целый тип. Можно использовать символьный, перечислимый, логический типы. При этом, индексы могут быть как значениями-постоянными, так и значениями- переменными и выражениями.

Например:

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

a[1], c[3], b[i], b[i+1]

Кроме операции присваивания над полной переменной регулярного типа не разрешено ни одно действие. Одному массиву можно присвоить значения другого массива а:=b, но в этом случае следу- ет помнить, что операция присваивания выполняется только для идентичных массивов

var A,B: array [1..3] of integer; C: array [1..3] of real;

A:=B;

A:=C; - не допустимо!

- 31 -

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

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

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 -

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

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

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

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

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

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

- 38 -

максимума и минимума из элементов матрицы, а также целые переменные imax. jmax, imin, jmin для определения индексов максимального и минимального элементов матрицы.

ПРИМЕЧАНИЯ.

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

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

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

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

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

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

В-четвертых, до начала цикла по перебору элементов матрицы для поиска максимального и минимального элементов и их индексов необходимо определить начальные значения перемен- ных max, min, imax. jmax, imin, jmin, выбрав на роль такого элемента первый элемент

max:=х[1,1]; imax:=1; jmax:=1; min:=х[1,1]; imin:=1; jmin:=1;

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

program PR2 (input, output); uses crt;

const k=100;

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

max,min: real; i,j,n,m,imax,imin,jmax,jmin: integer;

begin

clrscr;

writeln(‘Введи число строк матрицы, n=‘); readln(n); writeln(‘Введи число столбцов матрицы, m=‘); readln(m); writeln(‘Введи массив по строкам’);

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

write (‘х[‘,i,’,’,j,’]= ‘);readln(х[i,j]); end; writeln; end; max:=x[1,1]; imax:=1; jmax:=1;

min:=x[1,1]; imin:=1; jmin:=1; for i:=1 to n do begin

- 39 -

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

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

{Начало программы} {Процедура очистки экрана}

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

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

{Установка начальных значений}

{Заголовок внешнего цикла}

for j:=1 to m do begin

 

 

{Заголовок внутреннего цикла}

 

if max<x[i,j] then begin

 

 

{Проверка элемента на условие максимума}

 

 

 

 

 

{Переопределение максимального элемента}

max:=x[i,j]; imax:=i; jmax:=j; end;

 

 

if min>x[i,j] then begin

 

 

{Проверка элемента на условие минимума}

min:=x[i,j]; imin:=i; jmin:=j; end;

 

 

{Переопределение минимального элемента}

end; end;

 

 

{Закрытие операторных скобок}

writeln(‘Максимальный элемент -’,max,

его индексы -’,imax,’

, ‘, jmax);

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

writeln(‘Минимальный элемент -’,min,

его индексы -’,imin,’ ,

‘, jmin);

 

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

repeat until keypressed;

 

 

end.

 

 

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

Пример 7. Дана матрица n×m. Найти число элементов этой матрицы, не превосходящих среднего

арифметического

Решение.

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

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

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

Перебираем поэлементно массив, накапливая из них сумму;

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

ееначальное значение принять равным нулю, для обеспечения правильности расчетов.

Рассчитываем среднее арифметическое элементов матрицы, разделив накопленную сумму элементов на количество элементов в матрице;

«Зануляем» счетчик элементов;

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

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

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

- 40 -

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