оао. Лабораторная работа 3. Массивы. Лабораторная работа массивы тема работы Работа с массивами в языке Паскаль. Цель
![]()
|
ЛАБОРАТОРНАЯ РАБОТА 3. МАССИВЫ Тема работы: Работа с массивами в языке Паскаль. Цель работы: Приобретение и закрепление практических навыков в составлении программ на языке Паскаль с данными регулярного типа - массивами. Порядок выполнения работы 1. Выберите метод решения задачи. 2. Выберите стандартные функции, необходимые для решения задачи. 3. Выберите форму представления данных. 4. Разработайте алгоритм решения задачи. Для ввода данных используйте диалоговый режим или вводите с помощью генератора случайных чисел. Результат решения задачи выведите на экран дисплея. Теоретические сведения МАССИВЫ МАССИВ – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип. Можно использовать и любой другой ранее описанный тип, поэтому вполне правомерно существование массивов строк, массивов массивов и т.д. Элементами массива могут быть данные любого типа, включая структурированные. Тип элементов массива называется базовым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Доступ к каждому отдельному элементу осуществляется путем индексирования элементов массива. Индекс массива по смыслу тождественен понятию индекса элемента вектора. Индексы представляют собой выражения любого скалярного типа, кроме вещественного. Тип индекса определяет границы изменения значений индекса. Для описания массива предназначено словосочетание ARRAY OF(массив из). Формат : TYPE <имя типа> = ARRAY [тип индекса] OF <тип компонент>; VAR <идентификатор,...> : <имя типа>; Массив может быть описан и без представления типа в разделе описания типов данных: VAR <идентификатор,...> : ARRAY [тип индекса] OF <тип компонент>; Пример : TYPE KLASS = (K1,K2,K3,K4); ZNAK = ARRAY[1..255] OF CHAR; VAR M1: ZNAK; {тип ZNAK предварительно описан в разделе типов} M2: ARRAY[1..60] OF INTEGER; {прямое описание массива M2} M3: ARRAY[1..4] OF KLASS; MAS: ARRAY[1..4] OF INTEGER; Если в качестве базового типа взят другой массив, образуется структура, которую принято называть многомерным массивом. Пример : TYPE VECTOR = ARRAY[1..4] OF INTEGER; MASSIV = ARRAY[1..4] OF VECTOR; VAR MATR : MASSIV; Ту же структуру можно получить, используя другую форму записи: VAR MATR : ARRAY[1..4,1..4] OF INTEGER; Если в такой форме описания массива задан один индекс, массив называется одномерным, если два индекса – двухмерным, если N индексов – N – мерным. Размерность ограничена только объемом памяти конкретной ПЭВМ. Одномерные массивы обычно используются для представления векторов, а двухмерные – для представления матриц. Пример : VAR VECTORZ : ARRAY[1..40] OF REAL; {Одномерный массив представляет вектор из 40 элементов типа REAL} MATRU : ARRAY[1..8,1..8] OF BYTE; {Двухмерный массив представляет матрицу из 8 строк и 8 столбцов с элементами байтового типа.} TRILF : ARRAY[1..4,1..5,1..8] OF INTEGER; {Трехмерный массив} Для описания массива можно использовать предварительно определенные константы: CONST G1 = 4; G2 = 6; VAR MASY : ARRAY[1..G1,1..G2] OF REAL; Элементы массива располагаются в памяти последовательно. Элементы с меньшими значениями индекса хранятся в более низких адресах памяти. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым. Например, если имеется массив A : ARRAY[1..5,1..5] OF INTEGER; то в памяти элементы массива будут размещены по возрастанию адресов: A[1,1] A[1,2] A[1,5] A[2,1] A[2,2] A[5,5] Контроль правильности значений индексов массива может проводиться с помощью директивы компилятора R. По умолчанию директива R находится в пассивном состоянии {$R-}. Перевод в активное состояние вызывает проверку всех индексных выражений на соответствие их значений диапазону типа индекса. Действия над массивами Паскаль допускает единственное возможное действие над массивом в целом: использование его в операциях отношения "равно", "не равно" и в операторе присваивания. Например: VECT1 := VECT2 причем массивы, участвующие в этих действиях, должны быть идентичны по структуре, т.е. иметь одинаковые типы индексов и одинаковые типы компонентов. Например, если массивы А и В описаны, как VAR A,B : ARRAY[1..20] OF REAL; то применение к ним допустимых операций даст следующий результат: Выражение Результат A = B TRUE, если значение каждого элемента массива А равно соответствующему значению элемента массива В. А < > B TRUE, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В. А := B Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменными. Действия над элементами массива Доступ к элементам массива строится традиционно: после идентификатора массива в квадратных скобках указывается индекс нужного элемента или список индексов, определяющий элемент многомерного массива. В качестве индексов могут выступать произвольные выражения, тип которых должен соответствовать типу индексов в описании массива. Например, запись MAS[2] VECTORZ[10] позволяет обратиться ко второму элементу массива MAS и к десятому элементу массива VECTORZ. Доступ к элементам двумерного массива V2 осуществляется следующим образом: V2[3 , 7] V2[I , J] Символьные массивы Необходимо сказать несколько слов об одномерных массивах, состоящих из элементов символьного типа ( CHAR ). Если в качестве индекса символьного массива используется ограниченный целый тип, то такие массивы называются строками. Например: VAR S : ARRAY [1,13] OF CHAR ; Язык Паскаль содержит некоторые дополнительные средства для работы с такими массивами. Имеется возможность записывать конкретные значения строковых массивов с помощью изображения строки и использовать их в присваиваниях и передаче параметров: S := ‘ Пример строки’ ; Изображение строки строится из цепочки символов, составляющих строковый массив, и заключается в одинарные кавычки (апострофы). Если необходимо задать апостроф внутри самой строки, то он удваивается. Кроме того, для строковых массивов допускается операция конкатенации, обозначаемая символом ‘+’ (плюс), смысл которой заключается в формировании нового символьного массива, число элементов которого равно сумме размеров массивов-операндов, а значениями элементов - элементы массивов-операндов, расположенные последовательно друг за другом. Так, если в программе имеются описания: VAR S1 : ARRAY[1..9] OF CHAR ; S2 : ARRAY[1..6] OF CHAR ; то допустимы следующие операторы: S1 := ‘ Строковый’ ; S2 := ‘ массив’ ; WRITELN ( S1 + ‘ ‘ + S2 ) ; В результате выполнения последнего оператора на экран дисплея будет выведено сообщение: Строковый массив В операциях присваивания строк символьным массивам необходимо точное соответствие длин строк и размеров массивов. Следует иметь в виду, что операция конкатенации для символьных массивов не допускается в правых частях операторов присваивания. Например, оператор S := S1 + ‘ ‘ + S2; вызовет ошибку компиляции независимо от размера символьного массива S. В подобных случаях необходимо использовать строки переменной длины. Пример решения задачи Индивидуальное задание Найти максимальное значение в массиве вещественных чисел. Описание работы 1. Выберите алгоритм решения задачи. 2. Выберите форму представления данных. Используйте следующие типы переменных: INTEGER, REAL, BOOLEAN, CHAR. 3. Для ввода массива используйте генератор случайных чисел или вводите элементы в диалоговом режиме. Результат решения задачи выведите на экран дисплея. 4. Выберите имена основных идентификаторов. Выберите тип индекса и тип элементов массива. Обратите внимание на форму описания двумерных массивов. Введите текст программы. 5. Для этого необходимо войти в программу-оболочку TP7, как указано выше. Загрузить в редактор Турбо-Паскаль новый (NEW) файл. Для этого нажмите одновременно клавиши [ALT]+[F] , установите курсор на подменю «NEW» и нажмите клавишу [ENTER]. 6. Сохраните набранный текст программы. Нажмите клавишу [F2]. На запрос системы укажите, где и с каким именем будет сохранена ваша программа. Например, C:\Lr4.PAS, если программа сохраняется на жесткий диск или A:\Lr4.PAS, если программа сохраняется на дискету. 7. После того, как программа набрана, откомпилируйте ее. Нажмите одновременно клавиши [ALT]+[F9]. Если в программе есть ошибки, то в левом верхнем углу появится сообщение об ошибке, а курсор укажет место ошибки. Если в программе ошибок нет, то появится сообщение об успешной компиляции. 8. После компиляции программу необходимо выполнить. Для этого нажмите одновременно клавиши [CTRL]+[F9]. Для просмотра результатов одновременно нажмите клавиши [ALT]+[F5]. 9. Убедитесь в правильности решения задачи. Введите данные, для которых легко устно просчитать результат. Выполните программу и убедитесь в правильности полученного результата. 10. Выведите полученные результаты на печать. Текст программы program max ; uses crt ; const m=10 ; n=20 ; var i,j: m..n ; x:array[m..n] of real ; begin clrscr ; for i:=m+1 to n do read(x[i]) ; j:=m ; for i:=m+1 to n do if x[i]>x[j] then j:=i ; writeln(x[j]:3:1) ; readln end . Примеры решения задач Пример 1: Элементы массива переставить таким образом, чтобы их значения были расположены в убывающем порядке. Текст программы: program sortmin ; Uses crt ; const n=5 ; var i , u : integer ; a : boolean ; x : array[1..n] of integer; begin clrscr ; for i := 1 to n do read(x[i]) ; a := false ; while not a do begin a := true ; for i := 1 to n-1 do if x[i] < x[i+1] then begin u := x[i] ; x[i] := x[i+1] ; x[i+1] := u ; a := false ; end ; write( x[i], ' ' ) ; end ; for i := 1 to n do write( x[i], ' ' ) ; readln ; readln end . Пример 2: Дан двухмерный массив различных вещественных чисел, содержащий 5 строк и 4 столбца. Строку, содержащую МАХ элемент массива, поменять местами со строкой, содержащей МIN элемент. program mas ; type mmm = array[1..4] of real; var m: array[1..5] of mmm ; m1 : mmm ; max, min : real ; maxi, mini, i, j : integer ; begin writeln('Введи исходный массив : ') ; for i := 1 to 5 do for j := 1 to 4 do read(m[i,j]) ; max := m[1,1] ; min := m[1,1] ; maxi := 1 ; mini := 1; for i := 1 to 5 do for j := 1 to 4 do begin if max < m[i,j] then begin max := m[i,j] ; maxi := i ; end ; if min > m[i,j] then begin min := m[i,j] ; mini := i ; end ; end ; m1 := m[maxi] ; m[maxi] := m[mini] ; m[mini] := m1 ; writeln('Массив после перестановки строк :') ; for i := 1 to 5 do begin for j := 1 to 4 do write(m[i,j] : 5 : 2); writeln ; end end . Варианты индивидуальных заданий 1 2 3 4 5 6 7 8 9 10 В программах используется стандартный модуль CRT, в котором применяются следующие процедуры: CLRSCR - очищает экран; RANDOMIZE - инициализирует генератор случайных чисел; RANDOM(K) - генерирует случайное число в диапазоне 0 .. K. Если число не указывать, то функция RANDOM будет генерировать вещественные числа в диапазоне 0 .. 1. Для получения случайных чисел в диапазоне -128 .. K необходимо задать конкретное значение K. |