Обработка массивов
Часто требуется вычислить сумму элементов массива, их среднее арифметическое значение или найти значения и номера максимального и минимального элементов, а также изменить значения элементов массива и т.д. Особенность работы с двумерными массивами заключается в том, что расширяется возможность обработки массива (появились новые элементы: строки, столбцы - являющиеся одномерными массивами). Подробно все действия можно рассмотреть в задачах разобранных в этом разделе.
Квадратная матрица
Квадратной называется такая матрица, в которой количество строк равно количеству столбцов. Выделяют следующие элементы квадратной матрицы: · главная диагональ; · побочная диагональ; · элементы, расположенные выше главной диагонали; · элементы, расположенные ниже главной диагонали; · элементы, расположенные выше побочной диагонали; · элементы, расположенные ниже побочной диагонали; Главная диагональ. Если значения индексов (i, j) элемента равны, то элементы расположены на главной диагонали. А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 if i=j then <инструкции> Побочная диагональ. Если для значений индексов (i, j) элементов выполняется равенство: i+j=n+1, то элементы расположены на побочной диагонали. А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 if i+j=n+1 then <инструкции> Для элементов, расположенных выше главной диагонали необходимо использовать один из следующих фрагментов программы: А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 for i:=1 to n do for j:=1 to n do if i < j then <инструкции> for i:=1 to n-1 do for j:=i+1 to n do <инструкции> Если элементы расположены на главной диагонали и выше её необходимо использовать следующий фрагмент программы: А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 for i:=1 to n do for j:=1 to n do if i<=j then <инструкции> Для элементов, расположенных ниже главной диагонали необходимо использовать следующий фрагмент программы: А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 for i:=1 to n do for j:=1 to n do if i>j then <инструкции> Для элементов, расположенных ниже главной диагонали и не ней необходимо использовать следующий фрагмент программы: А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 for i:=1 to n do for j:=1 to n do if i>=j then <инструкции> Если элементы, расположены выше побочной диагонали, то необходимо использовать следующий фрагмент программы: А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 for i:=1 to n-1 do for j:=1 to n-1 do if i+j<=n then <инструкции> Если элементы, расположены ниже побочной диагонали, то необходимо использовать следующий фрагмент программы: А11 А12 А13 А14 A21 A22 A23 А24 A31 A32 A33 А34 A41 A42 A43 А44 for i:=2 to n do for j:=2 to n-1 do if i+j>n+1 then <инструкции> Транспонирование матрицы. Транспонированной матрицей называется матрица, у которой столбцы соответствуют строкам исходной квадратной матрицы. При этом элементы главной диагонали исходной и транспонированной матриц, одни и те же. Операция транспонирования сводится к обмену элементов матрицы, расположенных симметрично главной диагонали. Исходная матрица Транспонированная матрица 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
Фрагмент программы транспонирования матрицы: for i:=1 to n do {Просмотр всех строк матрицы} for j:=i+1 to n do {Просмотр всех элементов в строке, расположенных выше главной диагонали} begin k:=a[i,j]; a[i,j]:= a[j,i]; a[j,i]:= k; end; СТРОКИ
В информатике часто используются массивы типа char, которые выделены в отдельный строковый тип - string[n] - где n<=255. Способы описания переменных - строк аналогичны описанию массивов:
type word=string [ 20 ]; var a:word;
var a,b,c:string [ 30 ]; d:string [ 54 ];
const st:string[11]='информатика';
Символы, составляющие строку, занумерованы слева направо, начиная с нуля. К ним можно обращаться с помощью индексов, как к элементам одномерного массива. Ввод и вывод элементов массива осуществляется с помощью циклов. Над строками можно выполнять следующие действия:
A1:='привет '; (string [7]) A2:='друг'; (string [4]) A3:=A1+A2; значение A3 стало:'привет друг' (string[11]) Следует учитывать, что в операциях сцепления длина результирующей строки не должна превышать 255.
Сравниваются первые символы двух строк. Если они не равны, то большим считается то значение строковой переменной, код первого символа которого больше. Если первые символы одинаковы, то сравниваются следующие. Если все символы одной строки совпадают с символами другой строки, то они считаются равными. В случае, когда последовательное сравнение пар символов не обнаружило различия, но одна строка длиннее другой, то ее значение считается большим. 'пролив' > 'прилив' '11111' > '111' '11111' < '2' 'fbr' > 'cru' т.к. 'f'>'c' Функции:
st:='Привет!'; s:=copy(st,4,3); {Результатом будет следующая строка} s='вет'; st1:='Привет!'; s1:=copy(st,4,10); {Результатом будет следующая строка} s1='вет!'; функция определения длины строки: LENGTH(S) - результатом является число; st:='Привет!'; k:=length(st); {Длина результирующей строки равна} k=7; st1:='Всем привет!'; k1:=length(st1); {Длина результирующей строки равна} k1=12;
st1:='abcdef'; pos('de',st1)=4; pos('r',st1)=0; Процедуры:
st:='abcdef'; delete(st,2,3); {Результатом будет следующая строка} st='aef';
st1:='12389'; st2:='4567';
{Результатом будет следующая строка} st1='123456789';
str(1500,st)='1500'; str(1500:6,st)=' 1500';
Символьный тип(char) K типу char относится любой символ заключенный в апострофы. Для представления апострофа как символьную переменную, надо заключить его в апостроф. Каждый символ имеет свой код и номер. Порядковые номера цифр 0,1..9 упорядочены по возрастанию. Порядковые номера букв также упорядочены по возрастанию, но не обязательно следуют друг за другом. К символьным данным применимы знаки сравнения: >, <, >=, <=, <>. Например: 'A' < 'W' Функции, которые применимы к символьным переменным:
Пример: ord('a')=97.
Пример: chr(97)='a'.
Пример: pred('B')='A'
Пример: succ('A')='B'.
ЗАПИСИ
При решении задач обработки большого количества значений используются массивы. Но при работе с массивами основное ограничение заключается в том, что каждый элемент массива должен иметь один и тот же тип данных. Иногда для решения задач, в которых возникает необходимость хранить и обрабатывать данные различных типов, используются отдельные массивы для каждого типа данных, а установление соответствия между ними выполняется при помощи индексов. Но есть способ лучше. Распространенным случаем является необходимость описать атрибуты (характеристики) некоторого объекта, представляемого и обрабатываемого в программе. Таким объектом может быть человек, некоторый вычислительный комплекс и т.д. В этих и во всех подобных случаях атрибуты объекта представляются значениями различных типов и поэтому для их описания не могут быть использованы массивы. Для описания объекта человек могут понадобиться, например, следующие характеристики: Фамилия, имя, отчество (символьные массивы или строки);
Таким образом, описание комбинированного типа представляет собой список описаний его элементов (которое называется также полями записи); Для записи комбинации данных разных типов в Turbo Pascal применяется комбинированный тип данных запись. Запись представляет собой наиболее общий и гибкий структурированный тип данных, т.к. она может быть образована из неоднотипных компонентов, и в ней явным образом выражена связь между элементами данных, которые характеризуют реальный объект. Запись - это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов, называемых полями записи. Каждое поле имеет свое имя. Объявление типа записи. type ИмяТипа= record ИмяПоля1: ТипПоля1; ИмяПоля2: ТипПоля2;
ИмяПоляN: ТипПоляN; end; Затем объявляются переменные соответствующего типа. var ИмяПеременной: ИмяТипа;
Например: Пример 1. type avto=record number: integer; {номер автомобиля} marka: string[20]; {марка автомобиля} fio: string[40]; {фамилия, инициалы владельца} address: string[60]; {адрес владельца} end; var m: avto; Пример 2. type address=record k: longint; {почтовый индекс} city: string[10]; {название города} street: string; {название улицы} house: integer; {номер дома} flat: integer; {номер квартиры} end; Значение полей записи могут использоваться в выражениях. Обращение к значению поля осуществляется с помощью имени переменной и имени поля, разделенных точкой. Такая комбинация называется составным именем. Например, чтобы получить доступ к полям записи avto, надо записать: m.number, m.marka, m.fio, m.address Составное имя можно использовать везде, где допустимо применение типа поля: в операторах присваивания, операторах ввода и вывода. Обращение к полям записи имеет несколько громоздкий вид. Для решения этой проблемы в языке Turbo Pascal имеется оператор присоединения with, в виде: with m do begin number:=1954; marka:='Audi - 100' fio:='Иванов И.И.'; address:='ул. Бочкарева 7 кв.38'; end;
Записи могут быть элементами массивов. Отдельные поля записей тоже могут быть записями. За счет этого в Паскале можно создавать сложные структуры данных: type anketa=record facult: string; group: 1..6; fio: string; address=record k: longint; city: string[10]; street: string; house, flat: integer; flat: integer; {номер квартиры} end; bd=record date: 1..31; month: 1..12; year: integer; end; end; var ved: array[1..20] of anketa; Здесь переменная ved – это массив записей. Каждая запись состоит из пяти полей, причем два последних поля сами являются записями. Обращение к элементам таких сложных структур происходит по составным именам, например: ved[5].address.city:=’Корытово’.
|