Массивы с большей размерностью
Мы уже знаем, что возможна организация массива массивов, а точнее элементами массива могут быть другие массивы. Описание массива в этом случае может выглядеть так: ...: array [... ] of array... Подобная запись достаточно громоздка (несколько раз записывается служебное слово array и т. д. ), но синтаксис языка Паскаля позволяет описывать многомерные массивы проще.
<список идентификаторов — имен, через запятую>: Array <список поддиапазонов, через запятую> of <тип элементов>; Примеры: 1) М: array[1.. 3] of array [1.. 3] of Real; Подобное описание эквивалентно следующему: М: array [1.. 3, 1.. 3] of Real; В первом случае доступ к простому элементу осуществляется так: M[i][j], а во втором M[i, jl .
2) Т: array[1 .. 2, 1 .. 3, 1 .. 4] of Integer; U: array[1 .. 10, 'A' .. 'Z'] of char;
Работа с n-мерными массивами заставляет программиста организовать n вложенных циклов. Подробнее остановимся на двумерных массивах. Двумерные массивы используются, в основном, для определения матриц (таблиц) с индексами, изменяющимися по строкам и по столбцам.
А[1, 1] , А[1, 2] , . . . , A[l, M] А[2, 1] , А[2, 2] , . . . , А[2, M] …………………………………. А[N, 1] , A[N,2] , . . . , А[N,M]
Здесь приведён пример двух мерного массива с N строками и M столбцами. С элементами двумерных массивов можно работать, указывая два индекса (номер строки и номер столбца) через запятую в квадратных скобках. Примеры: М[1, 2] := 7; М[7, 5] :=46; M[i, j] := 75; M[k, 1] := SQR(M[i, j] + M[j, i] ) ;
Ввод элементов двумерного массива по строкам:
for i := 1 to n do for j:= 1 to m do Read (M[i, j]);
или с сообщениями:
for i:= 1 to n do for j:= l to m do begin Write('введите М[', i, ‘, ‘ , j, '] '); Readln(M[i, j]); end;
Вывод элементов двумерного массива в виде матрицы: for i:= 1 to n do begin for j:= 1 to m do Write(M[i, j] : 7: 3, ' ') ; Writeln; end; Часто при работе с двумерными массивами (матрицами) приходится оперировать с элементами, обладающими некоторыми признаками, в частности, связанными с положением элементов относительно диагоналей матрицы. Например, элемент находится на главной диагонали рисунок 12.1,a, на побочной диагонали рисунок 12.1б, ниже главной диагонали, ниже побочной и т. д. (рисунки 12.1,в÷ж).
a) б) в) г)
д) е) ж) Рисунок 12.1
Положение этих элементов может быть описано следующими математическими соотношениями: - на главной диагонали - { M[ i , j ] | i = j } - выше главной диагонали - { M[ i , j ] | i < j } - выше главной и выше побочной диагонали – { M[ i , j ] | i < j } ∩ { M[ i , j ] | i < n-j+1 } и т. д.
Задача. Матрица n*n вводится с клавиатуры, заменить все отрицательные элементы выше главной диагонали их квадратами. Вывести новую матрицу на экран. program p22; const n:= 4; var М: array[1.. n, 1.. n] of integer; i, j ; integer; begin { Ввод элементов матрицы } for i:= 1 to n do for j:= 1 to n do begin Write('введите М[ ' , i, ', ' , j , '] : '); Readln(M[i, j ] ) ; end; for i: = 1 to n do for j:= 1 to n do if i < j then { если выше главной диагонали} if M[i, j] < 0 then M[i, j] := SQR(M[i, j] ) ; { если элемент отрицательный, то заменить его квадратом} { Вывод результатов } for i:= l to n do begin for j:= 1 to n do Write( M[i, j]: 3 , ' '); Writeln; end; end. Констант-массивы Очень часто возникают сложности, связанные с вводом элементов массива, особенно во время отладки. Приходится по нескольку раз вводить большие объемы информации. Этого можно избежать, описав массив - константу в разделе Const.
Одномерный массив <идентификатор — имя массива>: array [<диапазон изменения индекса> ] of <тип элементов> = <список элементов, через запятую>); Примеры:
Const A : array [ 1 .. 5] of integer = (7, 3, 22, 4, 3) ; B : array [ 1 .. 3] of real = (2.55, 7.1, 3.6) ; C : array [ 1 .. 3] of char = (‘A’, ‘B’, ‘C’) ;
Многомерные массивы <идентификатор - имя массива>: array [ <список диапазонов, через запятую>] of <тип элементов> = (<список элементов массива, разделённых по группам в круглых скобках>);
Для двух мерного массива, группы - это строки. Примеры: Const M : array [ 1 .. 3, 1 .. 3] of integer = ((1, 2, 4) , (1, 7, 8), (22, 8, 4)) ; T : array [ 1 .. 2, 1 .. 2, 1 .. 2] of byte = (((1, 8) , (4, 4)), ((3, 2) , (5, 4))) ;
В нашем случае все массивы были описаны как типизированные константы, значит их использование в программе равноценно использованию обычных массивов - переменных. Задача. В одномерном массиве определить количество последовательностей из нулей. Последовательности - это цепочки из одного или более нулей, разделенные ненулевыми элементами. program p23; const n= 10; A: array[l..n] of Integer = (0, 1, 0, 0, 5, 0, 1,0, 3, 0, 0, 0, 2) ; var zero: Boolean; i, k: integer; begin zero:= false; k:= 0; for i : = 1 to n do if A[i] = 0 then if not zero then begin k := k + 1; zero:= true; end; else zero:= false; Writeln(' k= ', k); end. Строки Строковый тип Строки символов, реализованные в языке Паскаль, обладают всеми признаками и свойствами одномерных символьных массивов (... array... of Char ). Символьные массивы могут входить в состав строковых выражений. В этом случае массив преобразуется в строку, длина которой равна длине массива. Символьным массивам можно присваивать значения строковых констант, однако нельзя присваивать значения строковых переменных и значения строковых выражений. Пример: program p25; const S1= 'ABCDFGHIJK'; var S2: String[10]; S3: array [1.. 10] of char; begin S2:= S3; {- присваивание возможно} S3:= S1; {- присваивание возможно} S3:= S2; {- ошибка вида «Type mismatch» } end.
Строковые переменные описываются в разделе описания переменных следующим образом:
<список идентификаторов>: String [<максимальное количество символов>];
Примеры: var S: String [10] ; S1: String[40]; S2, S3, S4: String[255];
Максимальная длина строки не должна превышать 255 символов. Возможно следующее описание строковой переменной S: String; - это описание соответствует строке с максимальной длиной 255 символов ( String[255] ). Если строковой переменной попытаться присвоить значение с большей, чем максимальная длиной, то ошибки не произойдет, но конец строки будет автоматически отрезан. В программе доступ к отдельным символам строки осуществляется как к элементам массива, посредством указания индекса (от единицы до максимальной длины строки) в квадратных скобках: S[1]:= 'A'; S[4]:= '$'; S[t]:= '!'; и т. п. Нулевой байт переменной, содержащей строку, равен длине этой строки. Операции над строками Возможны строковые присваивания: S:= 'Мама мыла раму'; S: = ' ABC ' ; S:= S1; При работе со строками допустимо использовать операцию сложения {+}. Пример: Sl:= 'ABC’ ; S2: = 'DEF’ ; S:= S1 +S2;
После выполнения последнего оператора присваивания переменная S будет иметь значение 'ABCDEF'. Как явствует из примера, сложение строк - это простое их объединение, причем первое слагаемое стоит в новой строке на первом месте, второе - на втором и т. д. Для работы со строками существует набор специфичных процедур и функций. function Length(S: String): Integer ; - функция определяет реальную длину строки (количество символов). Примеры: 1) S : = ' ABCD ' ; t := length (S) ; После выполнения оператора присваивания целая переменная t будет иметь значение 4 (символа). 2) S:= 'Мама мыла раму'; t:= length (S) ;
После выполнения последнего оператора присваивания целая переменная t будет иметь значение 14 (символов). Pos( Sl, S2 ) - функция возвращает число типа byte, равное номеру первой позиции вхождения подстроки S1 в строку S2.
Примеры: 1) S:= 'ABCDEF'; Sl:= 'CDE'; t := pos(Sl , S); Переменная t будет иметь значение 3. 2) S:= 'АВСАВСАВСАВС ‘ ; S1:= 'BС'; t := pos(S1, S) ; Переменная t будет иметь значение 2.
Copy ( S, n, l) - функция копирует вырезает и возвращает часть строки S длиной l символов начиная с символа, имеющего номер позиции n. Примеры: 1) S := 'ABCDEFG’ ; S1 := copy(S, 3, 4); В данном случае функция возвратит значение 'CDEF'. 2) S := 'мама мыла раму'; S1 := copy(S, 6, 4); Функция возвратит значение 'мыла'.
Delete( S, n, l ) — процедура удаляет часть строки S, начиная с позиции n, длиной l символов. Примеры: 1) S := 'ABCDEFG’; delete (S, 3, 4) ; После вызова процедуры переменная S будет иметь значение 'ABG'. 2) S := 'мама мыла раму'; delete (S, 6, 5); Переменная S будет иметь значение 'мама раму'.
Insert( S1, S2, n ) - процедура вставляет строку S1 в строку S2, начиная с позиции n. Примеры: 1) S:= 'ABCDE'; S1:= 'GHIJ’; insert(S1, S, 3); После вызова процедуры Insert переменная S будет иметь значение 'ABGHIJCDE'. 2) S := 'мама раму'; S1 := 'мыла '; insert(S1, S, 6) ; Переменная S будет иметь значение 'мама мыла раму'. В отличии от массивов, строки можно выводить на экран и вводить с клавиатуры используя операторы Write и Writeln, Read, Readln. Примеры: Write('мама '); Write('мыла ') ; S': = 'раму' ; Writeln (S) ; Read(S); Readln(S1) ;
Задача: С клавиатуры вводится строка символов, в которой некоторая подстрока заключена в круглые скобки (например: 'ABC(DEFG)HUK' или 'мама (мыла) раму' ). Требуется отделить фрагмент в скобках и вывести его на экран. program р26; var S: String; nl, n2: integer; begin Writeln('Введите строку'); Readln(S) ; { находим позицию первого вхождения '(' } nl := pos( '(', S); {- находим позицию первого вхождения ')'} n2 := роз( ')', S); { по двум позициям определяем длину фрагмента = n2 - nl -1 } S := copy (S, nl + 1, n2 - nl - 1}; {и вырезаем фрагмент} Writeln('S= ', S); end. Задача: С клавиатуры вводится строка. Рассматривая ее как предложение, слова в котором разделяются одним или несколькими пробелами, разбить ее на слова, а слова вывести на экран. Каждое с новой строки. program p28; Const S: String = 'ABC DEFG HIJ KL'; var i: integer; S1: String; begin i: = 1; while i < = length(S) do begin {проходим по возможной цепочке пробелов} While ( S[i] = ' ') and (i <= length(S)) do i : = i + 1 ; S1 : = '' ; { S1 – пустая строка } { проходим по слову } While ( S[i] <> ' ') and ( i <= length(S)) do begin S1:= S1 + S[i]; i : = i + 1 ; end; Writeln(S1); end; end.
Для преобразования строковых значений в числовые (целые, вещественные) можно воспользоваться процедурой val. Val( S, X, Er) – процедура преобразует строку S в число, которое записывает в переменную X. В процессе перевода строки в число может возникнуть ошибка, например, строка содержит нецифровой символ. Поэтому, в параметр Er записывается значение ноль, если перевод в число прошел успешно и номер символа, на котором перевод был прерван, в обратном случае. Тип параметра Х может быть целым и вещественным, по желанию пользователя. Примеры: 1) {X: Integer} S:= ‘ 423' ; Val (S, x, Er); {после вызова процедуры целая переменная X будет иметь значение 123, а Ег – 0 } 2) {R: Real} S:= ‘ 423. 5' ; Val (S, R, Er); { R = 123. 5, Er = 0 } 3) { X: Integer} S := ' 342ABC ' ; Val(S, X, Er); { после вызова процедуры Ег = 4, на четвертом символе произошел сбой } Ниже приведена программа для преобразования строки символов в целое число. program р30; var I, Code: Integer; S: String; begin WriteLn('Введите строку для преобразования '); ReadLn(S); Val (ParamStr (1) , I, Code) ; { Если произошла ошибка... } if code <> 0 then Writeln('Ошибка в позиции: ' , Code) else Writeln( 'начение: ', I); end.
Процедура Str преобразует число (целое или вещественное) в символьный вид - строку. Обращение к процедуре - Str ( X, S) , X – целое или вещественное число, S – символьный вид этого числа. При переводе числовых значений можно указывать формат перевода, подобно тому, как мы это делали при вызове Write и WriteLn. Примеры: {Т: Integer} Str(T: 6, S) ;
{М: Real} Str(M : 4: 2, S); Str(T, S); Str(M, S); Ниже приведена программа для преобразования произвольного числа в строку. program p31;
function IntToStr(I: Longint) : String; var S: string [11] ; begin Str(I, S) ; IntToStr:= S; end;
begin Writeln(IntToStr(-5322) ) ; end.
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (492)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |