Программирование. Одномерные массивы Pascal-Паскаль

  • Скачено бесплатно: 6937
  • Куплено: 414
  • Pascal-Паскаль->Программирование. Одномерные массивы Pascal-Паскаль

Понятие структуры

До сих пор мы работали с простыми типами данных – логический ( boolean ), целый ( integer , word , byte , longint ), вещественный ( real ), символьный ( char ). Любой алгоритм можно запрограммировать с помощью этих четырех базовых типов. Но для обработки информации о многообразном реальном мире требуются данные, имеющие более сложное строение. Такие сложные конструкции, основанные на простейших скалярных типах, называются структурами. Структура – некоторый составной тип данных, составленный из базовых скалярных. Если структура не изменяет своего строения на протяжении всего выполнения программы, в которой она описана, то такую структуру называют статической.

Массив – однородная совокупность элементов

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

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

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

Индекс массива

Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип ( integer , word или byte ), но может быть и логический и символьный.

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

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

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

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

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

Вот, например, объявление двух типов: vector в виде массива Паскаля из 10 целых чисел и stroka в виде массива из 256 символов:

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

Опишем переменные типа vector и stroka :

далее в программе мы можем обращаться к отдельным элементам массива a или c . Например, a [5]:=23; c [1]:=’ w ‘; a [7]:= a [5]*2; writeln ( c [1], c [3]).

Вычисление индекса массива Паскаля

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

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

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

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

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

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

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

Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных как массив Паскаля. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,

то можно переменной a присвоить значение переменной b ( a := b ). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно (это важно!).

Ввод массива Паскаля

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

Пример фрагмента программы ввода массива Паскаля

Рассмотрим теперь случай, когда массив Паскаля заполняется автоматически случайными числами, для этого будем использовать функцию random ( N ).

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

Вывод массива Паскаля

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

Пример фрагмента программы вывода массива Паскаля

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

Пример программы вывода массива Паскаля в столбик

На экране мы увидим, к примеру, следующие значения:

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

Задача: даны два n -мерных вектора. Найти сумму этих векторов.

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

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

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

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

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

Пример программы суммирования векторов

Программирование

Исходники Pascal (127)

Справочник

Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту

Ввод и вывод массивов осуществляется поэлементно.

Введем одномерный массив Х, состоящий из 30 элементов, то есть необходимо ввести некую последовательность элементов Х1, Х2, …, Х30.

Пусть iиндекс (порядковый номер) элемента в массиве Х. Тогда

Для ввода массива можно использовать любой цикл.

Первый вариант: ввод массива с использованием цикла с предусловием (Рисунок 1).

Program Primer_1;

Var i: integer;

X: array [1..30] of Integer;

Begin

While i 30;

End.

Массив X введен с использованием цикла с постусловием.

Третий вариант: ввод массива с использованием цикла с параметром (Рисунок 3).

Program Primer_3;

Vari: integer;

X: array [1..30] of Integer;

Begin

For i := 1 To 30 Do Read (X[i]);

End.

Массив вводится с помощью цикла с параметром, где в качестве параметра используется индекс элемента массива (i).

Вывод одномерного массива осуществляется аналогично.

В программе вместо операторов Read или Readln используются операторы Write или Writeln. Но просто заменить одни операторы на другие здесь недостаточно. Для того чтобы выводимые значения не сливались между собой, надо явным образом вставлять между ними разделитель – пробел или перевод строки. Приведем два возможных способа вывода массива:

  • For i := 1 To n Do Write (X[i],’ ‘);
  • For i := 1 To n Do Writeln (x[i]).

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

Например, выведем одномерный массив Х1, Х2, …, Хn, состоящий из элементов вещественного типа, используя цикл с параметром (Рисунок 4):

Program Primer_4;

Const n = 30;

Var i: Integer;

X: Array [1..n] Of Real;

Begin

For i:= 1 To n Do Write (X[i] : 6 : 2, ‘ ‘);

End.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: При сдаче лабораторной работы, студент делает вид, что все знает; преподаватель делает вид, что верит ему. 9364 — | 7302 — или читать все.

78.85.5.224 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

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

Массив описывается в разделе varоператором следующего вида:

