
- •Московский государственный социальный университет
- •Часть I
- •Лекция 1: Введение в программирование.
- •Лекция 2: Язык Паскаль и системы программирования на Паскале.
- •Лекции 3-4: Базисные конструкции языка.
- •Лекции 5-6: Простые операторы и программы с линейной структурой.
- •Лекция 7: Операторы с условиями.
- •Лекция 8: Методика разработки простых программ.
- •Лекция 9: Концепция типа данных.
- •Лекция 10: Структурный тип - Массив.
- •Лекция 11: Структурный тип - Строка.
- •Лекция 15: Структурный тип - Множество.
- •Лекция 16: Структурный тип - Запись.
- •Часть II
- •Лекции 17-19: Модули и их использование.
- •Interface
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Лекция 20: Структурный тип - Файл.
- •Лекции 21-22: Основные задачи обработки файлов.
- •Interface
- •Implementation
- •Лекция 23: Динамическая память и указатели.
- •Лекции 24-25: Использование указателей для представления динамически структур данных.
- •Лекции 26-27: Объекты и объектно-ориентированное программирование.
- •Interface
- •Implementation
- •Оглавление
- •Часть I 3
- •Часть II 53
Лекция 10: Структурный тип - Массив.
1. Понятие массива в Паскале.
2. Описание массивов и доступ к элементам массива..
3. Обработка массивов.
4. Пример работы с массивом.
1. Понятие массива в Паскале.
Массив является одним из основных структурных типов Паскаля, широко применяемым в практике программирования. Идея массива состоит в том, чтобы объединить в одно целое фиксированное количество элементов одного и того же типа. Например, массив результатов измерений, массив данных о ежедневном расписании и др. Без использования массива в этих и многих других случаях пришлось бы описывать большое число переменных для представления данных, что делает нереальной обработку таких данных. Массив дает удобный способ представления и обработки массовых однородных данных.
Суть концепции массива в Паскале заключается в том, чтобы объединить элементы в такую структуру, в которой эти элементы были бы линейно упорядочены (пронумерованы) так, чтобы к ним был прямой доступ через их номер. Номер элемента в массиве принято называть индексом элемента.
В Паскале допустимы только статические массивы. Это означает, что число элементов массива должно оставаться постоянным при обработке массива и быть указано при описании массива. Размер массива в Паскале не может быть представлен переменной, а только константой. Другими словами, размер массива должен быть известен в период компиляции программы, так как под него статически распределяется память. Это, конечно, является существенным ограничением, однако позволяет сохранить в более чётком виде концепцию типов в Паскале. Для работы с переменным числом компонентов в Турбо Паскале следует использовать динамические структуры данных - указатели или файлы, с которыми мы познакомимся во второй части курса.
2. Описание массивов и доступ к элементам массива.
Прежде чем использовать массив, его следует описать в разделе описаний программы. Общая форма описания массива имеет вид:
type <имя типа-массива> = array [ < тип индекса > ] of < тип элементов>;
где: <имя типа-массива> - имя, выбираемое программистом.
< тип индекса > - любой порядковый тип (кроме longint) или тип-диапазон.
< тип элементов > - любой тип Турбо Паскаля.
В качестве типа индекса часто используют тип-диапазон, указывающий границы индекса. Например:
type measure = array [ 1..16] of real; {тип -массив измерений}
var m1,m2: measure; {переменные-массивы измерений}
Кроме переменных допускается также описание типизированных констант-массивов, в котором элементы-константы перечисляются через запятую. Например:
сonst vect: array [1..8] of 0..9 = (0,0,0,0,1,2,3,4);
Если тип элементов - простой тип, то массив - одномерный (вектор). Однако тип элементов может быть в свою очередь тип-массив. В этом случае мы имеет дело с массивом более высокой размерности. Если тип элементов - одномерный массив, то описываемый массив - двумерный (матрица). Аналогичным образом можно получить трехмерные, четырехмерные массивы и т.д.
Двумерный массив (матрица) может быть описан в виде:
type <имя типа-массива>= array [<тип индекса1>] of array [<тип индекса2>] of <тип >;
Однако в Паскале допускается более компактная форма таких описаний, в которой вместо одного типа индекса используется список из нескольких типов индексов.
Для матрицы такое описание будет иметь вид:
type <имя типа-массива>=array[<тип индекса1,тип индекса2>]of <тип компонент>;
Например: type matr= array [ 1..16,1..8] of real; {тип - матрица 16х8}
var mt1,mt2: matr; {переменные типа matr}
Доступ к элементам массива осуществляется посредством так называемых индексированных имен, имеющих вид:
<имя переменной-массива > [<индексное выражение > ];
где : <индексное выражение > - выражение типа индекса (в частности, индексным выражением может быть переменная).
В случае, когда массив многомерный (имеет несколько индексов), доступ к элементу массива осуществляется по списку индексных выражений в виде:
<имя переменной-массива >[<индексное выражение1 >,<индексное выражение2 >, ...];
Например: m1[ j ] {значение j- элемента массива m1}
mt2[j+3, k] {значение элемента (j+3)-строки, k-столбца матрицы mt2}
Индексы, таким образом, предоставляют новый способ именования элементов, существенно отличный от имён простых переменных. По сути, индексированное имя (имя компонента массива) - вычислимое имя, т.е. такое, которое может изменяться при выполнении программы за счёт изменения значения индексного выражения. Это придает доступу по индексам весьма большую гибкость и удобство при обработке массивов.
3. Обработка массивов.
Для массивов допустим оператор присваивания в форме:
<переменная1-массив> := < переменная2 -массив>;
где: левая и правая части содержат переменные массивов только одного типа.
Такие операторы присваивания могут использоваться для копирования одного массива в другой. Однако над массивами не определены отношения <,>,<=,>=,=.<>. Кроме того, в Турбо Паскале нельзя использовать выражения над массивами.
За исключением приведенного выше оператора присваивания, обработка массивов осуществляется путем обработки его элементов. Для этого следует использовать доступ к элементам через индексы. Например, для индексных переменных допустим оператор присваивания вида:
<переменная-массив> [<индексная переменная>] := < выражение >;
где: < выражение > должно быть согласовано по типу с типом элементов массива. Индексированные имена могут входить в состав выражений соответствующего типа также как простые имена.
Важным средством обработки массивов являются циклы. Хотя для обработки массивов можно использовать описанные ранее итерационные циклы, обычно более удобными являются циклы с параметром.
В Турбо Паскале имеются две разновидности циклов с параметром (циклов for):
for <параметр> := < нач.зн.> to <кон.зн.> do <оператор тела цикла>;
for <параметр> := <кон.зн.> downto <нач.зн.> do <оператор тела цикла>;
Параметром цикла for может быть переменная любого порядкового типа.
< нач.зн.> и <кон.зн.> - выражения того же типа, что и параметр, определяющие границы изменения параметра в данном цикле.
<оператор тела цикла> - любой оператор Турбо Паскаля.
Цикл с параметром (первая его разновидность) выполняется следующим образом: вначале вычисляются < нач.зн.> и < кон.зн.> и осуществляется присваивание параметру цикла < нач.зн.>. Проверяется, не превышает ли параметр значения <кон.зн.> (т.е. выполняется сравнение <параметр> < <кон.зн.>), и если не превышает, то выполняется тело цикла, после чего параметру присваивается следующее по порядку значение (т.е. succ(< нач.зн.>)) и цикл повторяется. Если параметр превысил <кон.зн.>, цикл завершается (осуществляется переход к следующему за циклом оператору программы).
Таким образом, цикл for повторяет выполнение оператора тела цикла несколько раз с разными значениями параметра от начального значения до конечного значения.
Вторая разновидность цикла с параметром отличается при выполнении лишь тем, что параметр изменяется в обратном направлении - от конечного значения к начальному. Выход из этого цикла осуществляется, если значение параметра меньше начального значения.
При использовании цикла for желательно, чтобы параметр цикла, выражения <нач.зн.> и <кон.зн.> не изменяли свои значения при выполнении тела цикла ( а также <нач.зн.> и <кон.зн.> не имели зависимости от параметра цикла). Это гарантирует завершение цикла за конечное число шагов и ясную для понимания структуру цикла.
Хотя часто цикл for используют с целочисленным параметром, полезно помнить, что он может быть использован с параметром любого порядкового типа, что придает ему значительно большую гибкость, чем имеют циклы с параметром в других языках (например, в Фортране).
Проиллюстрируем использование цикла for на примерах.
4. Примеры работы с массивом.
Приведём вначале простую программу на Турбо Паскале, иллюстрирующую обе разновидности цикла for , а также описание массива и создание массива.
program Lat_alphabet;
{Создание массива латинских букв и вывод лат. алфавита}
type m_let = array [1..26] of 'a'..'z';
var letters:m_let; let:char;j:byte;
begin writeln('Латинский алфавит:'); j:=1;
for let:='a' to 'z' do begin letters[j]:=let; inc(j) end;
for j:=1 to 26 do write(letters[j], upcase(letters[j]),' ');writeln;
for j:=26 downto 1 do write(letters[j], upcase(letters[j]),' ');writeln;
end.
Следующая программа на Турбо Паскале иллюстрирует работу с одномерным и двумерным массивом, а также с функцией random (генератором псевдослучайных чисел):
program test_random;{Тест распределения псевдослучайных чисел}
uses CRT;
type dec=0..9; {тип - десятичная цифра}
var ms:array [dec] of integer; {измерительный массив} i,j:integer;
matr:array [1..20,1..30] of dec;{генерируемая матрица цифр}
begin TextBackground(cyan);TextColor(white);ClrScr;
writeln(' Матрица пс цифр:');randomize;
for j:=0 to 9 do {инициация измерительного массива нулями} ms[j]:=0;
{заполнение матрицы пс цифрами}
for i:=1 to 20 do for j:=1 to 30 do
begin matr[i,j]:=random(10); write(matr[i,j],' ');
if j=30 then writeln;
{коррекция элемента массива ms}
ms[matr[i,j]]:=ms[matr[i,j]]+1;
end; writeln(' Количество пс цифр по значениям:');
writeln(' 0 1 2 3 4 5 6 7 8 9 ');
{ вывод массива ms} for i:=0 to 9 do write(ms[i]:4);writeln;
end { test_random}.