Помощь в написании студенческих работ
Антистрессовый сервис

Массивы. 
Одномерные и двухмерные массивы

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Каждый элемент массива — это переменная, которой можно присваивать значения в операторах и функциях. Для того, чтобы указать элемент массива, необходимо записать все его индексы. После объявления массива каждый его элемент можно обработать, указав идентификатор (имя) массива и индекс элемента в квадратных скобках. Массив в языке Паскаль это сложный тип данных, поэтому чаще всего его описывают… Читать ещё >

Массивы. Одномерные и двухмерные массивы (реферат, курсовая, диплом, контрольная)

Курсовая работа

по дисциплине «Основы алгоритмизации и программирования»

На тему «Массивы. Одномерные и двухмерные массивы»

1. Введение

2. Массивы

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

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

2.1.2 Двумерные массивы

2.1.3 Многомерные массивы

2.2 Описание массивов

2.3 Получение элементов массива

2.4 Ввод массива с клавиатуры

2.5 Вывод массива на экран

2.6 Действия с массивами

2.7 Сортировка массивов

2.8 Метод простых обменов (Пузырьковая сортировка)

2.9 Сортировка простым выбором

2.10 Сортировка простым включением (Метод вставки и сдвига)

2.11 Параметры массива и параметры строки

2.12 Действия над массивами

2.13 Пример решения задачи с использованием массивов Паскаля Заключение Приложение

1. Введение

Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.

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

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

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

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

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

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

2. Массивы

Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.

Массив — это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти. Каждая ячейка содержит элемент массива. Элементы нумеруются по порядку, но необязательно начиная с единицы Массивы состоят из ограниченного числа компонент, причем все компоненты массива имеют один и тот же тип, называемый базовым. Структура массива всегда однородна. Массив может состоять из элементов типа integer, real или char, либо других однотипных элементов. Из этого, правда, не следует делать вывод, что компоненты массива могут иметь только скалярный тип. Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу). Индекс — это переменная типа INTEGER. В одномерном массиве элементы массива нумеруются одним индексом. Нужно четко понимать, что индекс ячейки массива не является ее содержимым. Содержимым являются хранимые в ячейках данные, а индексы только указывают на них. Действия в программе над массивом осуществляются путем использования имени переменной, связанной с областью данных, отведенной под массив.

Массивом называется набор данных одного типа, расположенный в оперативной памяти. К элементу массива можно обратиться по его индексу (номеру). В памяти ЭВМ все элементы массива располагаются подряд. Каждый из индексов массива находится в некотором диапазоне (<�нач. элемент>…<�кон. элемент>). Причем конечный элемент больше либо равен начальному элементу. В качестве диапазона можно использовать: Integer, Char, Boolean. Очень часто это целочисленный тип (integer, word или byte), но может быть и логический и символьный. У разных массивов типы данных могут различаться. Например, один массив может состоять из чисел типа integer, а другой — из чисел типа real.

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

Var <�переем. массив>: array[<�диапазон 1>.<�диапазон N>]

Of <�тип переменной>;

В языке Паскаль тип массива задается с использованием специального слова array (англ. — массив), и его объявление в программе выглядит следующим образом:

Type < имя _ типа >= array [ I ] of T;

где I — тип индекса массива, T — тип его элементов.

Можно описывать сразу переменные типа массив, т. е. в разделе описания переменных:

