КРИПТОГРАФИЯ. Лабораторная работа 7- 8 БАС 18. Реализация на языке turbopascal ввода и вывода элементов массивов
Скачать 140.16 Kb.
|
Лабораторная работа № 7 Тема: Реализация на языке TURBO-PASCAL ввода и вывода элементов массивов. Цель: Освоить типовые приемы ввода и вывода элементов массивов. Задание: Ввести элементы одномерного массива размером 15 с клавиатуры и вывести на печать в столбик. Ввести элементы одномерного массива размером 30 как значения произвольной функции и вывести на печать в несколько строчек. Ввести элементы двухмерного массива произвольной структуры с общим размером не менее 30 с использованием генератора случайных чисел в произвольном диапазоне. Вывести массив на печать в виде матрицы. Из элементов матрицы размером не менее 30 элементов по произвольному условию сформировать вектор. Структуры ввода и вывода матрицы и вектора выбрать самостоятельно. Вывести на печать исходную матрицу и полученный вектор. Из элементов вектора размером не менее 30 элементов сформировать матрицу того же размера и произвольной структуры. Структуры ввода и вывода и вектора и матрицы выбрать самостоятельно. Вывести на печать исходную и полученную матрицу. Ход работы: 1. Понятие о массивах В отличие от простых переменных, описывающих одну величину, существуют индексированные переменные, описывающие одним именем совокупность величин одного смысла. В этом случае вводится понятие массива. Массивом называется совокупность объектов одной природы, обозначенных одним именем. При этом значения элементов одной природы, называемые элементами массива, располагаются упорядоченно. Упорядоченность заключается в том, что элементы массива располагаются в соседних ячейках оперативной памяти. Поиск элемента массива осуществляется по его имени и индексу. Индекс является по существу номером элемента в массиве. Массивы характеризуются двумя параметрами - размерностью и размером. Размерность указывает на порядок расположения элементов массива в операторной памяти. Различают массивы одномерные (размерность=1), двухмерные (размерность=2) и многомерные (размерность >2). Размер указывает на количество элементов по каждой координате. Общее количество К элементов в массиве определяется по выражению , где n - размерность массива, М - размер по соответствующей координате. В качестве примера одномерного массива можно привести оценки группы студентов по какой-либо одной дисциплине, например по информатике: 1. Алексеев - 4 2. Баранов - 3 3. Григорьев - 5 4. Дятлов - 2 ..... 20. Яковлев - 4 В этом случае оценки можно представить в виде одномерного массива с общим именем OCENINF. Каждый элемент массива, т.е. оценка соответствующего студента, может быть найдена как элемент массива по его имени OCENINF и индексу, т.е. номеру студента в списке. Например, оценка Алексеева будет находиться как элемент OCENINF[1], оценка Баранова как элемент OCENINF[2] и т.д. Если ввести переменную i, являющуюся индексом элемента массива, то к каждому элементу массива можно обратиться по имени и индексу, т.е. OCENINF[i]. Размерность этого массива равна 1, т.е. для каждого студента приводится оценка по каждому предмету, а размер равен 20, т.е. количеству студентов в группе. В оперативной памяти элементы массива будут расположены в соседних ячейках памяти. Если, например, в данном случае элементы будут располагаться в ячейках, начиная с номера 101, то они займут 20 ячеек и будут расположены следующим образом:
В качестве примера двумерного массива можно привести оценки той же группы студентов по нескольким дисциплинам, например, результаты экзаменационной сессии.
В этом случае результаты можно представить в виде двумерного массива с именем OCENSES. Размер по одной координате - по количеству студентов будет равен 20, а размер по другой координате- количеству предметов будет равен 5. Общее количество элементов в этом массиве будет равно 20 х 5 =100, т.е. его надо разместить в 100 ячейках памяти. Доступ к каждой ячейке будет осуществляться по двум индексам - номеру в списке студентов и номеру в списке предметов. Например, оценка Григорьева по истории находится как элемент массива OCENSES с индексами 3 и 4, т.е. OCENSES[3,4]. Если в качестве индексов ввести переменные i (номер студента в списке) и j (номер предмета), то доступ к любому элементу можно осуществить по указанию элемента массива и его индексов –OCENSES[i,j]. В разных языках программирования элементы двумерного массива располагаются в оперативной памяти по разному. В языке TURBO-PASCAL элементы располагаются по строкам и столбцам. В данном примере в ячейках ОЗУ сначала будут расположены оценки студента Алексеева, затем Баранова и т.д. Если данный массив располагается в ячейках с но- мера 101 до номера 200, то элементы расположены следующим образом: ЭЛЕМЕНТ МАССИВА НОМЕР ЯЧЕЙКИ Ocenses[1,1] 101 Ocenses[1,2] 102 ... Ocenses[1,5] 105 Ocenses[2,1] 106 Ocenses[2,2] 107 ... Ocenses[2,5] 110 ... Ocenses[20,1] 196 Ocenses[20,2] 197 ... Ocenses[20,5] 200 Для выделения в оперативной памяти места под элементы массива необходимо зарезервировать под массив ячейки. Во всех языках программирования такая операция осуществляется посредством объявления массива в начале программы или перед первым обращением к массиву. Массивы в TURBO-PASCAL во многом схожи с массивами в других языках программирования. Отличительной особенностью массивов в TURBO-PASCAL является то, что массив объявляется в разделе описаний и относится к структурированным типам. Объявить массив можно в одной из двух частей раздела описаний: в части Type. в части Var. В части Type осуществляется описание типа массив, который задается следующим образом: < имя типа >=ARRAY[<сп. инд. типов>] OF <тип>, где <имя типа> идентификатор типа; ARRAY, OF - зарезервированные слова (массив, из); <сп. инд. типов> список из одного или нескольких индексных типов, разделенных запятыми. Список индексов помещается в квадратные скобки; <тип> -любой тип TURBO-PASCAL. В качестве индексных типов используется тип-диапазон или любой другой порядковый тип. Например, одномерный массив оценок OCENINF из двадцати элементов целого типа (оценок) можно описать: type oceninf=Array[1..20] of Integer; В этом случае массив необходимо объявить как объект программы (как идентификатор имени массива) в разделе var: var mas1: oceninf; Определить переменную как массив можно и непосредственно в разделе переменных при описании этой переменной, без предварительного описания типа массива. Формат объявления в этом случае следующий: < имя массива>:ARRAY[<сп. инд. типов>] OF <тип>, где <имя типа> идентификатор типа; ARRAY, OF - зарезервированные слова; <сп. инд. типов> список из одного или нескольких индексных типов; <тип> - любой тип TURBO-PASCAL. В этом случае двухмерный массив результатов сессии OCENSES можно объявить следующим образом: var ocenses: Array[1..20,1..5] of Integer; Типом элементов массива может быть и другой массив. Например, двухмерный массив OCENSES в TURBO-PASCAL можно представить как одномерный массив из двадцати элементов, при чем элементы этого массива будут сами массивами из 5-ти элементов: Туре ocenses=Array[1..20] of Array[1..5] of Integer; Такая запись для двумерного массива может быть заменена более компактной: Туре ocenses=Array[1..20,1..5] of Integer; или var ocenses: Array[1..20,1..5] of Integer; Глубина вложения массивов в общем случае не ограничена, т.е. можно использовать массивы произвольной размерности. Ограничения на размерность и размер массива связаны с ограничениями на структурированные типы - суммарная длина внутреннего представления массива не может быть больше 65520 байт (64к) - максимального размера для структурированных типов. Объявление массива различным способом связано с его использованием непосредственно в программе. Если в программе используется один массив определенной структуры, то его целесообразно объявлять в разделе var. Если же в программе используется несколько массивов одинаковой структуры, их целесообразно объявлять в разделе type. Например, в программе осуществляется обработка результатов сессии трех учебных групп. В этом случае в разделе type необходимо задать тип массив с именем, например, OCENSES, а в разделе var задать для каждой группы свое имя массива, например gr1,gr2,gr3: type ocenses=Array[1..20,1..5] of Integer; var gr1,gr2,gr3: ocenses; В программировании массивы связаны с математическими понятиями матрица и вектор. При использовании в программе матрицы она представляется как двухмерный массив, а вектор как одномерный массив. Размер массивов определяется размерами матрицы или вектора. Тогда пример описания матрицы А размером 56 будет следующим: type matr= Array[1..5,1..6] of Real; var A: matr; или var A: Array[1..5,1..6] of Real; В TURBO-PASCAL можно одним оператором присваивания передать элементы одного массива другому массиву того же типа, например: a: Array [1..10] of Real; b: Array [1..10] of Real; .... a:=b; После этого присвоения все элементы массива А получают значения элементов массива B с соответствующими индексами. Поскольку массивы являются упорядоченной структурой с заданной организацией, то обычно работа с элементами массивов осуществляется единообразно в циклах, при этом работа с элементами одномерного массива осуществляется в одном цикле, а работа с элементами двухмерного массива осуществляется в двух вложенных циклах. 2. Ввод и печать элементов массивов языке TURBO-PASCAL Работа с элементами массива в программе возможна в том случае, если этим элементам заданы значения. По умолчанию (т.е. без ввода значений) элементам массива задаются значения 0. Значения элементов массива в программе можно задать следующими способами: Ввод с клавиатуры с использованием процедуры Read. Ввод операцией присвоения. Ввод с использованием типизированной константы. Ввод формированием из элементов другого массива. 2.1. Ввод с клавиатуры Для ввода элементов массива с клавиатуры используют процедуру, Read по умолчанию осуществляющую чтение данных, вводимых с клавиатуры. Поскольку процедура Read является “тёмной” процедурой, то, для удобства ввода данных, вводимые значения надо сопровождать пояснительным текстом, т.е. перед вводом каждого значения на экран, должен быть выведен текст, например, "Введите 3-ий элемент массива". Алгоритмически процедура ввода элементов одномерного массива будет выглядеть следующим образом: Рис. 26 Блок-схема ввода элементов одномерного массива В программе для ввода элементов массива используется счетный оператор цикла For. В качестве параметра цикла используется индекс элементов массива i . Процедура на TURBO-PASCAL вывода одномерного массива OCENINF: Program vvod_1; Var oceninf: Array[1..20] of Integer; i: Integer; Begin For i:=1 to 20 do Begin WriteLn('Введи ',i:2,'-ый элемент массива'); Read(oceninf[i]); End; ... Элементы двух разных массивов одинакового размера можно вводить в одном цикле. Если вместе с массивом оценок OCENINF вводить массив FAM фамилий студентов, получивших эти оценки, эта процедура будет выглядеть следующим образом: Program vvod_2; Var fam: Array[1..20] of string[15];(*max. длина фамилии 15 символов*) oceninf: Array[1..20] of Integer; i: Integer; Begin For i:=1 to 20 do Begin WriteLn('введи фамилию ',i:2,'-го по списку студента'); Read(fam[i]); WriteLn('введи оценку студента ', fam[i]); Read(oceninf[i]); End; … Ввод элементов двумерного массива осуществляется в двух вложенных циклах процедурой Read . Поскольку элементы двумерного массива располагаются в ячейках оперативной памяти по строкам и столбцам, то параметром внешнего цикла будет индекс i (строки), а параметр внутреннего цикла - j (столбцы). Рассмотрим пример ввода элементов матрицы A размером 4×5. В описании массива в качестве индексов могут быть использованы как числа, так и идентификаторы. При использовании идентификаторов они должны быть предварительно определены. В приведенном примере для объявления количества строк и столбцов используем идентификаторы n и m. В программе, поскольку массив объявляется в разделах type или var, значения n и m должны быть заданы в разделе описания const. Алгоритм и программа ввода элементов двухмерного массива будет следующей: Рис. 27 Блок-схема ввода элементов двухмерного массива Program vyvod3; Const n=4; m=5; Var A: Array[1..n,1..m] of Real; i,j: Integer; Begin For i:=1 to n do For j:=1 to m do Begin WriteLn('введи ',j:1,'-ый элемент ',i:1,'-ой строки'); Read(A[i,j]); End; … 6.2.2. Ввод операцией присвоения Такая структура ввода используется в том случае, если элементы массива вычисляются в программе. Для примера можно рассмотреть формирование одномерного массива с именем Massin размером в 10 элементов, в котором значения массива вычисляются как значения фннкции Y=sinx+cosx для x, изменяющегося от 10о с шагом x=5о. Алгоритм и программа ввода в этом случае будут следующими: Рис. 28 Блок-схема формирования одномерного массива Program vvod_pr1; Var Massin: Array[1..10] of Real; x: Real; i: Integer; Begin x:=10; For i:=1 to 10 do Begin Massin := sin(x*pi/180)+cos(x*pi/180); x:=x+5;End; …… Для многих задач требуется, чтобы значения элементов массива были произвольными числами в фиксированном диапазоне. Для формирования элементов такого массива можно использовать функцию Random языка TURBO-PASCAL. Функция Random имееет две формы: Форма Random генерирует псевдослучайные числа с нормальным распределением в диапазоне [0÷1]. Тип генерируемых чисел вещественный. Форма Random(N) генерирует псевдослучайные числа с нормальным распределением в диапазоне [0÷N]. Тип числа N и генерируемых чисел целый. Исходя из требований типа элементов массива (вещественный, целый), можно использовать одну из этих форм генерирования случайных чисел. Поскольку форма Randomдля генерирования вещественных чисел имеет ограниченный диапазон [0÷1], а в большинстве задач требуется более широкий диапазон, для реализации такого диапазона необходимо ввести множитель, задающий диапазон, и задать смещение диапазона. Например, для формированя значений одномерного массива A вещественного тапа случайными числами в диапазоне [-10÷ +15] необходимо записать следующее выражение: A(i):= 25*Random –10; Если задать значение верхней и нижней границ диапазона генерируемых чисел переменными P=15 и Q= -10, то предыдущее выражение можно записать в следующем виде: A(i):= (P-Q)* Random +Q; При генерировании элементов массива целого типа в указанном диапазоне выражение будет A(i):= Random(25) –10; или A(i):= Random(P-Q) +Q; В программе, использующей функцию Random, необходимо предварительно осуществить инициализацию генератора случайных чисел процедурой Randomize. Алгоритм и фрагмент программы для формирования элементов двухмерного массива B[1:4,1:5] ( матрица размером 4 строки, 5 столбцов) вещественного типа в произвольном диапазоне будут следующими: Program vyvod4; Const n=4; m=5; Var B:Array[1..n,1..m] of Real; P,Q: Real; i,j: Integer; Begin Randomize; WriteLn(‘Введи значение нижней границы диапазона'); Read(Q); WriteLn(‘Введи значение верхней границы диапазона'); Read(P); For i:=1 to n do For j:=1 to m do B[i,j]:=(P-Q)*random+Q; … Рис. 29 Блок-схема формирования элементов двухмерного массива 6.2.3. Ввод с использованием типизированной константы Такой способ ввода используется в том случае, если значения массива фиксированы и не изменяются в ходе исполнения программы. В этом случае структура, тип и значения элементов массива задаются в разделе const раздела описаний программы. При объявлении массива множество констант, соответствующих каждому измерению, заключается в дополнительные круглые скобки и отделяется от соседнего множества запятыми. Например, задание одномерного массива А целого типа, содержащего 10 элементов, будет выглядеть следующим образом: Program vyvod31; Const A: Array [1..10] of Integer = (3, -6, 4, 7, 0, -6, -1, 18, -15, 5); Задание двухмерного массива В размером 43 вещественного типа: Program vyvod32; Const B: Array [1..10] of Real = ((-5.4, 2.005, 6.9, -1.1), (8.9, 5.53, -6.32, -12.7), (-4.9, 0.0, 8.5, -6.953)); 6.2.4. Печать элементов одномерного массива Печать элементов одномерного массива осуществляется в одном из трех видов вывода: в столбец, в одну строчку, в несколько строчек. В программе, для вывода элементов массива на экран дисплея или принтер, используется процедуры Write или WriteLn и счетный оператор цикла For , с индексом элементов массива i в качестве переменной цикла. Использование процедур Write и WriteLn зависит от того, в каком виде необходимо вывести элементы массива. Для печати элементов массива в столбец необходимо использовать процедуру WriteLn , осуществляющую переход на новую строку после печати очередного элемента. Для печати в одну строку необходимо использовать процедуру Write, при которой очередной элемент выводимого списка (в данном случае очередной элемент массива) будет помещен в той же строке, что и предыдущий. Для печати в несколько строк в строке печать осуществляется процедурой Write, а после заданного в строке количества элементов осуществляется переход на новую строку процедурой WriteLn без параметров ("пустым" WriteLn или WriteLn (' ') (печать пробела)). Момент перехода на новую строку определяется кратностью индекса i заданному числу элементов в строке. Для определения кратности можно использовать различные условия, наиболее удобным из которых является равенство нулю остатка от целочисленного деления индекса i на число элементов в строке. Например, для печати 6 элементов в строке, условие должно быть следующим: If i mod 6=0 Then WriteLn. Алгоритмически процедура печати в столбик представлена на рис. 30(а). Фрагмент программы печати элементов вектора А вещественного типа в столбик будет следующим: WriteLn (‘Исходныймассив’); For i:=1 to 10 do WriteLn(i:2,’-йэлементмассиваравен ‘,A[i]:4:1); В столбик можно вывести результаты экзамена по информатике. Программа ввода и печати результатов экзамена будет следующей: Program vvodvyvod1; Var fam: Array[1..20] of string[15]; oceninf: Array[1..20] of Integer; i: Integer; Begin For i:=1 to 20 do Begin WriteLn('введи фамилию ',i:2,'-го по списку студента'); Read(fam[i]); WriteLn('введи оценку студента ', fam[i]); Read(oceninf[i]); End; WriteLn('Оценки студентов группы по информатике'); For i:=1 to 20 do WriteLn(fam[i],oceninf[i]:1); End. Рис. 30 Печать элементов массива в одну строчку осуществляется в том случае, если элементов немного и они помещаются в одну строчку. Элементы в строке должны отделяться один от другого пробелом, который должен быть предусмотрен в формате печати. Алгоритмически процедура печати в одну строку представлена на рис. 25(б). Фрагмент программы печати элементов вектора А вещественного типа в строку будет следующим: WriteLn (‘Исходныймассив’); For i:=1 to 10 do Write (A[i]:4:1,’ ‘); WriteLn; Пустая процедура WriteLnза циклом печати вектора переводит указатель печати на новую строку с тем, чтобы новая печать не продалжалась в той же строке, что и печать вектора. Печать вектора в несколько строк осуществляется для большого вектора. Число элементов в строке выбирается в зависимости от формата представления числа и из эргонометрических соображений. Алгоритм процедуры печати вектора в несколько строк приведен на рис. 25(в). Фрагмент программы печати элементов вектора А вещественного типа из 30 элементов в 5 строк по 6 элементов будет следующим: WriteLn (‘Исходныймассив’); For i:=1 to 10 do Begin Write (A[i]:4:1,’ ‘); If i mod 6=0 Then WriteLn; End; WriteLn; 6.2.5. Печать элементов матрицы Вывод на экран или принтер значений элементов двухмерного массива осуществляется в двух вложенных циклах процедурами Write и WriteLn. Если двумерным массивом является матрица, то вывод на экран или принтер должен осуществляться в естественном виде, по строкам и столбцам. В этом случае вывод матрицы аналогичен выводу одномерного массива в несколько строк: вывод одной строки матрицы осуществляется процедурой Write во внутреннем цикле. После завершения строки "пустой" процедурой WriteLn осуществляется перевод печати на новую строку. Алгоритмически процедуры ввода и вывода элементов двухмерного массива B выглядят следующим образом: Рис. 31 Блок-схема ввода и вывода элементов двухмерного массива B Программа на TURBO-PASCAL: Program vyvod4; Const n=4; m=5; Var B:Array[1..n,1..m] of Real; P,Q: Real; i,j: Integer; Begin Randomize; WriteLn(‘Введи значение нижней границы диапазона'); Read(Q); WriteLn(‘Введи значение верхней границы диапазона'); Read(P); For i:=1 to n do For j:=1 to m do B[i,j]:=(P-Q)*random+Q; WriteLn('Исходная матрица'); For i:=1 to n do Begin For j:=1 to m do Write(B[i,j]:6:2,' ');(*печать строки матрицы*) WriteLn(' '); (*перевод печати на новую строку*) End; End. Внутри одной процедуры ввода или вывода элементов двумерного массива можно осуществить ввод и вывод элементов двумерного массива. Например, если необходимо ввести и распечатать результаты экзаменационной сессии студентов группы, можно создать три массива: двумерный массив OCENSES - оценок по всем предметам, и два одномерных массива: FAM- массив фамилий студентов группы и PREDM- массив предметов, по которым получены оценки. Для массива PREDM необходима отдельная процедура ввода и вывода, а массив FAM можно вводить во внешнем цикле процедуры ввода массива OCENSES. Программа ввода и печати результатов сессии будет следующей: Program rezultaty_sesii; Var predm: Array[1..5]of string[11];(*max длина названия предмета 11 символов*) fam: Array[1..15]of string[15];(*max длина фамилий 15 символов*) ocenses: Array[1..15,1..5]of Integer; i,j: Integer; Begin For j:=1 to 5 do Begin WriteLn('введи название ',j:1,'-го предмета'); Read(predm[j]); End; For i:=1 to 15 do Begin WriteLn('введи фамилию ',i:1,'-го студента'); Read(fam[i]); For j:=1 to 5 do Begin WriteLn('введи оценку студента ',fam[i],' по дисциплине ',predm[j]); Read(ocenses[i,j]) End; End; WriteLn('РЕЗУЛЬТАТЫ СЕССИИ'); Write(' '); For j:=1 to 5 do Write(predm[j]:11,' '); WriteLn(' '); For i:=1 to 15 do Begin Write(fam[i]:15,' '); For j:=1 to 5 do Write(' ',ocenses[i,j]:1,' '); WriteLn(' '); End; End. 6.2.6. Ввод формированием из элементов другого массива Формирование нового массива из элементов существующего массива обычно осуществляется по какому-то заданному условию. В этом случае элементами нового массива становятся только элементы, удовлетворяющие заданному условию и, соответственно, количество элементов и индексы исходного и формируемого массивов не совпадают. Структура исходного и формируемого массивов может быть разной. Рассмотрим различные примеры формирования массивов. Пример. Дана матрица A[ 1:5, 1:4], сформированная из случайных вещественных чисел в диапазоне [ -15+15]. Из положительных чисел матрицы сформировть вектор B. Для решения этой задачи необходимо: Объявить исходный и формируемый массивы. Исходным является двухмерный вещественный массив размером [ 1..5, 1..4]. Формируемым будет одномерный массив, размер которого заранее неизвестен, т.к. он формируется по условию. В таком случае размер формируемого массива задается по размеру исходного, и в данном случае его размер будет [ 1..20]. Ввести и распечатать значения исходного массива. Задать счетчик индексов формируемого массива. В двух вложенных циклах просматривать элементы исходного массива, выбирать элементы, отвечающие условию формирования нового массива, и из этих элементов формировать новый массив, увеличивая при этом на 1 значение счетчика индексов формируемого массива. Вывести на печать значения сформированного массива. Алгоритм и программа этой задачи будут следующими: Program vyvod4; Var a: Array[1..4,1..5] of Real; b: Array[1..20] of Real; i,j,k: Integer; Begin Randomize; For i:=1 to 4 do For j:=1 to 5 do a[i,j]:=30*random-15; WriteLn('Исходная матрица'); For i:=1 to 4 do Begin For j:=1 to 5 do Write(a[i,j]:6:2,' '); WriteLn(' '); End; k:=0; For i:=1 to 4 do For j:=1 to 5 do If a[i,j]>0 Then Begin k:=k+1; b[k]:=a[i,j];End; WriteLn('Полученный вектор'); For i:=1 to k do Begin Write (b[i]:4:1,' '); If i mod 5=0 Then WriteLn; End; WriteLn; End. Рис. 32 Блок-схема значения сформированного массива. Пример. Дан вектор B[1:25], содержащий значения целого типа в диапазоне [-20+20]. Из положительных чисел вектора B сформировть матрицу A[1:5, 1:5]. Недостающие значения матрицы заполнить нулями. В данном случае формируемым массивом является двухмерный массив, содержащий значения матрицы. Матрица является структурой, с жестко заданной организацией, т.е. в данном случае матрица должна содержать 25 элементов. В связи с этим, в исходном массиве должно быть количество элементов, не меньшее, чем в формируемом. Поскольку в данном примере матрица формируется по условию, то недостающие элементы матрицы должны быть заполнены заданными значениями, в данном случае нулями. В отличие от формирования вектора, формирование матрицы осуществляется во вложенных циклах по структуре матрицы. Для выбора элементов исходного вектора используется дополнительный счетчик индексов исходного вектора. В общем случае, для формирования матрицы из вектора необходимо выполнить следующие действия: Объявить исходный и формируемый массивы. Размеры обеих массивов заранее известны. Ввести и напечатать значения исходного массива. Задать счетчик индексов исходного массива. В двух вложенных циклах по формируемой матрице просматривать элементы исходного массива, выбирать элементы, отвечающие условию формирования нового массива, и из этих элементов формировать новый массив, увеличивая при этом на 1 значение счетчика индексов исходного массива. Вывести на печать значения сформированного массива. В данном примере не будем рассматривать известные процедуры ввода и печати элементов исходного массива, а также печати сформированного массива. Фрагменты алгоритма и программы формирования матрицы из вектора будут следующими: Рис. 33 Блок-схема алгоритма и программы формирования матрицы из вектора k:=0; For i:=1 to 5 do For j:=1 to 5 do Begin k:=k+1; If b[k]>0 Then a[i,j] :=b[k] Else a[i,j] :=0; End; Пример. Дана матрица A[1:5, 1:5], содержащая значения целого типа в диапазоне [-20+20]. Из элементов матрицы, находящихся в диапазоне [-10+10], сформировть матрицу B[1:3, 1:4]. Недостающие значения матрицы заполнить верхним значением диапазона формируемой матрицы. Как и в предыдущем случае, здесь формируется массив с фиксированной структурой. Формирование матрицы одной структуры из матрицы другой структуры целесообразно осуществлять через промежуточный одномерный массив. В данном случае из матрицы A по заданному условию формируется одномерный массив С, а затем из элементов этого массива формируется двухмерный массив B. Если в массиве С элементов меньше, чем должно быть в массиве B, то недостающие элементы массива С заполняются числом 10, т.е. верхним значением диапазона формируемой матрицы. В общем случае, для формирования матрицы из матрицы необходимо выполнить следующие действия: Объявить исходный, формируемый и промежуточный массивы. Размеры исходного и формируемого массивов заранее известны, а промежуточный массив задается по размеру исходного. Ввести и напечатать значения исходного массива. Задать счетчик индексов промежуточного массива. В двух вложенных циклах по исходной матрице просматривать элементы исходного массива, выбирать элементы, отвечающие условию формирования нового массива, и из этих элементов формировать промежуточный массив, увеличивая при этом на 1 значение счетчика индексов промежуточного массива. Задать промежуточный счетчик индексов для формирования новой матрицы. В двух вложенных циклах по формируемой матрице по промежуточному счетчику индексов выбирать значения из промежуточного вектора и из них формировать значения новой матрицы. В каждом цикле поисходит сравнение значения промежуточного счетчика индексов с числом элементов в промежуточном векторе. При превышении счетчиком числа элементов, значения нового массива заполняются числом 10. Вывести на печать значения сформированного массива. Фрагменты алгоритма и программы формирования матрицы из матрицы будут следующими: Рис. 34 Блок-схема фрагменты алгоритма и программы формирования матрицы из матрицы k:= 0; For i:=1 to 5 do For j:=1 to 5 do If (a[i,j]>-10) AND (a[i,j]<10) Then Begin k:=k+1; b[k] :=a[i,j]; End; l:=1; For i:=1 to 3 do For j:=1 to 4 do If l<=k Then Begin b[i,j] :=c[l]; l:=l+1; End Else b[i,j] :=10; Вопросы для самоконтроля: Понятие массивов. Способы объявления массивов в TURBO PASCAL. Способы ввода элементов массивов языка TURBO PASCAL. Как организовать вывод элементов вектора в несколько строк. Как организовать вывод элементов матрицы. Как формировать вектор из элементов другого массива по условию. Способы формирования матрицы из вектора. Способы формирования матрицы из другой матрицы. Лабораторная работа № 8 |