Var ИмяМассива: array [НижнийИндекс .. ВерхнийИндекс] of Тип;

НижнийИндекс– целочисленный номер 1-го элемента массива,

..– оператор диапазона Паскаля (именнодветочки!);

ВерхнийИндекс– целочисленный номер последнего элемента,

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

Var a: array [1..20] of integer;

Здесь мы описали массив с именем A, состоящий из 20 целочисленных элементов;

Var x,y : array [1..10] of real;

Описаны 2 массива с именами xиy, содержащие по 10 вещественных элементов;

Var t : array [0..9] of String;

Массив tсостоит из 10 строк, которые занумерованы с нуля.

Таким образом, размерность(число элементов) массива вычисляется как

ВерхнийИндекс – НижнийИндекс + 1

Для обращения к отдельному элементу массиваиспользуется оператор вида

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

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

Как правило, ввод, обработка и вывод массива осуществляются поэлементно, с использованием цикла for

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

Var a: array [1..n] of real;

Writeln (‘Введите элементы массива’);

For i:=1 to n do read (A[i]);

Размерность массива определена константой n, элементы вводятся по одному в циклеfor– при запуске этой программы пользователю придется ввести 10 числовых значений. При решении учебных задач вводить массивы "вручную", особенно если их размерность велика, не всегда удобно. Существуют, как минимум, два альтернативных решения:

Описание массива константудобно, если элементы массива не должны изменяться в процессе выполнения программы. Как и другие константы, массивы констант описываются в разделеconst, приведем пример такого описания:

const a:array [1..5] of real=(

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

Формирование массива из случайных значенийуместно, если при решении задачи массив служит лишь для иллюстрации того или иного алгоритма, а конкретные значения элементов несущественны. Для того, чтобы получить очередное случайное значение, используется стандартная функцияRandom(N), где параметромNпередается целое или вещественное число. Она вернет случайное число того же типа, что тип аргумента и лежащее в диапазоне от0доN-1включительно. Например, оператор видаa[1]:=Random(100);запишет вa[1]случайное число из диапазона [0,99].

Для того, чтобы при каждом запуске программы цепочка случайных чисел была новой, перед первым вызовом Randomследует вызвать стандартную процедуруRandomize;,запускающую генератор случайных чисел. Приведем пример заполнения массива из 20 элементов случайными числами, лежащими в диапазоне от -10 до 10:

var a:array [1..20] of integer;

for i:=1 to 20 do begin

Еще более удобный путь – чтение элементов массива из текстового или двоичного файла. Об этом рассказывается в главах 21 и 22.

Обработка массива(в данном случае, вычисляется суммаsего положительных элементов)

Var b:array [1..5] of real;

Writeln (‘Введите 5 элементов массива’);

for i:=1 to 5 do read (b[i]);

for i:=1 to 5 do if b[i]>0 then s:=s+b[i];

Как видно из этого примера, к массивам применимы все типовые алгоритмы, изученные в теме "Циклы".

For i:=1 to 5 do write (b[i]:6:2);

Здесь 5 элементов массива bнапечатаны в одну строку. Для вывода одного элемента на одной строке можно было бы использовать операторwritelnвместоwrite

Если обработка массива осуществляется последовательно, по 1 элементу, циклы ввода и обработки зачастую можно объединить.

Пр. Найти арифметическое среднее элементов вещественного массиваtразмерностью 6 и значение его минимального элемента.

Var b:array [1..6] of real;

writeln (‘Ввод B[6]’);

for i:=1 to 6 do begin

if b[i] 0 then begin

For i:=-5 to 5 do begin

if abs(t[i]-s) max then begin

Writeln (‘Номер точки=’,num, ‘ расстояние=’,dist:8:2);

For i:=1 to 9 do begin

Writeln (‘Длина ломаной=’,len:8:2);

Пр. Задача формирования массива по правилу:

Задан массив Xиз 8 элементов. Сформировать массивYпо правилу

Y[i]= 4X[i], еслиI– четное

Cos2X[i], еслиI– нечетное

и найти количество его положительных элементов.

Var x,y: array [1..8] of real;

Writeln (‘Введите массив X из 8 элементов’);