Var a, b: array [ I ] of T;

Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа: I 1. I n. Например, индексы могут изменяться в диапазоне 1.20 или ` a '.' n '.

При этом длину массива Паскаля характеризует выражение:

ord (I n) — ord (I 1)+1.

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

Массив состоит из нескольких элементов. Ко всему массиву можно обращаться по его имени. Можно обращаться к его элементу, но для этого надо задать индекс (индексы). Для объявления массива необходимо задать типы его индексов и компонент:

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

Тип данных Массив позволяет одному идентификатору задать несколько значений, которые отличаются порядковым номером. Номер элемента массива указывается после идентификатора в квадратных скобках {M[5] - пятый элемент массива М}. При описании массива указывается диапазон номеров элементов массива и тип, к которому относится каждый его элемент. Массивы бывают следующих видов:

1. Одномерные — каждый элемент массива получает два индекса (пр. [2,3]).

2. Многомерные — каждый элемент получает более 2-х индексов (пр. 1,1,k]).

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

Одномерный массив Двумерный массив Трехмерный массив

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

массив экран клавиатура паскаль

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

Если за каждым элементом массива закреплен только один его порядковый номер, то такой массив называется линейным, или одномерным.

Алгоритмы сортировки одномерных массивов. Сортировка — один из наиболее распространённых процессов современной обработки данных.

Сортировкой называется распределение элементов массива в соответствии с определёнными правилами. Например, сортировка массива по возрастанию или убыванию его элементов. Описание типа линейного массива выглядит так:

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

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

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

1. C помощью служебного слова TYPE описывается тип массива, а затем с помощью VAR вводится переменная этого типа.

Общая форма записи

TYPE <�тип массива> = ARRAY [тип индекса] OF <�тип компонент>;

VAR <�переменная>: <�тип массива>;

2. С помощью слова VAR сразу описывается переменная типа массив.

Общая форма записи

VAR <�переменная>: ARRAY [тип индекса] OF <�тип компонент>;

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

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

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

Var

S, BB: Array [1.40] Of Real;

N: Array ['A'.'Z'] Of Integer;

R: Array [-20.20] Of Word;

T: Array [1.40] Of Real;

Теперь переменные S, BB и T представляют собой массивы из сорока вещественных чисел; массив N имеет индексы символьного типа и целочисленные элементы; массив R может хранить в себе 41 число типа Word.

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

S:=BB;

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

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

Фундаментальное отличие компонента массива от простой переменной состоит в том, что для элемента массива в квадратных скобках может стоять не только непосредственное значение индекса, но и выражение, приводящее к значению индексного типа. Таким образом реализуется косвенная адресация: BB[15] - прямая адресация;

BB[K] - косвенная адресация через переменную K, значение которой будет использовано в качестве индекса элемента массива BB.

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

2.1.2 Двумерные массивы

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

В качестве номера (индекса) элемента массива используется выражение порядкового типа (чаще integer).

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

Например, таблица символов M Ч N, где M — число строк и N — число столбцов, может быть описана:

var TAB: array [1.M, 1. N] of char;

Общая форма записи

VAR <�имя>: ARRAY [тип индекса строки, тип индекса столбца]

OF <�тип компонент>;

Однако двумерный массив можно интерпретировать как вектор-столбец, каждый элемент которого, в свою очередь, является одномерным массивом (вектор-строка). Этот подход к определению двумерного массива влечет его описание с помощью двух строк, где первая содержит описание строки, а вторая — описание столбца:

type LINE = array [1.N] of char;

STOLB = array [1.M] of LINE;

var TAB: STOLB.

Здесь TAB [I] - переменная типа LINE, а TAB [I][J] - переменная типа CHAR.

Общая форма записи

TYPE <�тип строки> = ARRAY [тип индекса] OF <�тип компонент>;

<�тип столбца> = ARRAY [тип индекса] OF <�тип строки>;

VAR <�переменная массива>: <�тип столбца>;

Эти два вида определения массивов задают и два способа обращения к элементам массива: TAB [I, J] - в первом случае и TAB [I][J] - во втором. Вполне очевидно, что сказанное выше для двумерного массива распространяется и на массивы большей размерности. Например, описание VAR CUBE: ARRAY [1.M, 1. N, 1. K] OF INTEGER определяет задание трехмерного массива целых чисел.

А так же двумерным массивом называется таблица, состоящая из строк и столбцов.

А11А12А13… А1m

A21A22A23…А2m

An1An2An3…Anm

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

Способ 1. В разделе описания переменных.

Имя Массива: array [Верх.Гр.1.Ниж.Гр.1,Верх.Гр.2.Ниж.Гр.2] of Тип Элементов;

Способ 2. В разделе описания типов.

Имя Массива: array [Верх.Гр.1.Ниж.Гр.1,Верх.Гр.2.Ниж.Гр.2] of Тип Элементов;

Способ 3. В разделе описания констант.

const

Имя Массива: array[1.3,1.3] of real=((1.2,2.4,0.4),(0.045,-0.47,0.003),(1.24,1,-7.4));

Часто требуется вычислить сумму элементов массива, их среднее арифметическое значение или найти значения и номера максимального и минимального элементов, а также изменить значения элементов массива и т. д. Особенность работы с двумерными массивами заключается в том, что расширяется возможность обработки массива (появились новые элементы: строки, столбцы — являющиеся одномерными массивами). Подробно все действия можно рассмотреть в задачах разобранных в этом разделе.

Квадратная матрица Квадратной называется такая матрица, в которой количество строк равно количеству столбцов. Выделяют следующие элементы квадратной матрицы:

главная диагональ;

побочная диагональ;

элементы, расположенные выше главной диагонали;

элементы, расположенные ниже главной диагонали;

элементы, расположенные выше побочной диагонали;

элементы, расположенные ниже побочной диагонали;

Главная диагональ. Если значения индексов (i, j) элемента равны, то элементы расположены на главной диагонали.

А11А12А13А14

A21A22A23А24

A31A32A33А34

A41A42A43А44

if i=j then <�инструкции>

Побочная диагональ. Если для значений индексов (i, j) элементов выполняется равенство: i+j=n+1, то элементы расположены на побочной диагонали.

А11А12А13А14

A21A22A23А24

A31A32A33А34

A41A42A43А44

if i+j=n+1 then <�инструкции>

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

А11А12А13А14

A21A22A23А24

A31A32A33А34

A41A42A43А44

for i:=1 to n do

for j:=1 to n do

if i < j then <�инструкции>

for i:=1 to n-1 do

for j:=i+1 to n do

<�инструкции>

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

2.1.2 Многомерные массивы

Многомерный массив — это массив массивов, т. е. массив, элементами которого являются массивы. Размерность массива — это количество индексов, используемых для ссылки на конкретный элемент массива. Многомерные массивы объявляются точно так же, как и одномерные, только после имени массива ставится более одной пары квадратных скобок. Пример определения двухмерного массива (матрицы) с 10 строками и 30 столбцами:

int array[10][30];

Фактически двухмерный массив представляется как одномерный, элементы которого тоже массивы. Константное выражение, определяющее одну из размерностей массива, не может принимать нулевое значение:

int mas[0][7]; // ошибка

int mas[l][7]; // правильно Можно инициализировать и многомерные массивы. Причем инициализация происходит построчно, т. е. в порядке возрастания самого правого индекса. Именно в таком порядке элементы многомерных массивов располагаются в памяти компьютера.

Для примера рассмотрим, как будет выполнена инициализация трехмерного массива с восемью элементами:

int array[2][2][2]={23, 54, 16, 43, 82, 12, 9, 75}; Проинициализированный массив будет выглядеть так:

[0][0][0]= =23;

[0][0][1]= =54;

[0][1][0]= =16;

[1][1][0]= =9;

[1][1][1]= =75;

Для наглядности при инициализации двухмерного массива список начальных значений следует оформлять в виде таблицы: int array[3][3]={ 34, 23, 67, 38, 56, 73, 37,94,28};

Многомерные массивы могут инициализироваться и без указания одной (самой левой) из размерностей массива. В этом случае количество элементов компилятор определяет по количеству членов в списке инициализации. Например, для массива array будет получен тот же, что и в предыдущем примере результат: int array[][3]={ 34, 23, 67, 38, 56, 73, 37,94,28};

Если необходимо проинициализировать не все элементы строки, а только несколько первых элементов, то в списке инициализации можно использовать фигурные скобки, охватывающие значения для этой строки. Например, если необходимо для массива array задать начальные значения для элементов array[0][0], array[l][0], array[l][l], array[2][0], array[2][l], array[2][2], то это можно сделать следующим образом: int array[][3]={{0}, {Ю, П}, {21,21,22}}; Здесь переменной int присваивается значение третьего элемента второй строки.

2.2 Описание массивов

Каждый из индексов массива находится в некотором диапазоне (<�нач. элемент>…<�кон. элемент>). Причем конечный элемент больше либо равен начальному элементу. В качестве диапазона можно использовать: Integer, Char, Boolean.

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

Var <�переем. массив>: array[<�диапазон 1>.<�диапазон N>]

Of <�тип переменной>;

Пример: список студентов группы

Var Spisok: array[1.40] String[20];

2.3 Получение элементов массива

Каждый элемент массива — это переменная, которой можно присваивать значения в операторах и функциях. Для того, чтобы указать элемент массива, необходимо записать все его индексы.

<�перем. массив>[<�индекс>,.,<�индекс N>]

Пример:

Spisok[1]: ='Иванов';

2.4 Ввод массива с клавиатуры

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

<�приглашение к вводу массива>;

<�ввод количества элементов массива>;

For i:=1 to <�кол-во элементов> do

Begin

<�приглашение к вводу i-го элемента>;

<�ввод i-го элемента>;

End;

Пример:

WriteLn (`ввод списка студентов');

