Pascal-Паскаль
Программирование. Одномерные массивы Pascal-Паскаль
Программирование. Одномерные массивы Pascal-Паскаль
Понятие структуры
Массив – однородная совокупность элементов
Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.
Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Что это значит? Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).
Индекс массива
Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:
где I – тип индекса массива, T – тип его элементов.
Можно описывать сразу переменные типа массив, т.е. в разделе описания переменных:
При этом длину массива Паскаля характеризует выражение:
Вот, например, объявление двух типов: vector в виде массива Паскаля из 10 целых чисел и stroka в виде массива из 256 символов:
С помощью индекса массива можно обращаться к отдельным элементам любого массива, как к обычной переменной: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях.
Опишем переменные типа vector и stroka :
Вычисление индекса массива Паскаля
Индекс массива в Паскале не обязательно задавать в явном виде. В качестве индекса массива можно использовать переменную или выражение, соответствующее индексному типу. Иначе говоря, индексы можно вычислять.
Этот механизм – весьма мощное средство программирования. Но он порождает распространенную ошибку: результат вычислений может оказаться за пределами интервала допустимых значений индекса, то есть будет произведена попытка обратиться к элементу, которого не существует. Эта типичная ошибка называется «выход за пределы массива».
Пример программы с ошибкой массива Паскаля
Хотя данная программа полностью соответствует синтаксису языка, и транслятор «пропустит» ее, на стадии выполнения произойдет ошибка выхода за пределы массива Паскаля. При n =45 выражение n *2=90, компьютер сделает попытку обратиться к элементу массива a [90], но такого элемента нет, поскольку описан массив размерностью 80.
Будем считать, что хорошая программа должна выдавать предупреждающее сообщение в случае попытки обращения к несуществующим элементам массива. Не лишним будет проверять возможный выход как за правую, так и за левую границы массива, ведь не исключено, что в результате вычисления значения выражения получится число, находящееся левее границы массива Паскаля.
Из всего этого следует сделать вывод: программисту надо быть очень аккуратным при работе с индексами массива.
Основные действия с массивами Паскаля
Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных как массив Паскаля. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,
то можно переменной a присвоить значение переменной b ( a := b ). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно (это важно!).
Ввод массива Паскаля
Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, т.е. простой арифметический цикл, где параметром цикла будет выступать переменная – индекс массива Паскаля. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.
Пример фрагмента программы ввода массива Паскаля
Рассмотрим теперь случай, когда массив Паскаля заполняется автоматически случайными числами, для этого будем использовать функцию random ( N ).
Пример фрагмента программы заполнения массива Паскаля случайными числами
Вывод массива Паскаля
Вывод массива в Паскале осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.
Пример фрагмента программы вывода массива Паскаля
Вывод можно осуществить и в столбик с указанием соответствующего индекса. Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т.е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана.
Пример программы вывода массива Паскаля в столбик
На экране мы увидим, к примеру, следующие значения:
Пример решения задачи с использованием массивов Паскаля
Решение задачи:
Ход решения задачи:
Текст программы :
Пример программы суммирования векторов
Программирование
Исходники Pascal (127)
Справочник
Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту
Как пишется массив в паскале
Для обозначения компонент массива используется имя переменной-массива и так называемые индексы, которые обычно указывают желаемый элемент. Тип индекса может быть только порядковым (кроме longint). Чаще всего используется интервальный тип (диапазон).
Описание типа массива задается следующим образом:
Вводить и выводить массивы можно только поэлементно.
Пример 1. Ввод и вывод одномерного массива.
Определить переменную как массив можно и непосредственно при ее описании, без предварительного описания типа массива, например:
Если массивы a и b описаны как:
то переменные a и b считаются разных типов. Для обеспечения совместимости применяйте описание переменных через предварительное описание типа.
Если типы массивов идентичны, то в программе один массив может быть присвоен другому. В этом случае значения всех переменных одного массива будет присвоены соответствующим элементам второго массива.
Вместе с тем, над массивами не определены операции отношения. Сравнивать два массива можно только поэлементно.
Такую запись можно заменить более компактной:
Таким образом возникает понятие многомерного массива. Глубина вложенности массивов произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничена, однако не может быть более 65520 байт.
Работа с многомерными массивами почти всегда связана с организацией вложенных циклов. Так, чтобы заполнить двумерный массив (матрицу) случайными числами, используют конструкцию вида:
Для «красивого» вывода матрицы на экран используйте такой цикл:
Волгоградский государственный педагогический университет
Кафедра алгебры, геометрии и информатики
Массивы в Паскале. Одномерные массивы
Предположим, что программа работает с большим количеством однотипных данных. Скажем около ста разных целых чисел нужно обработать, выполнив над ними те или иные вычисления. Как вы себе представляете 100 переменных в программе? И для каждой переменной нужно написать одно и тоже выражение вычисления значения? Это очень неэффективно.
Есть более простое решение. Это использование такой структуры (типа) данных как массив. Массив представляет собой последовательность ячеек памяти, в которых хранятся однотипные данные. При этом существует всего одно имя переменной связанной с массивом, а обращение к конкретной ячейке происходит по ее индексу (номеру) в массиве.
Нужно четко понимать, что индекс ячейки массива не является ее содержимым. Содержимым являются хранимые в ячейках данные, а индексы только указывают на них. Действия в программе над массивом осуществляются путем использования имени переменной, связанной с областью данных, отведенной под массив.
Итак, массив – это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти. Каждая ячейка содержит элемент массива. Элементы нумеруются по порядку, но необязательно начиная с единицы (хотя в языке программирования Pascal чаще всего именно с нее). Порядковый номер элемента массива называется индексом этого элемента.
Индексы элементов массива обычно целые числа, однако могут быть и символами, а также описываться другими порядковыми типами. Т.е. для индекса можно использовать тип, в котором определена дискретная последовательность значений, и все эти значения можно пересчитать по порядку. Индексировать можно как константами и переменными, так и выражениями, результат вычисления которых дает значение перечислимого типа.
Если индекс массива может приобретать все допустимые значения определенного перечислимого типа, то при описании массива возможно задание имени типа вместо границ изменения индекса. При этом границами индекса будут первое и последнее значения в описании типа индекса. Границы изменения индексов могут задаваться с помощью ранее объявленных констант. Рекомендуется предварительно объявлять тип массива в разделе описания типов.
Массив можно создать несколькими способами.
Обращение к определенному элементу массива осуществляется путем указания имени переменной массива и в квадратных скобках индекса элемента.
В примере выделяется область памяти под массив из 11 символов. Их индексы от 1 до 11. В процессе выполнения программы пользователь вводит 11 любых символов (например, ‘q’, ’w’, ’e’, ’2’, ’t’, ’9’, ’u’, ’I’, ’I’, ’o’, ’p’), которые записываются в ячейки массива. Текущее значение переменной i в цикле for используется в качестве индекса массива. Второй цикл for отвечает за вывод элементов массива на экран.
Массивы в PascalABC.NET
В PascalABC.NET рекомендуется использовать динамические массивы. В отличие от статических, они имеют огромное количество методов и операций, просты в создании, заполнении и выводе.
Описание и выделение памяти
Динамический массив описывается так:
Память под динамический массив a выделяется в момент работы программы:
Индексация в динамических массивах и использование статических массивов
Простейшее заполнение
Важную роль играют функции заполнения динамических массивов. Перед заполнением они выделяют для массива память, поэтому в одной строке можно совмещать описание, выделение памяти и заполнение.
Заполнение диапазоном целых или символьных значений делается с использованием функции Arr:
Заполнение определённым значением осуществляется с помощью операции умножения массива на число:
Для заполнения можно также использовать функцию ArrFill:
Для заполнения массива случайными значениями следует использовать
Не рекомендуется использовать алгоритм для заполнения массива случайными в каждой задаче:
Ввод и вывод элементов массива
Для ввода элементов массива базовых типов используются функции
Стандартная процедура вывода Write или Print выводит значения в массиве в квадратных скобках черезх запятую:
Однако лучше всего для вывода воспользоваться методом Print, выводящим все значения в массиве через пробел:
Не рекомендуется вводить и выводить элементы массива в цикле
Циклы по массиву
Для обработки элементов массива используются следующие циклы:
Пример. Найти количество чётных элементов, стоящих на чётных местах
Методы массива
Массивы содержат большое количество стандартных методов:
Кроме того, доступны процедуры
Методика. Обращаем внимание, что в методических целях естественно рассказывать, как эти алгоритмы устроены “внутри”. Но потом следует пользоваться стандартными алгоритмами, а не заставлять учеников во всех задачах использовать рукописные сортировки или рукописный поиск минимума. Например, рекомендуется показать, как накопить сумму элементов массива:
Здесь следует обратить внимание, что этот алгоритм может быть легко модифицирован в алгоритм нахождения суммы элементов по условию: например, всех чётных элементов:
Если условие надо накладывать на индексы, то в этом случае (и только в этом случае) следует использовать цикл for по индексам:
Для нахождения суммы без условия необходимо использовать стандартный метод a.Sum:
Отметим также, что для поиска суммы по условию также имеется короткая однострочная запись. Она требует использование стандартного метода Where с параметром, являющимся лямбда-выражением. Лямбда-выражения мы будем рассматривать далее:
Методика. Поскольку данная запись использована здесь впервые, обращаем внимание на её высокую универсальность: алгоритмы фильтрации и поиска суммы не слиты в один алгоритм, а используются порознь один за другим, что позволяет:
Далее лямбда-выражения объясняются подробно и тщательно и используются повсеместно.
Операции с массивами
Изменение размера динамического массива
Для первоначального заполнения списков List используется короткая фунеция Lst:
Большинство методов, которые имеются в массивах, есть и в списках List. Поэтому выбор типа List или array of для контейнера при решении задач определяется тем, будет ли данный контейнер расширяться по ходу работы программы.
Pascal: Занятие № 5. Одномерные массивы в Паскале
Одномерные массивы в Паскале
Объявление массива
Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:
Объявить размер можно через константу:
Инициализация массива
Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:
const a:array[1..4] of integer = (1, 3, 2, 5);
Заполнение последовательными числами:
var a: array of integer; var n:=readInteger; a:=new integer[n];
var a: array of integer; var n:=readInteger; SetLength(a,n); // устанавливаем размер
begin var a: array of integer; a := new integer[3]; a[0] := 5; a[1] := 2; a[2] := 3; end.
begin var a: array of integer; a := new integer[3](5,2,3); print(a) end.
Ввод с клавиатуры:
var a:=ReadArrInteger(5); // целые var a:=ReadArrReal(5); // вещественные
Вывод элементов массива
var a: array[1..5] of integer; <массив из пяти элементов>i: integer; begin a[1]:=2; a[2]:=4; a[3]:=8; a[4]:=6; a[5]:=3; writeln(‘Массив A:’); for i := 1 to 5 do write(a[i]:2); <вывод элементов массива>end.
Для работы с массивами чаще всего используется в Паскале цикл for с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.
[Название файла: taskArray0.pas ]
В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.
for var i:=0 to a.Length-1 do a[i] += 1;
Проход по элементам (только для чтения):
Пример:
foreach var x in a do Print(x)
Функция Random в Pascal
Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:
var f: array[1..10] of integer; i:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); < интервал [0,9] >write(f[i],’ ‘); end; end.
Для вещественных чисел в интервале [0,1]:
или с дополнительными параметрами (диапазон [5;15]):
[Название файла: taskArray1.pas ]
Числа Фибоначчи в Паскале
Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.
Получили формулу элементов ряда.
var i:integer; f:array[0..19]of integer; begin f[0]:=1; f[1]:=1; for i:=2 to 19 do begin f[i]:=f[i-1]+f[i-2]; writeln(f[i]) end; end.
[Название файла: taskArray2.pas ]
Максимальный (минимальный) элемент массива
Поиск максимального элемента по его индексу:
// … var (min, minind) := (a[0], 0); for var i:=1 to a.Length-1 do if a[i]
[Название файла: taskArray_min.pas ]
[Название файла: taskArray4.pas ]
[Название файла: taskArray5.pas ]
[Название файла: taskArray6.pas ]
Пример:
[Название файла: taskArray7.pas ]
Поиск в массиве
Рассмотрим сложный пример работы с одномерными массивами:
Для решения поставленной задачи понадобится оператор break — выход из цикла.
Решение Вариант 1. Цикл for:
var f: array[1..10] of integer; flag:boolean; i,c:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); write(f[i],’ ‘); end; flag:=false; writeln(‘введите образец’); readln(c); for i:=1 to 10 do if f[i]=c then begin writeln(‘найден’); flag:=true; break; end; if flag=false then writeln(‘не найден’); end.
begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.IndexOf(3)) // 1 end.
или метод a.Contains(x) наравне с x in a :
begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.Contains(3)); // True print(3 in a)// True end.
Рассмотрим эффективное решение:
Алгоритм:
решение на Паскале Вариант 2. Цикл While:
Поиск элемента в массиве
Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):
Пример:
[Название файла: taskArray8.pas ]
Циклический сдвиг
Решение:
Программа:
// … var v := a[0]; for var i:=0 to a.Length-2 do a[i] := a[i+1]; a[a.Length-1] := v;
// … var v := a[a.Length-1]; for var i:=a.Length-1 downto 1 do a[i] := a[i-1]; a[0] := v;
[Название файла: taskArray9.pas ]
Перестановка элементов в массиве
Рассмотрим, как происходит перестановка или реверс массива.
Решение:
Псевдокод:
Программа:
Решение 2 (стандартная процедура Reverse() ):
begin var a:=new integer[10]; a:=arrRandomInteger(10); print(a);// [41,81,84,63,12,26,88,25,36,72] Reverse(a); print(a) //[72,36,25,88,26,12,63,84,81,41] end.
[Название файла: taskArray10.pas ]
Выбор элементов и сохранение в другой массив
Решение:
Вывод массива B:
writeln(‘Выбранные элементы’); for i:=1 to count-1 do write(B[i], ‘ ‘)
[Название файла: taskArray11.pas ]
Сортировка элементов массива
Pascal | PascalABC.NET |
Pascal | PascalABC.NET |