Основы программирования (947332), страница 13
Текст из файла (страница 13)
Для их представления используютструктурные типы данных. В Borland Pascal определены следующие структурные типыданных:• массивы - для представления однотипных или табличных данных;• строки-для представления символьной (текстовой) информации;• множества - для представления абстрактных математических множеств;• записи - для представления таблиц с данными различных типов.4.1. МассивыМассив - это упорядоченная совокупность однотипных данных. Каждому элементу массива соответствует один или несколько индексов^ определяющих положение элемента в массиве.
Индексы образуют упорядоченные последовательности. Синтаксическая диаграмма объявления массива представлена на рис. 4.1.Тип индекса определяет его допустимые значения. В качестве типа индекса может быть указан любой порядковый тип (boolean, char, integer, перечисляемый тип, а также диапазоны этих типов), кроме типа longint и его производных.В зависимости от количества типов индексов различают: одномерные,двумерные, трехмерные и п-мерные массивы.
Двумерные массивы обычноназывают матрицами, считая первый индекс - номером строки, а второй номером столбца.<^>0гС&ОЧНЯТипэлементаРис. 4.1. Синтаксическая диаграмма <Объявление массива>77Часть I. Основы алгоритмизации и процедурное программированиеГЗ"0-8 112 54АГА" NО0D1Rт-5-4-3-50"ii'l[Т]В 46 83С 54 0 "93]255бРис. 4.2. Одномерный массив из 5 целых чисел (л), одномерный массив из 256символов (б), матрица из 9 чисел (в)Тип элементов массива - любой допустимый в Borland Pascal тип (в томчисле и массив), кроме файла..Объявление переменных типа массив выполняется двумя способами:• в операторе объявления переменных, например:Var a:array[L.10] of integer; {массив из 5 целых чисел, см.
рис. 4.2, а)Ь: array[byte] of char;{массив из 256 символов, индекс элементамассива изменяется от О до 255, см. рис. 4.2, 6}с:аггау['А\, 'C\-5„'3J of byte; {матрица из 9 чисел, см. рис. 4.2, в}d:array[*А\. V*] of array[-5..-3] of byte; {матрица из 9 чисел, поструктуре эквивалентная предыдущей}• с предварительным объявлением типа, например:Туре mas =array[l.
JO] of integer; {объявляем тип}{объявляем переменную}Var a:mas;Ограничения на количество индексов в Borland Pascal нет. Однако суммарная длина массива не должна превышать 65537 байт.Значения элементов массива в программе можно определить тремя способами. Во-первых, массив может быть инициализирован с использованиемтипизированных констант или просто присваиванием значений элементам.Во-вторых, элементы массива могут быть введены с клавиатуры или из файла (см. главу 6). В-третьих, элементы массива могут быть вычислены,например, сгенерированы с использованием датчика случайных чисел, рассчитаны по заданным формулам и закономерностям, а также скопированы издругого массива.Инициализация массивов.
Для объявления инициализированных массивов в Borland Pascal используют типизированные константы. При этом соответствующие значения указывают в скобках через запятую. Значения элементов многомерных массивов перечисляют в порядке возрастания индексов784, Структурные типы данныхсправа налево, заключая в скобки каждый подмассив. Для матриц такой порядок соответствует построчному указанию значений. Например:Const а: arrayfl..5Jo/real = (0,-3,6,7.8,3.789,5.0);b: arrayfboolean, L.5,]ofreal = ((0,-3.6,7.8,3.789,5.0),(6.1,0,-4.56,8.9,3.0));{массив будет инициализирован следующим образом:Ь false,! " О' bfaise,2= "3.6, bfaise,3 = 7.8, ..., b ^^ue,! = 6.1, и Т.д.}c:array[1..3,0..1,-2..1]ofbyte = (((3,6,9,6),(0,4,3,9)),((5,7,3,1),(45,8,0,2)),((5,9,2,3),(1,5,8,4)));...Операции над массивами.
Над массивом в целом определена единственная операция ~ операция присваивания.Присваивание массивов заключается в копировании элементов одногомассива в другой. Эту операцию можно выполнять только над массивами одного типа.Массивы считаются совпадающими по типу, если они объявлены череззапятую в одной строке, например:Var а, Ь: array[boolean] of real;... a:-b;...или, если вначале объявлен тип массива, а затем массивы этого типа:Туре mas =аггау[boolean] of real;Const a:mas=(3.6, -5.1);Var b: mas;... b-a;...Доступ к элементам массива.
Работа с массивом, как правило, сводитсяк действиям над его элементами. Для обращения к конкретному элементумассива необходимо указать имя массива и значения индексов элемента вквадратных скобках через запятую, например:Vara:array[char,boolean]ofreal; {объявляем матрицу}... a[^A\true]:=5.1;... {присваиваем значение элементу адд^ц^}Значения индексов можно указать непосредственно литералом, например а[3], или косвенно, указав идентификатор переменной, которая содержит,значение индекса, например a[i] (рис.
4.3).Косвенное задание индексов позволяет реализовывать последовательную обработку элементов массивов. Причем, поскольку интервал измененияиндекса определен при объявлении массива, для этого обычно применяют79Часть I. Основы алгоритмизации и процедурное программированиеа 121 3.5 -5.13048.45-0.364.9а13.52-5.130458.4 |-0.361 ^^iа[3]a[i] -^Ъ\Рис. 4.3. Прямая (а) и косвенная (б) адресация элементов массивациклы с заданным количеством повторений. Параметр же цикла используютв качестве переменной косвенной адресации массива, например:Var a:array[L.6] of integer;...for /V=7 to б do a[i]:=i;... {при i=l a| присваивается 1,при i=2 a2 присваивается 2при i=3 аз присваивается З'и т.д.}Количество переменных, необходимых для косвенной адресации массивов, совпадает с размерностью массива.
Так, для работы с матрицами используют две переменные, хранящие индексы: одну-для хранения номеровстрок, а вторую - номеров столбцов.Примечание, Из многомерных массивов допускается выделять подмассивы, отбрасывиндексы, записанные справа, и оставляя индексы, определяющие данный подмассив. Так, изматрицы можно выделить строку, но нельзя - столбец, например:Туре mas=array[boolean] of real; {массив из двух вещественных чисел}Const a:array[L.2]ofmas^((3.6,-5,l),(7.0,-4.2)); {матрица из четырехвещественных чисел}Var b:mas;Begin b:=a[IJ;... {в массив b скопирована первая строка матрицы а}Ввод-вывод массивов.
Ввод-вывод массивов выполняют поэлементно,используя циклы с заданным числом повторений, например:Var a:array[L.5] of real;Beginfor i:-l to 5 do Read(afiJ); {осуществляем ввод массива}ReadLn;{очищаем буфер ввода, чтобы далее значения вводилисьсо следующей строки (см. параграф 2.6)}Значения элементов массива вводят в порядке обращения к ним из цикла, например для цикла, показанного выше: а|, а2, аз, а4, аз- Эти значения могут задаваться в одной строке через пробел или с нажатием клавиши Enterпосле ввода одного или нескольких чисел.804. Структурные типы данныхНапример:^) 2_-6_8_56_34 J - символ «J» означает нажатие клавиши Enter;6)2 J-6 J8 J56 J34 JПри выполнении операций ввода-вывода матриц и массивов большойразмерности целесообразно вводить и выводить значения построчно.Например:Var a:arrayfl..5, LJ] of real; {матрица a из 5 строк по 7 элементов}Beginfor /;=7 to 5 do{цикл ввода строк массива: aj, а2, аз, а4, аз)beginforj:-l to 7 do{цикл ввода элементов i-й строки:}Read(a[iyj]);{aj j , aj 2, a,-3, aj 4, aj 5, a^ 5, aj 7}ReadLn; {очищаем буфер ввода}end;...Пример 4.L Разработать программу определения максимального элемента массива А(5) и его номера.Вначале элементы массива необходимо ввести.
Для выполнения этойоперации используем цикл с заданным числом повторений.Поиск максимального элемента выполним следующим образом. Запомним в качестве максимального, т. е. запишем в атах первый элемент и зафиксируем в imax его номер. Затем будем последовательно просматривать элементы массива, сравнивая их со значением, хранящимся в атах. Если очередной элемент больше значения в атах, то сохраняем его в качестве максимального в атах и запоминаем его номер в imax (рис. 4.4). Для организациипоследовательного просмотра используем цикл с заданным числом повторений, изменяя переменную цикла от 2 до 5, так как первый элемент мы ужеучли.
Просмотрев все элементы массива, найдем максимальный элемент иего номер. После этого необходимо вывести на экран исходный массив, максимальный элемент и его номер.На рис. 4.5 представлена схема алгоритма программы. Поскольку операции ввода-вывода массивов выполняют однотипно, на схеме алгоритма соответствующих циклов, так же как и запросов на ввод данных, обычно не показывают. Вместо этого в схему вставляют блок операции ввода/вывода, в81Часть 1.
Основы алгоритмизации и процедурное программированиеатах|3.5|imaxш1——!121 3.5 -5.13048.45-0.3amax8.4maxiL "J*aUU123.5 -5.13048.45-0.3iLiJбРис. 4.4, Поиск максимального элемента массива:а - состояние на момент проверки четвертого элемента массива; б - изменение текущего значениямаксимального элемента и его номера по результатам проверки четвертого элемента массивакотором указано имя массива и количество элементов, участвующих воперации.
Ниже приведен текст программы.Рис. 4.5. Схема алгоритмапоиска максимальногоэлемента массива82Program ex;Var a:array[l.,5] of real;amax:real;/, imax:byte;Begin{запрос на ввод массива}WriteLn(*Введите 5 чисел: *);{ввод элементов массива}for /.-=7 to 5 do Read(a[i]);ReadLn;{поиск максимального элемента}amax:=aflj;imax:-J;for i:=2 to 5 doifa[i]>amax thenbeginamax:=a[ij;imax.'^i;end;{вывод массива}WriteLnCИсходные данные: *);for /.•=; to 5 do Write(a[i]:5:2);WriteLn;{вывод результата}WriteLnCМаксимальный элемент равен \атах:5:2, \ его номер равен \ imax);End4. Структурные типы данных3.1 5.7 8.1 -0.7 3.64.3 6.8 -0.3 5.7 9.23 6.4 2.7 5.5 -5.3 2.74 5.1 -2.7 7.71.7 5.1123412а19.825.7 112.016.9бРис.
4.6. Исходные данные (а) и результат (б) примера 4.2Пример 4.2. Разработать программу вычисления сумм элементов строкматрицы А(4,5). Полученные суммы записать в новый массив В.Итак, нам задана матрица, имеющая 4 строки и 5 столбцов (рис. 4.6, а).Требуется сформировать одномерный массив В из четырех элементов, который будет содержать суммы элементов строк (рис.
4.6, б). Распечатать результат лучше так, чтобы суммы были выведены после соответствующейстроки матрицы, как на рис. 4.6.Программа должна начинаться со ввода матГ Начало Jрицы. Основной цикл программы - цикл по строкам. Переменная цикла i в нем будет изменяться от/Ввод71 до 4. Дпя каждой i-й строки в этом цикле долж/А(4,5) /но выполняться суммирование элементов. Суммирование будем осуществлять методом накопления,=1,4,1для чего перед суммированием обнулим соответj1jствующий i-й элемент массива В, а затем в циклевыполним добавление элементов строки.