Сайт учителя информатики. Технологические карты уроков, Подготовка к ОГЭ и ЕГЭ, полезный материал и многое другое.
Какие типы допустимы для индексов массива?
Какие типы допустимы для индексов массива?
Ответ
Порядковые типы
Порядковые типы представляют собой подмножество простых типов. Все простые типы, отличные от вещественных типов, являются порядковыми и выделяются по следующим четырем характеристикам.
· Все возможные значения данного порядкового типа представляют собой упорядоченное множество, и каждое возможное значение связано с порядковым номером, который представляет собой целочисленное значение. За исключением значений целочисленного типа, первое значение любого порядкового типа имеет порядковый номер 0, следующее значение имеет порядковый номер 1 и так далее для каждого значения в этом порядковом типе. Порядковым номером значения целочисленного типа является само это значение. В любом порядковом типе каждому значению, кроме первого, предшествует другое значение, и после каждого значения, кроме последнего, следует другое значение в соответствии с упорядоченностью типа.
К любому значению порядкового типа можно применить стандартную функцию Ord, возвращающую порядковый номер этого значения.
К любому значению порядкового типа можно применить стандартную функцию Pred, возвращающую предшествующее этому значению значение. Если эта функция применяется к первому значению в этом порядковом типе, то выдается сообщение об ошибке.
К любому значению порядкового типа можно применить стандартную функцию Succ, возвращающую следующее за этим значением значение. Если эта функция применяется к последнему значению в этом порядковом типе, то выдается сообщение об ошибке.
К любому значению порядкового типа и к ссылке на переменную порядкового типа можно применить стандартную функцию Low, возвращающую наименьшее значение в диапазоне данного порядкового типа.
К любому значению порядкового типа и к ссылке на переменную порядкового типа можно применить стандартную функцию High, возвращающую наибольшее значение в диапазоне данного порядкового типа.
Урок 48. Массивы. Описание массивов на Паскале. Правила организации ввода и вывода значений массива
Массивы
Массивом в Паскале называют переменную величину регулярного типа.
Регулярный тип — это структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин.
Описание массивов. Переменная регулярного типа описывается в разделе описания переменных в следующей форме:
Var : array[ ] of
В данном случае квадратные скобки — это обязательные символы, которые называются индексными скобками. Чаще всего в качестве типа индекса употребляется ограниченный тип. Например, массив вещественных чисел, хранящий 12 значений среднемесячных температур в течение года, опишется так:
Var Т: array[1..12] of Real;
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе.
Элемент массива идентифицируется в виде переменной с индексами:
Тип индекса может быть любым скалярным порядковым типом, кроме Integer. Например, в программе могут присутствовать следующие описания:
Var cod: array[Char] of 1..100; L: array[Boolean] of Char;
В такой программе допустимы следующие обозначения элементов массивов:
cod[‘x’]; Lftrue]; cod[chr(65) ] ; L[a>0].
В некоторых случаях бывает удобно в качестве индекса использовать перечислимый тип. Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:
Type Index = (А, В, С, D) ;
Var class_10: array[Index] of Byte;
И если, например, элемент class 10 [А] равен 35, то это означает, что в 10А классе 35 человек. Такое индексирование улучшает наглядность программы.
Часто структурному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.
Type Masl = array [1..100] of Integer;
Mas2 = array [-10.. 10] of Char;
Var Num: Masl; Sim: Mas2;
До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.
Многомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).
В качестве примера рассмотрим таблицу с информацией о среднемесячных температурах за 10 лет, например с 2001 по 2010 год. Очевидно, для этого удобна прямоугольная (двумерная) таблица, в которой столбцы соответствуют месяцам, а строки — годам.
Для обработки такой таблицы в программе следует описать массив:
Var Тabl: array[2001..2010] of array[1.. 12] of Real;
Вот примеры обозначения некоторых элементов этого массива:
Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:
Переменная ТаЫ [2 001] обозначает всю первую строку таблицы, т. е. весь массив температур за 2001 год. Другим эквивалентным вариантом приведенному выше описанию является следующее:
Туре Month = array [1..12] of Real;
Year = array [2001..2010] of Month;
Var Tabl: Year;
Наиболее краткий вариант описания данного массива такой:
Var Tabl: array [2001.. 2010, 1..12] of Real;
Продолжая по аналогии, можно определить трехмерный массив как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива:
Var A: array[1..10, 1..20, 1..30] of Integer;
Это массив, состоящий из 10 • 20 • 30 = 6000 целых чисел и занимающий в памяти 6000 • 2 = 12 000 байтов. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение равно 64 килобайтам.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные — матрицами.
В Паскале не допускается употребление динамических массивов, т. е. таких, размер которых определяется в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Const Imax = 10; Jmax = 20;
Var Mas: array[1..Imax, l..Jmax] of Integer;
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе — раздел констант.
Действия над массивом как единым целым. Такие действия допустимы лишь в двух случаях:
• присваивание значений одного массива другому; • применение к массивам операций отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).
Пример 1
Var Р, Q: array [1.. 5, 1..10] of Real;
При выполнении операции присваивания
все элементы массива Р станут равными соответствующим элементам массива Q.
Пример 2
Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Тогда если массив ТаЫ описан так:
Type mas = array [1..12] of Real;
Var Таbl: array [2001.. 2010] of mas;
и в нем требуется данные за 2009 год сделать такими же, как за 2001 год (девятой строке присвоить значение первой строки), то это можно сделать одним присваиванием:
Таbl [2009] : =Таbl [2001]
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:
Р:=Таbl [2009] ; Таbl [2009] : =Таbl [2001 ] ; Таbl [2001] :=Р; где Р описана так:
Var Р: mas;
Ввод и вывод массивов производятся покомпонентно. Вот примеры ввода с клавиатуры значений одномерного и двумерного массивов:
For I: =1 То 12 Do
For I:=l To Imax Do
For J:=l To Jmax Do
Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор Read.
Аналогично в цикле по индексной переменной организуется вывод значений массива на экран. Например:
For I: =1 То 12 Do Write (Т [ I ] : 8 : 4 ) ;
Напомним, что модификатор формата 8:4 означает вывод числа в формате с фиксированной точкой в 8 позициях, из которых в 4 последних позициях размещается дробная часть.
Следующий фрагмент программы организует построчный вывод матрицы на экран:
После вывода очередной строки матрицы оператор Writeln без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если Jmax не превышает 12 (подумайте почему).
Вопросы и задания
1. Что такое регулярный тип данных? Что такое массив?
2. Какие типы допустимы для индексов массива?
3. Как в Паскале трактуется многомерный массив?
4. Какие действия можно выполнять над массивом как единым целым?
5. Дан вектор , i = 1, …, 50. Составьте программу ввода значений и вычисления длины этого вектора по следующей формуле:
До сих пор мы сталкивались в основном с простыми типами данных. Теперь давайте поговорим о сложных типах данных. Одним из примеров сложных типов являются массивы. Вспомним главу 4: массивы являются представителями сложных типов данных, а именно структурированных сложных типов.
Рассмотрение структурированных типов мы начнем с так называемых массивов » ARRAY «. Массив объединяет элементы одного типа данных. Массивы бывают одномерными и многомерными. Размер массива (и число измерений) ограничивается только объемом рабочей памяти ПЭВМ.
В математике и информатике массив называется одномерным, если для получения доступа к его элементам достаточно одной индексной переменной.
Декларация (объявление) одномерного массива выглядит следующим образом:
Var имя_массива: array [нач_инд. кон_инд] of тип_данных;
Var mas: array[1..25] of Integer;
Таким образом мы объявили одномерный массив mas целых чисел. Номер (индекс) первого элемента 1, последний номер (индекс) 25.
Декларация массивов может производиться и немного другим способом. Сначала объявляется тип пользователя (в нашем случае типа » array «), а затем и переменная на основе этого типа данных. Например:
Type tab = array [1..25] of Integer ;
Эта декларация аналогична приведенной выше. В следующем примере декларировано несколько переменных типа массив:
Var mas_1:array[1..10] of Real;
sst:array[20..40] of Char;
Обратите внимание, что величины, обозначающие «начальный индекс» и «конечный индекс», в квадратных скобках разделяются двумя (!) точками, причем перед этими двумя точками и после них допускаются пробелы.
Тип элементов, составляющих массив, может быть любым (в том числе и сложным). Тип индексов массива может быть только простым, хотя наиболее часто в качестве индексов элементов массива применяют целые числа.
В следующем примере объявлены массивы, содержащие элементы различных типов, и индексы различных простых типов:
Var mas : array [1..15] of Real ;
ast : array [‘ A ‘..’ Z ‘] of Boolean ;
art:array[(black,white)] of 11..20;
svz : array [ byte ] of Integer ;
TStringGrid — таблица строк
Компонент TStringGrid предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. Он является прямым потомком TDrawGrid (произвольная таблица), от которого им унаследовано большинство свойств и методов.
Cells [1,1] := ‘Левая верхняя ячейка рабочей зоны’;
Количество ячеек по каждому измерению хранит пара свойств Colcount (количество столбцов) и RowCount (количество рядов). Значения-этих свойств и, следовательно, размеры таблицы могут меняться как на этапе разработки программы, так и в ходе ее работы, однако их значения должны быть как минимум на единицу больше соответственно значений в свойства FixedCois и FixedRows, определяющих размеры фиксированной зоны.
property BorderStyle: TBorderStyle;
property Cells[ACol, ARow: Integer] :String;
Определяет содержимое ячейки с табличными координатами (ACol, ARow)
property Col: Longint;
Содержит номер столбца сфокусированной ячейки
property ColCount: Longing-
Содержит количество столбцов таблицы
property Cols[Index: Integer]:
Содержит все строки колонки с индексом Index
property ColWidths[Index: Longint] : Integer;
Содержит ширину столбца с индексом Index
property DefaultColWidth: Integers;
Содержит умалчиваемое значение ширины столбца
property DefaultDrawing: Boolean;
property DefaultRowHeight: Integers;
Содержит умалчиваемую высоту рядов
property EditorMode: Boolean;
Разрешает/запрещает редактирование ячеек. гнорируется, если свойство Options включает goAlwayseShowEditor или не включает goEditing
property FixedColor: TColor;
Определяет цвет фиксированной зоны
property FixedCois: Integers;
Определяет количество столбцов фиксированной зоны
property FixedRows: Integers;
Определяет количество рядов фиксированной зоны
property GridHeight: Integers;
Содержит высоту таблицы
property GridLineWidth: Integers;
Определяет толщину линий, расчерчивающих таблицу
property GridWidth: Integers;
Содержит ширину таблицы
property LeftCol: Longint;
Содержит номер самого левого столбца, видимого в зоне прокрутки
property Objects [ACols ARow: Integer] : TObject;
Обеспечивает доступ к объекту, связанному с ячейкой (ACol, ARow)
property Options: TGridOptions;
Содержит параметры таблицы (см. ниже)
property Row: Longing;
Содержит номер ряда сфокусированной ячейки
property RowCount: Longint;
Содержит количество рядов таблицы
property RowHeights[Index: Long int] : Integer;
Содержит высоту ряда с индексом index
property Rows[Index: Integer]: TStrings;
Содержит все строки ряда с индексом
type TScrollStyle = (ssNone,
property ScrollBars: TScroll
0: (Left,Top,Right,Bottom: Long int) ;
Определяет группу выделенных ячеек в
координатах левая верхняя и правая
нижняя ячейки(нумерация столбцов и рядов идет от нуля, включая столбцы и
ряды фиксированной зоны). После выделения сфокусированной окажется правая нижняя ячейка
property Selection: TGridRect;
property TabStops[Index: Long int] : Boolean;
Разрешает/запрещает выбирать столбец с индексом index при обходе ячеек клавишей Tab. Игнорируется, если Options не содержит goTabs
property TopRow: Longint;
Содержит номер самого верхнего ряда, видимого в прокручиваемой зоне ячеек
property VisibleColCount: Integer;
Содержит количество столбцов, полностью видимых в зоне прокрутки
property VisibleRowCount: Integer;
Содержит количество рядов, полностью видимых в зоне прокрутки
Для компонента определен тип TGridOptions (при его использовании активируются все необходимые (стандартные) для использования компонента свойства):
Элементы множества TGridOptions имеют следующий смысл:
Столбцы фиксированной зоны разделяются вертикальными линиями
Ряды фиксированной зоны разделяются горизонтальными линиями
Столбцы рабочей зоны разделяются вертикальными линиями
Ряды рабочей зоны разделяются горизонтальными линиями
Разрешено выделение нескольких ячеек. Игнорируется, если включен элемент goEdit
Разрешено выделять сфокусированную ячейку так же, как выделенные
goRowSizing goColSizing goRowMoviog
Разрешено ручное (мышью) изменение высоты строк Разрешено ручное изменение ширины рядов Разрешено ручное перемещение рядов (нажать левую кнопку мыши на фиксированной ячейке перемещаемого ряда и, удерживая кнопку нажатой, переместить ряд на новое место)
Разрешено ручное перемещение столбца Разрешено редактирование ячейки. Игнорируется, если включен элемент goRowSelect. Редактирование начинается после щелчка мыши или нажатия клавиши F2 и завершается при щелчке по другой ячейке или нажатии клавиши Enter
Разрешено обходить ячейки клавишей Tab (Shift+Tab) Обязывает выделять сразу все ячейки ряда и запрещает редактирование ячеек Разрешено редактировать сфокусированную ячейку: редактирование возможно после выбора ячейки клавишей Tab (Shift+Tab). Игнорируется, если не включен элемент goEditing
Разрешено обновление при прокрутке. Если этот элемент отсутствует, обновление ячеек произойдет только после окончания прокрутки
Пример ввода массива с использованием TStringGrid при вводе одномерного целого числового массива:
Type mas=array[1..10] of Integer;
Извлечение и присвоение в массивах
В отличие от стандартных переменных массивы не могут обрабатываться целиком. Но вы можете получить доступ к каждому элементу-ячейке массива. Это выполняется путем указания значения индекса в квадратных скобках. Так, например, с помощью оператора
элементу массива с индексом 2 присваивается значение 34. Оператор
For i :=1 to 25 do mas [ i ]:=0;
всем элементам массива присваивается значение «0».
Использование массивов вместо одиночных переменных позволяет вамблагодаря применению циклов «For… to … do » существенно сэкономить время и объем программы. Это демонстрируется следующим примером.
Пример. Дана последовательность реальных чисел s 1 … s 30. Организовать массив для хранения этих чисел. Определить сумму этих элементов.
В инспекторе объектов для компонента StringGrid1 задаем следующие свойства:
Тип в программировании – это множество, для которого оговорен некоторый набор операций над элементами – значениями, которые могут принимать переменные этого типа. Существуют четыре стандартных типа Паскаля: типы Real, Integer (это числовые множества), тип Char (множество символов), тип Boolean. Однако в Паскале имеются средства, позволяющие определять, исходя из имеющихся типов, новые типы. Различают следующие структурированные типы данных:
В данной лекции мы подробно рассмотрим массивы.
Определение массива
Массивы, как и циклы, — величайшее изобретение программирующего человечества. Массивы приходят на помощь тогда, когда приходится иметь дело с наборами однотипных и однородных данных (например, координаты точки в двумерном, трехмерном пространстве).
Массив – это упорядоченная последовательность однотипных элементов определенной длины, имеющая общее имя. Номер элемента в последовательности называется индексом. Количество элементов в массиве не может быть изменено в процессе выполнения программы. Элементы массива размещаются в памяти последовательно и нумеруются от 1 до n, где n – их количество в массиве. К каждому элементу массива имеется прямой доступ. Это означает, что для того чтобы обратиться к какому-либо элементу массива, нет нужды перебирать все его предыдущие элементы, достаточно указать номер этого элемента.
Массив имеет следующие характеристики:
Массивы могут быть одномерными и многомерными. Но мы ограничимся рассмотрением только одномерных и двумерных массивов.
Одномерные массивы – массивы, в которых элементы пронумерованы последовательно по порядку: первый элемент, второй, третий и т.д. Для обозначения элементов одномерного массива используется один индекс.
Двумерные массивы – массивы, в которых данные условно организованы в виде таблицы (матрицы), где положение каждого элемента определяется номером строки т номером столбца. Для обозначения элементов двумерного массива используются два индекса: первый индекс для обозначения номера строки, второй индекс для обозначения номера столбца.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные – матрицами.
Значения индексов можно задать непосредственно числом (прямая адресация) – A(1), A(4,2) или косвенно, указав в индексе идентификатор переменной, которая позволит вычислить индекс (косвенная адресация) – A(i), A(i, j+2).
При работе с массивами в программе они должны быть объявлены (описаны), т.е. указаны имя массива, тип элементов массива, его размерность.
При обращении к элементу массива, значение индекса которого выходит за допустимые границы, появляется сообщение об ошибке.
Одномерные массивы: описание, ввод и вывод, обработка массива
Описать массив можно двумя способами.
В разделе описания переменных мы можем описать массив следующим образом:
Здесь A – название массива;
Array – служебное слово;
n1,n2 – соответственно номер первого и последнего элемента массива;
– любой из уже изученных типов.
Количество элементов массива будет равно (n2-n1+1).
означает, что полученный массив будет состоять из 20 вещественных чисел, первое из которых будет иметь номер 1, последнее – 20. Наш массив будет иметь имя Massiv.
Описание массива заключается в создании нового оригинального типа. Для того, чтобы программист мог создавать свои новы типы в Паскале существует раздел описания типов Type. Этот раздел находится между разделом описания констант и разделом описания переменных.
После этого в разделе описания переменных мы можем описать массив, который имеет созданный нами тип, например,
В данном случае мы сначала описали новый тип Mas – массив из десяти целых чисел с номерами от 10 до 19, затем описали переменную B типа Mas.
В большинстве случаев для обработки массивов используются циклы. В цикле имеется возможность поочередно перебрать все элементы массива.
Для ввода массива с клавиатуры может быть использован цикл следующего вида: пусть имеется массив с именем A, состоящий из n элементов, тогда
В этом случае пользователь вводит через пробел n элементов массива. Для ввода элементов массива с новой строки используется оператор ReadLn. Ввод данных в массив происходит следующим образом: сначала значение счетчика цикла равно 1; выполняется операция Read (A[1]); поле чего счетчик цикла становится равным 2; выполняется операция Read (A[2])… и т.д. до значения i=n включительно.
Для вывода массива на экран используется следующий цикл:
В данном случае на экран в одну строку будут выведены все n элементов массива, после чего курсор переместится на одну строку вниз.
Как уже было сказано выше, для обработки массивов используются циклы.
Пример: пусть имеется массив M, состоящий из n элементов с номерами от 1 до n. Найти сумму элементов массива, вывести ее на экран.
Двумерные массивы: описание, ввод и вывод, обработка массива
В математике очень распространено такое понятие как матрица. Матрица – это таблица из коэффициентов A=(aij). Элементы матрицы образуют столбцы и строки. Первый индекс ( i ) указывает номер строки, второй ( j ) – номер столбца, на пересечении которых находится элемент aij.
Определим некоторые действия над матрицами:
В программировании матрицы удобно представлять с помощью двумерных массивов.
Описание двумерных массивов отличается от описания одномерных массивов только тем, что мы указываем начальное и конечное значение для обоих индексов:
Здесь n1,n2 – начальное и конечное значения первого индекса;
m1,m2 – начальное и конечное значения второго индекса.
Это массив, состоящий из 10*20*30=6000 целых чисел и занимающий в памяти 6000*2=12000 байт. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение составляет 64 Кбайта.
В Паскале не допускается употребление динамических массивов, т.е. таких, размер которых определяется в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе – раздел констант.
Для ввода и вывода двумерных массивов используются два вложенных цикла.
Для обработки двумерных массивов также используются два вложенных цикла.
Пример: найти произведение массива A на число L.
Обр-кудв. массивасм. Рапаков стр.126!
Действия над массивом как единым целым
Такие действия допустимы лишь в двух случаях:
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).
При выполнении операции присваивания P :=Q все элементы массива P станут равны соответствующим элементам массива Q.
Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Например,
Год
Месяц
1
2
3
4
5
6
7
8
9
10
11
12
1981
-23
-17
-8
7
14
18
25
19
12
5
-4
-19
1982
-17
-10
-3
6
8
13
28
24
6
2
-13
-20
…
…
…
…
…
…
…
…
…
…
…
…
…
1990
-10
-15
-4
9
13
17
23
20
10
8
-14
-20
если в таблице H требуется, чтобы данные за 1989г. были такими же, как и за 1981г. (девятой строке присвоить значение первой строки), то это можно делать так:
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа: