Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция по ПАСКАЛЬ.doc
Скачиваний:
37
Добавлен:
20.04.2015
Размер:
572.93 Кб
Скачать

7.Массивы

До сих пор мы рассматривали переменные, которые имели только одно значение, могли содержать в себе только одну величину определенного типа.

Вы знаете, что компьютер предназначен в основном для облегчения работы человека с большими информационными объемами. Как же, используя только переменные известных вам типов, сохранить в памяти и обработать данные, содержащие десяток, сотню, тысячу чисел? А ведь такие задачи встречаются в любой области знания. Конечно, можно завести столько переменных, сколько данных, можно даже занести в них значения, но только представьте, какой величины будет текст такой программы, сколько времени потребуется для его составления, как много места для возможных ошибок? Естественно, об этом задумывались и авторы языков программирования. Поэтому во всех существующих языках имеются типы переменных, отвечающие за хранение больших массивов данных. В языке Паскаль они так и называются: "массивы".

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

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

Одномерные массивы

Описание типа линейного массива выглядит так:

Type <Имя типа>=Array [<Диапазон индексов>] Of <Тип элементов>;

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

Описать массив можно и сразу (без предварительного описания типа) в разделе описания переменных:

Var <имя массива> : Array [<Диапазон индексов>] Of <Тип элементов>;

Примеры описания массивов:

Var

A, B : Array [1..20] Of Integer;

N : Array [1..40] Of Real;

Теперь переменные A, B представляют собой массивы из 20 целочисленных чисел; массив N – из 40 вещественных элементов.

Единственным действием, которое возможно произвести с массивом целиком - присваивание. Для данного примера описания впоследствии допустима следующая запись:

B:=A;

Однако, присваивать можно только массивы одинаковых типов.

Никаких других операций с массивами целиком произвести невозможно, но с элементами массивов можно работать точно также, как с простыми переменными соответствующего типа. Обращение к отдельному элементу массива производится при помощи указания имени всего массива и в квадратных скобках - индекса конкретного элемента. Например: N[10] - элемент массива N с индексом 10.

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

Ввод массива:

  1. С клавиатуры

For I:=1 To 20 Do

Read (a[i]);

  1. Автоматическое формирование массива

ForI:=1To20Do

a[i] := random (50)-25;

Здесь был использован генератор случайных чисел random. Рассмотрим его подробнее.

Для формирования значения целого типа используется random с параметром, например random (50), который будет формировать случайным образом число из диапазона от 0 до числа, указанного в скобках минус единица, т.е. до 49. Для формирования не только положительных, но и отрицательных значений из полученного результата достаточно вычесть какое-либо число. Например, random (50)–25 – будет формировать целое число в диапазоне от -25 до 24.

Для формирования значения вещественного типа используется random без параметра. В этом случае формируется число в диапазоне от 0 до 1. Для увеличения значения числа можно домножить полученное на 10, 100 и т.д. Для получения отрицательных значений используется тот же прием, что и для целых чисел. Пример, random*100-50; .

Вывод массива:

  1. В строку

For I:=1 to 20 Do

Write(A[I] :5)

Формат вывода (:5) необходим в данном случае для того, чтобы элементы массива не соединились в одно число и между ними были пробелы.

  1. В столбец

For I:=1 to 20 Do

Writeln(A[I])

Указание формата вывода здесь не обязательно. При его указании столбец будет сдвигаться вправо по экрану.

Пример: сформировать массив случайным образом из 20 элементов в диапазоне от -10 до 10 и вывести его в строку.

Program M1;

Var

A : Array [1..20] Of Integer;

I : Integer;

Begin

Randomize;

For I:=1 To 20 Do

a[i] := random (11)-10;

writeln(Массив А);

For I:=1 to 20 Do

Write(A[I] :5)

End.

С обработкой линейных массивов связано множество задач. Их мы рассмотрим на практических занятиях.

Двумерные и многомерные массивы

Представьте себе таблицу, состоящую из нескольких строк. Каждая строка состоит из нескольких ячеек. Тогда для точного определения положения ячейки нам потребуется знать не одно число (как в случае таблицы линейной), а два: номер строки и номер столбца. Структура данных в языке Паскаль для хранения такой таблицы называется двумерным массивом.

Описание двумерного массива:

Var

A : Array [1..20,1..30] Of Integer;

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

Отдельный элемент двумерного массива адресуется, естественно, двумя индексами. Например, ячейка, находящаяся в 5-й строке и 6-м столбце будет называться A[5,6].

Ввод двумерного массива:

  1. С клавиатуры

For i:=1 to 20 do

For j:=1 to 30 do

Read (a[I,j]);

  1. Автоматическое формирование массива

Fori:=1 to20 do

For j:=1 to 30 do

a[I,j] := random (50)-25;

Вывод двумерного массива в виде матрицы:

For i:=1 to 20 do begin

For j:=1 to 30 do

Write(A[i,j] :5)

Writeln;

End;

Для иллюстрации способов работы с двумерными массивами решим задачу: "Задать и распечатать массив 10х10, состоящий из целых случайных чисел в интервале [1,100]. Найти сумму элементов, лежащих выше главной диагонали."

При отсчете, начиная с левого верхнего угла таблицы, главной будем считать диагональ из левого верхнего угла таблицы в правый нижний. При этом получается, что элементы, лежащие на главной диагонали будут иметь одинаковые индексы (i=j), а для элементов выше главной диагонали номер столбца будет всегда превышать номер строки (j>i).

Program M2;

Uses Crt;

Var

A : Array[1..10,1..10] Of Integer;

i, j : Byte;

S : Integer;

Begin

Clrscr;

Randomize;

{формирование матрицы}

For i:=1 to 10 do Begin

For j:=1 to 10 do Begin

A[i,j]:=Random(100)+1;

{вывод матрицы}

For i:=1 to 10 do Begin

For j:=1 to 10 do

Write(A[i,j]:5);

Writeln:

End;

{подсчет суммы элементов выше главной диагонали}

S:=0;

For i:=1 to 10 do

For j:=1 to 10 do

If j>i Then S:=S+A[i,j]

Writeln('Сумма элементов выше гл. диагонали равна ',S)

End.

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