Массив — структурированный тип данных, состоящий из некоторого числа элементов одного типа.
- Как описать массив в программе?
- Как инициализировать массив, то есть как задать начальные значения его элементов?
- Как организовать доступ к элементам массива?
- Как организовать массивы с размерностью более одной?
- Как организовать выполнение типовых операций с массивами?
Специальных средств описания массивов в программах ассемблера, конечно, нет. При необходимости использовать массив в программе его нужно моделировать одним из следующих способов:
1) Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми. К примеру:
;массив из 5 элементов.Размер каждого
элемента 4 байта:
mas dd 1,2,3,4,5
2) Используя оператор повторения dup. К примеру:
;массив из 5 нулевых элементов.
;Размер каждого элемента 2 байта:
mas dw 5 dup (0)
ИНФОРМАТИКА 9 класс: Массивы в Паскале | Одномерные массивы. Описание, заполнение вывод массива
Такой способ определения используется для резервирования памяти с целью размещения и инициализации элементов массива.
3) Используя директивы label и rept . Пара этих директив может облегчить описание больших массивов в памяти и повысить наглядность такого описания. Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm . К примеру, определим массив байт в области памяти, обозначенной идентификатором mas_b. В данном случае директива label определяет символическое имя mas_b, аналогично тому, как это делают директивы резервирования и инициализации памяти. Достоинство директивы label в том, что она не резервирует память, а лишь определяет характеристики объекта. В данном случае объект — это ячейка памяти. Используя несколько директив label, записанных одна за другой, можно присвоить одной и той же области памяти разные имена и разный тип, что и сделано в следующем фрагменте:
.
n=0
.
mas_b label byte
mas_w label word
rept 4
dw 0f1f0h
endm
В результате в памяти будет создана последовательность из четырех слов f1f0. Эту последовательность можно трактовать как массив байт или слов в зависимости от того, какое имя области мы будем использовать в программе — mas_b или mas_w.
4) Использование цикла для инициализации значениями области памяти, которую можно будет впоследствии трактовать как массив.
Посмотрим на примере, каким образом это делается.
Доступ к элементам массива
При работе с массивами необходимо четко представлять себе, что все элементы массива располагаются в памяти компьютера последовательно.
Само по себе такое расположение ничего не говорит о назначении и порядке использования этих элементов. И только лишь программист с помощью составленного им алгоритма обработки определяет, как нужно трактовать эту последовательность байт, составляющих массив.
Так, одну и ту же область памяти можно трактовать как одномерный массив, и одновременно те же самые данные могут трактоваться как двухмерный массив. Все зависит только от алгоритма обработки этих данных в конкретной программе. Сами по себе данные не несут никакой информации о своем “смысловом”, или логическом, типе. Помните об этом принципиальном моменте.
Паскаль с нуля [ч7]. Одномерные массивы.
Эти же соображения можно распространить и на индексы элементов массива. Ассемблер не подозревает об их существовании и ему абсолютно все равно, каковы их численные смысловые значения.
Для того чтобы локализовать определенный элемент массива, к его имени нужно добавить индекс. Так как мы моделируем массив, то должны позаботиться и о моделировании индекса. В языке ассемблера индексы массивов — это обычные адреса, но с ними работают особым образом. Другими словами, когда при программировании на ассемблере мы говорим об индексе, то скорее подразумеваем под этим не номер элемента в массиве, а некоторый адрес.
Давайте еще раз обратимся к описанию массива. К примеру, в программе статически определена последовательность данных:
dim dw 0011h,2233h,4455h,6677h,8899h
Пусть эта последовательность чисел трактуется как одномерный массив. Размерность каждого элемента определяется директивой dw , то есть она равна 2 байта . Чтобы получить доступ к числу 6677h, нужно к адресу массива прибавить 6. Нумерация элементов массива в ассемблере начинается с нуля.
В общем случае для получения адреса элемента в массиве необходимо начальный (базовый) адрес массива сложить с произведением индекса этого элемента на размер элемента массива:
база + (индекс*размер элемента)
Архитектура микропроцессора предоставляет достаточно удобные программно-аппаратные средства для работы с массивами. К ним относятся базовые и индексные регистры, позволяющие реализовать несколько режимов адресации данных. Используя данные режимы адресации, можно организовать эффективную работу с массивами в памяти.
Для более глубокого понимания можно помедитировать на эту програмку:
Эта программа ни чего не выводит на экран. Предназначена просто для медитации на нее под отладчиком. Внимание. При отладке, чтобы увидеть работу цикла, на команде loop go, нужно нажимать клавишу F7.
Зарисовка из медитации на эту прогу:
Двухмерные массивы
С представлением одномерных массивов в программе на ассемблере и организацией их обработки все достаточно просто. А как быть если программа должна обрабатывать двухмерный массив? Все проблемы возникают по-прежнему из-за того, что специальных средств для описания такого типа данных в ассемблере нет. Двухмерный массив нужно моделировать. На описании самих данных это почти никак не отражается — память под массив выделяется с помощью директив резервирования и инициализации памяти.
Непосредственно моделирование обработки массива производится в сегменте кода, где программист, описывая алгоритм обработки ассемблеру, определяет, что некоторую область памяти необходимо трактовать как двухмерный массив.
При этом вы вольны в выборе того, как понимать расположение элементов двухмерного массива в памяти: по строкам или по столбцам.
Если последовательность однотипных элементов в памяти трактуется как двухмерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле
(база + количество_элементов_в_строке * размер_элемента * i+j)
Здесь i = 0. n–1 указывает номер строки, а j = 0. m–1 указывает номер столбца.
Например, пусть имеется массив чисел (размером в 1 байт) mas(i, j) с размерностью 4 на 4
(i= 0. 3, j = 0. 3):
23 04 05 67
05 06 07 99
67 08 09 23
87 09 00 08
В памяти элементы этого массива будут расположены в следующей последовательности:
23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08
Если мы хотим трактовать эту последовательность как двухмерный массив, приведенный выше, и извлечь, например, элемент
mas(2, 3) = 23, то проведя нехитрый подсчет, убедимся в правильности наших рассуждений:
Эффективный адрес mas(2, 3) = mas + 4 * 1 * 2 + 3 = mas + 11
Посмотрите на представление массива в памяти и убедитесь, что по этому смещению действительно находится нужный элемент массива. Прога для медитации:
Эта программа, тоже ни чего не выводит, так как предназначена для выполнения ее под отладчиком, для пущего научения.
Источник: asmforfun.blogspot.com
Как описать массив в программе
Вы знаете, что компьютер предназначен в основном для облегчения работы человека с большими информационными объемами. Во всех существующих языках программирования есть типы переменных, отвечающие за хранение больших массивов данных.
В языке Паскаль они так и называются: «массивы».
Массив – это упорядоченная последовательность однообразных данных, объединенных под одним именем.
Именно в них объединены все результаты каких-либо исследований, списки сотрудников, или другие сложные структуры данных.
Например, список учеников 11 «Б» класса является массивом. В одном массиве могут быть размещены одинаковые данные, поэтому отдельные его компоненты различаются порядковыми номерами.
Под это определение массива также подходит много объектов и предметов из реального мира: видеофильмы как последовательность и набор картинок, словари как последовательность и набор слов и т. д.
Для боле простого понятия «массив» лучше всего представить их в виде таблицы, в которой каждая величина размещена в своей клеточке или ячейке. Такое положение ячеек должно определяться конкретными координатами или индексами.
Типы массивов
Массивы бывают одномерными (линейными) или двумерными.
Одномерные (линейные) массивы
Линейные массивы являются самой простой величиной — для точного указания на ее отдельный элемент данных достаточно знать одно число. Более сложные структуры базируются на основе линейных (одномерных) массивов.
Такие массивы могут быть в виде последовательности чисел с известным количеством членов.
Также в них можно указать элемент с конкретным номером, например а8, или записать его общий вид, используя в качестве индекса переменную с указанием диапазона ее изменения: а, i = 1, 2, 3… и т.д.
Для выполнения задачи с массивом при помощи языка Паскаль, нужно выполнить такие действия:
- определить тип числа (целое или вещественное), но если типе ничего не сказано, то число лучше считать вещественным
- именовать массив нужно одним именем, используемым для каждого элемента (к нему добавится индекс этого элемента)
- массив нужно описать в разделе переменных 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;
Двумерный массив
Двумерный массив — совокупность данных, где значение каждых элементов зависит от его положения в строке и в столбце. Элементы двумерного массива описывается как a[i,j], где: а — имя массива i — номер строки j — номер столбца.
Если в матрице количество строк и столбцов совпадают – это квадратная матрийа, в противном случае — прямоугольная.
Способы ввода матрицы в память
Рассмотрим два самых распространенных способа ввода матрицы в память, зависящих от направления задачи:
Вопросы
1. Что такое массив?
2. Какие существуют виды массивов?
3. Что такое линейный массив?
4. Как записывается одноуровневый массив?
Список использованных источников
1. Урок на тему: « Массивы в Turbo Pascal», Жабина Светлана Александровна, г. Воронеж
2. Урок на тему: «Одно и двумерный массивы в Паскале», Ширяева Ольга Мухадинновна, г. Нягань, ХМАО-Югра.
3. Гордон Я. Тонкости программирования на языке Паскаль. — Бук-Пресс, 2006 г.
4. Культин Н. Turbo Pascal в задачах и примерах. — БХВ-Петербург, 2006 г.
5. Фаронов В. В. Turbo Pascal. В подлиннике. — БХВ-Петербург, 2004 г.
6. Фаронов В. В. Turbo Pascal 7.0 Начальный курс. — БХВ-Петербург, 2004 г.
Отредактировано и выслано преподавателем Киевского национального университета им. Тараса Шевченко Соловьевым М. С.
Над уроком работали
Поставить вопрос о современном образовании, выразить идею или решить назревшую проблему Вы можете на Образовательном форуме, где на международном уровне собирается образовательный совет свежей мысли и действия. Создав блог, Вы не только повысите свой статус, как компетентного преподавателя, но и сделаете весомый вклад в развитие школы будущего. Гильдия Лидеров Образования открывает двери для специалистов высшего ранга и приглашает к сотрудничеству в направлении создания лучших в мире школ.
Источник: edufuture.biz
§ 24. Массивы
Массивом в Паскале называют переменную величину регулярного типа.
Регулярный тип — это структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин.
Описание массивов. Переменная регулярного типа описывается в разделе описания переменных в следующей форме:
В данном случае квадратные скобки — это обязательные символы, которые называются индексными скобками. Чаще всего в качестве типа индекса употребляется ограниченный тип. Например массив вещественных чисел, хранящий 12 значений среднемесячных температур в течение года, опишется так:
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе.
Элемент массива идентифицируется в виде переменной с индексами:
Для одномерного массива индекс — это одно значение. Для многомерных массивов индекс — множество значений. В качестве индекса может употребляться любое выражение соответствующего типа. Например, для элементов массива температур возможны обозначения: Т [5] , T[k], T[i+j], T[m div 2].
Последовательные элементы массива располагаются в последовательных ячейках памяти (Т[1], Т [2] и т. д.), причем значения индекса не должны выходить за диапазон 1. .12.
Тип индекса может быть любым скалярным порядковым типом, кроме Integer. Например, в программе могут присутствовать следующие описания:
В такой программе допустимы следующие обозначения элементов массивов:
В некоторых случаях бывает удобно в качестве индекса использовать перечислимый тип. Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:
И если, например, элемент class_10 [А] равен 35, то это означает, что в 10А классе 35 человек. Такое индексирование улучшает наглядность программы.
Часто структурному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.
До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.
Многомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).
В качестве примера рассмотрим таблицу с информацией о среднемесячных температурах за 10 лет, например с 2001 по 2010 год. Очевидно, для этого удобна прямоугольная (двумерная) таблица, в которой столбцы соответствуют месяцам, а строки — годам.
Для обработки такой таблицы в программе следует описать массив:
Вот примеры обозначения некоторых элементов этого массива:
Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:
Переменная Таbl [2001] обозначает всю первую строку таблицы, т. е. весь массив температур за 2001 год. Другим эквивалентным вариантом приведенному выше описанию является следующее:
Наиболее краткий вариант описания данного массива такой:
Продолжая по аналогии, можно определить трехмерный массив как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива:
Это массив, состоящий из 10 • 20 • 30 = 6000 целых чисел и занимающий в памяти 6000 • 2 = 12 000 байтов. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение равно 64 килобайтам.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные — матрицами.
В Паскале не допускается употребление динамических массивов, т. е. таких, размер которых определяется в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе — раздел констант.
- присваивание значений одного массива другому;
- применение к массивам операций отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).
При выполнении операции присваивания
все элементы массива Р станут равными соответствующим элементам массива Q.
Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Тогда если массив ТаЫ описан так:
и в нем требуется данные за 2009 год сделать такими же, как за 2001 год (девятой строке присвоить значение первой строки), то это можно сделать одним присваиванием:
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:
где Р описана так:
Ввод и вывод массивов производятся покомпонентно. Вот примеры ввода с клавиатуры значений одномерного и двумерного массивов:
Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор Read.
Аналогично в цикле по индексной переменной организуется вывод значений массива на экран. Например:
Напомним, что модификатор формата 8:4 означает вывод числа в формате с фиксированной точкой в 8 позициях, из которых в 4 последних позициях размещается дробная часть.
Следующий фрагмент программы организует построчный вывод матрицы на экран:
После вывода очередной строки матрицы оператор WriteLn без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если Jmax не превышает 12 (подумайте почему).
Система основных понятий
Вопросы и задания
- Что такое регулярный тип данных? Что такое массив?
- Какие типы допустимы для индексов массива?
- Как в Паскале трактуется многомерный массив?
- Какие действия можно выполнять над массивом как единым целым?
- Дан вектор i>, i = 1, . . ., 50. Составьте программу ввода значений и вычисления длины этого вектора по следующей формуле:
Даны значения массива i>, i = 0, . . ., 10 и переменной х. Составьте программу вычисления алгебраического многочлена 10-й степени по формуле Горнера:
Источник: tepka.ru