WriteLn (`введите количество студентов');

ReadLn (kolvo);

For i:=1 to kolvo do

Begin

WriteLn (i,' ');

ReadLn (spisok[i]);

End;

2.5 Вывод массива на экран

Вывод в строку. При выводе массива в строку нужно использовать Write, которая будет находиться в цикле с параметром, а после цикла нужно поставить WriteLn.

Пример:

For i:=1 to kolvo do

Write (spisok[i],' `);

WriteLn;

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

Пример:

For i:=1 to kolvo do

Write (i:2,'. ', spisok[i]);

2.6 Действия с массивами

Над массивами нельзя выполнять арифметические действия (вычитать, складывать и др.). Все действия выполняются поэлементно.

Пример: Написать программу, которая выполняет по элементное суммирование массивов A и B.

Program Summ;

Var A, B Array [1.10] of Integer;

Kolvo:Integer;

C: Array [1.10] of Integer;

i: Integer;

Begin

WriteLn (`введите количество элементов массивов');

ReadLn (Kolvo);

WriteLn (`введите элементы маcсива A');

For i:=1 to Kolvo do

begin

Write (i, `) ');

ReadLn (A[i]);

end;

WriteLn (`введите элементы маcсива B');

For i:=1 to Kolvo do

begin

Write (i, `) ');

ReadLn (B[i]);

end;

For i:=1 to Kolvo do

C[i]: = A[i]+B[i];

For i:=1 to Kolvo do

Writeln (C[i]: 5);

End.

2.7 Сортировка массивов

Задача сортировки (упорядочения) элементов массива в соответствии с их значениями относится к классу классических задач, которые решались еще на первых еmail ах.

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

Различают следующие типы сортировок:

1) по возрастанию

2) по убыванию

3) по не убыванию

4) по не возрастанию При рассмотрении каждого метода будем сортировать элементы по неубыванию.

2.8 Метод простых обменов (Пузырьковая сортировка)

Идея метода: Весь массив рассматривается несколько раз, причем при каждом рассмотрении сравниваются значения 2-х соседних элементов. Если они стоят в неправильном порядке, то производится их перестановка. Так происходит до тех пор, пока не будет выполнено ни одной перестановки. Метод называют пузырьковой сортировкой потому что меньшие значения элементов постепенно «всплывают», как пузырьки воздуха в воде, перемещаясь в начало массива, а «тяжелые» элементы «оседают на дно» .

7 0 -4 3 1 -2 5

— 4 7 0 -2 3 1 5

— 4 -2 7 0 1 3 5

— 4 -2 0 7 1 3 5

— 4 -2 0 1 7 3 5

— 4 -2 0 1 3 7 5

— 4 -2 0 1 3 5 5

Фрагмент:

For i:=2 to n do

For j:=n downto i do

if v[j]

begin

x:=v[j];

v[j]:=v[j-1];

v[j-1]:=x;

end;

2.9 Сортировка простым выбором

Идея метода: весь массив просматривается несколько раз и на каждом шаге ищется минимальный элемент и запоминается его порядковый номер. Затем найденный минимальный элемент меняется значением с первым, вторым, третьим и т. д. предпоследним элементом массива и исключается из рассмотрения

7 0 -4 3 1 -2 5

— 4 0 7 3 1 -2 5

— 4 -2 7 3 1 0 5

— 4 -2 0 3 1 7 5

— 4 -2 0 1 3 7 5

— 4 -2 0 1 3 5 7

For i:= to n do

Begin

min:=v[i];

ind :=i;

for j:= i to n-1 do

if v[j]

bedin

min:=v[j];

ind:=j;

end;

x:=v[i];

v[i]:=v[ind];

v[ind]:=x;

end;

2.10 Сортировка простым включением (Метод вставки и сдвига)

Идея метода: делается предположение, что первые р элементов массива уже упорядочены и рассматривается р+1 элемент. Если окажется, что он меньше чем какой либо из первых р, то он занимает место большего, а участок массива ограниченный его новым местом и старым смещается в право.

7 0 -4 3 1 -2 5

0 7 -4 3 1 -2 5

— 4 0 7 3 1 -2 5

— 4 0 3 7 1 -2 5

— 4 0 1 3 7 -2 5

— 4 -2 0 1 3 7 5

— 4 -2 0 1 3 5 7

For i:=2 to n do

For j:=1 to i-1 do

if v[i]

begin

x:=v[i];

for h:=1 downto j+1 do

v[h]: =i[h-1];

v[j]:=x;

end.

2.11 Параметры массива и параметры строки

Может сложиться впечатление, что объявление переменных в списке формальных параметров подпрограммы ничем не отличается от объявления их в разделе описания переменных. Действительно, в обоих случаях много общего, но есть одно существенное различие: типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Поэтому нельзя, например, объявить следующую процедуру: Procedure S (a: array [1.10] of Real);

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

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

type

atype = array [1.10]of Real;

Procedure S (a: atype);

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

type

intype = String ;

outype = String ;

Function St (s: intype): outype;

Требование описать любой тип-массив или тип-строку перед объявлением подпрограммы на первый взгляд кажется несущественным. Действительно, в рамках простейших вычислительных задач обычно заранее известна структура всех используемых в программе данных, поэтому статическое описание массивов не вызывает проблем. Однако разработка программных средств универсального назначения связана со значительными трудностями. По существу, речь идет о том, что в Турбо Паскале невозможно использовать в подпрограммах массивы с «плавающими» границами изменения индексов. Например, если разработана программа, обрабатывающая матрицу 10×10 элементов, то для обработки матрицы 9×11 элементов необходимо переопределить тип, т. е. перекомпилировать всю программу (речь идет не о динамическом размещении массивов в куче, а о статическом описании массивов и передаче их как параметров в подпрограммы). Этот недостаток, как и отсутствие в языке средств обработки исключительных ситуаций (прерываний), унаследован из стандартного Паскаля и представляет собой объект постоянной и вполне заслуженной его критики. Разработчики Турбо Паскаля не рискнули кардинально изменить свойства базового языка, но, тем не менее, включили в него некоторые средства, позволяющие в известной степени смягчить отмеченные недостатки. Эти недостатки практически полностью устранены в языке Object Pascal, используемом в визуальной среде программирования Delphi.

Прежде всего, в среде Турбо Паскаля можно установить режим компиляции, при котором отключается контроль за совпадением длины фактического и формального параметра-строки. Это позволяет легко решить вопрос о передаче подпрограмме строки произвольной длины. При передаче строки меньшего размера формальный параметр будет иметь ту же длину, что и параметр обращения; передача строки большего размера приведет к ее усечению до максимального размера формального параметра. Следует сказать, что контроль включается только при передаче строки, объявленной как формальный параметр-переменная. Если, соответствующий параметр объявлен параметром-значением, эта опция игнорируется и длина не контролируется.

Значительно сложнее обстоит дело с передачей массивов произвольной длины. Наиболее универсальным приемом в этом случае будет, судя по всему, работа с указателями и использование индексной арифметики. Несколько проще можно решить эту проблему при помощи нетипизированных параметров (см. п. 8.5). В версии Турбо Паскаля 7.0 язык поддерживает так называемые открытые массивы, легко решающие проблему передачи подпрограмме одномерных массивов переменной длины.

Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не определяющий его размерности и границы: Procedure MyProc (OpenArray: array of Integer);

Внутри подпрограммы такой параметр трактуется как одномерный массив с нулевой нижней границей. Верхняя граница открытого массива возвращается функцией HIGH, упоминавшейся в п. 4.1.1. Используя 0 как минимальный индекс и значение, возвращаемое функцией HIGH, как максимальный индекс, подпрограмма может обрабатывать одномерные массивы произвольной длины:

{Иллюстрация использования открытых массивов: программа выводит на экран содержимое двух одномерных массивов разной длины с помощью одной процедуры ArrayPrint}

Procedure ArrayPrint (aArray: array of Integer);

var

k: Integer;

begin

for k := 0 to High (aArray) do

Write (aArray[k]: 8);

WriteLn

end;

const

A:array [-1.2] of Integer = (0,1,2,3);

B: array [5.7] of Integer = (4,5,6);

begin

ArrayPrint (A);

ArrayPrint (B)

end.

Как видно из этого примера, фактические границы массивов, А и В, передаваемых в качестве параметров вызова процедуре ArrayPrint, не имеют значения. Однако размерность открытых массивов (количество индексов) всегда равна 1 — за этим следит компилятор. Если бы, например, мы добавили в программу двумерный массив С

var

С: array [1.3,1.5] of Integer;

то обращение

ArrayPrint (С)

вызывало бы сообщение об ошибке

Error26: Type mismatch.

(Ошибка 26: Несоответствие типов.)

2.12 Действия над массивами

Для работы с массивом как единым целым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения «равно», «не равно» и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т. е. иметь одинаковые типы индексов и одинаковые типы компонентов.

Например, если массивы, А и В описаны как var А, В: array[1.20] of real; то применение к ним допустимых операций даст следующий результат:

Действия над элементами массива.

После объявления массива каждый его элемент можно обработать, указав идентификатор (имя) массива и индекс элемента в квадратных скобках. Например, запись Mas[2], VectorZ[10] позволяет обратиться ко второму элементу массива Mas и десятому элементу массива VectorZ.

При работе с двумерным массивом указываются два индекса, с n-мерным массивом — n индексов. Например, запись MatrU[4,4] делает доступным для обработки значение элемента, находящегося в четвертой строке четвертого столбца массива MatrU.

Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах for, while, repeat, входить в качестве параметров в операторы Read, Readln, Write, Writeln; им можно присваивать любые значения, соответствующие их типу.

2.13 Пример решения задачи с использованием массивов Паскаля

1. Даны два nмерных вектора. Найти сумму этих векторов.

Решение задачи:

· Входными данными в этой задаче будут являться два одномерных массива. Размер этих массивов может быть произвольным, но определенным. Т. е. мы можем описать заведомо большой массив, а в программе определить, сколько элементов реально будет использоваться. Элементы этих массивов могут быть целочисленными. Тогда описание будет выглядеть следующим образом: var a, b: array [1.100] of integer ;

· Выходными данными будут элементы результирующего массива, назовем его c. Тип результирующего массива также должен быть целочисленным.

· Кроме трех массивов нам потребуется переменная — параметр цикла и индекс массива, назовем ее i, а также переменная n для определения количества элементов в каждом массиве.

Ход решения задачи:

· определим количество элементов (размерность) массивов, введем значение n;

· введем массив a;

· введем массив b;

· в цикле, перебирая значения индекса i от 1 до n, вычислим последовательно значения элементов массива c по формуле: c [ i ]= a [ i ]+ b [ i ];

· выведем на экран полученный массив.

Текст программы:

Program summa;

Var

a, b, c: array [1.100] of integer;

I, n: byte;

Begin

Write (`с');

Readln (n);

For i:=1 to n do

Readln (a[i]);

For i:=1 to n do

Readln (b[i]);

For i:=1 to n do

C[i]: =a[i]+b[i]; }

For i:=1 to n do

write (c[i],' `);

end.

2. Пример программы с ошибкой массива Паскаля

Program primer _ error ;

Type

vector=array [1.80] of word;

var

n: integer;

a: vector;

begin

n:=45;

a[n*2]: =25;

end.

Хотя данная программа полностью соответствует синтаксису языка, и транслятор «пропустит» ее, на стадии выполнения произойдет ошибка выхода за пределы массива Паскаля. При n =45 выражение n *2=90, компьютер сделает попытку обратиться к элементу массива a [90], но такого элемента нет, поскольку описан массив размерностью 80.

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

Из всего этого следует сделать вывод: программисту надо быть очень аккуратным при работе с индексами массива.

Заключение

Итак, мы изучили раздел «Массивы» и узнали что массив — это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти. Узнали, что массивы бывают следующих видов: одномерные, двухмерные и многомерные. Чтобы составить массив необходимо задать типы его индексов и компоненты. Эти типы данных массивов позволяет одному идентификатору задать несколько значений, которые отличаются порядковым номером. Номер элемента массива указывается после идентификатора в квадратных скобках {M[5] - пятый элемент массива М}. При описании массива указывается диапазон номеров элементов массива и тип, к которому относится каждый его элемент. Единственным действием, которое возможно произвести с массивом целиком это присваивание. Однако, присваивать можно только массивы одинаковых типов. В языке Паскаль тип массива задается с использованием специального слова array

Каждый элемент массива — это переменная, которой можно присваивать значения в операторах и функциях. Для того, чтобы указать элемент массива, необходимо записать все его индексы. После объявления массива каждый его элемент можно обработать, указав идентификатор (имя) массива и индекс элемента в квадратных скобках. Массив в языке Паскаль это сложный тип данных, поэтому чаще всего его описывают в разделе переменных. Массив нельзя ввести с клавиатуры одной командой, для этого организовывается цикл с параметром. При выводе массива в строку нужно использовать Write, которая будет находиться в цикле с параметром, а после цикла нужно поставить WriteLn. Над массивами нельзя выполнять арифметические действия (вычитать, складывать и др.). Все действия при составлении массива нужно выполнять поэлементно.

1. В. В. Фаронов, Turbo Pascal в подлиннике, «BHV-Санкт-Петербург», 2004. 1056 стр.

2. С. А. Немнюгин, Turbo Pascal. Программирование на языке высокого уровня: Учебник для вузов, 2-е издание, «Питер», 2005. — 544 стр.

3. С. А. Немнюгин, Turbo Pascal: Практикум, 2-е издание, «Питер», 2004. — 272 стр.

4. Т. А. Павловская, Паскаль. Программирование на языке высокого уровня: Учебник для вузов, «Питер», 2004. — 400 стр.

5. В. И. Грызлов, Т. П. Грызлова, Турбо Паскаль 7.0. Учебный курс, «Питер», 2004. — 416 стр.

6. В. Кораблев, Турбо Паскаль 7.0. Самоучитель, 16-е издание, «Питер», 2004. — 480 стр.

7. Демичев Е. М. Основы программирования. 2005

8. Стивен Прата. Язык программирования Паскаль. 2006

9. Мильвидский А. М.

Введение

в Java. 1998

10. М. Плискин Эволюция языков программирования, 2002

11. Мясников В. А., Майоров С. А. ЭВМ для всех. 1985

12. Львовский М. Б. Методическое пособие «BOOK» по информатике для 9−11 классов.

13. Поляков Д. Б., Круглое И. Ю. Программирование в среде Турбо Паскаль: М., 1992.

14. Хершель Р. Турбо Паскаль. Вологда, 1991.

15. Перминов О. Н., Программирование на языке Паскаль. М. 1988.

16. Сергиевский М. В., ШалашовА. В., Турбо Паскаль 7.0. М. 1994.

17. Белецкий Я. Турбо Паскаль с графикой для персональных компьютеров.

18. Абрамов В. Г.

Введение

в язык Паскаль, М, Наука, 1988

19. Аубакиров Г. Д., Хмыров А. Г. Языки программирования Pascal, Delphi, Астана: Фолиант, 2007;208 с.

20. Дузелбаев С. Т., Омарбекова А. С., Шарипбаева А. А., Юсубекова С. О. Основы алгоритмизации и программирования, Астана, Фолиант, 2008

21. Карпиленко Е. В., Основы программирования, Ростов н/Д, Феникс, 2007.

22. Адрес:

1. http://markbook.chat.ru

2. www. strana-sovetov.com

3. www.twirpx.com

4. www.knowledge.

5. www.cyberforum.ru

Приложение

Массив — это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти.

Type < имя _ типа >= array [ I ] of T;

Одномерный массив Двумерный массив Трехмерный массив

Одномерные — каждый элемент массива получает два индекса (пр. [2,3]).

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

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

Индекс — это переменная типа INTEGER.

Многомерный массив — это массив массивов, т. е. массив, элементами которого являются массивы.

Var <�переем. массив>: array[<�диапазон 1>.<�диапазон N>]

Of <�тип переменной>;

Сортировкой называется распределение элементов массива в соответствии с определёнными правилами.

Размерность массива — это количество индексов, которые нужно указать для доступа к элементу массива.

Элемент массива — это переменная, которой можно присваивать значения в операторах и функциях.

Показать весь текст
Заполнить форму текущей работой