Лекция 7.++Массивы в качестве параметров подпрограмм. Файлы. (Воробьева И.А. - Информатика. Язык Паскаль)
Описание файла
Файл "Лекция+7.++Массивы+в+качестве+параметров+подпрограмм.+Файлы." внутри архива находится в папке "Воробьева И.А. - Информатика. Язык Паскаль". PDF-файл из архива "Воробьева И.А. - Информатика. Язык Паскаль", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
1Воробьева И.А. «Информатика. Язык Паскаль»6.4. Массивы в качестве параметров подпрограммВажно! Параметром процедуры может быть любая переменнаяпредопределенного типа, это означает, что для передачи в процедурустатического массива или матрицы в качестве параметра, тип егодолжен быть описан заранее.Действительно, тип integer или real – это простыепредопределенныетипы.Массивыжеотносятсякструктурированным типам переменных, к которым также относятсязаписи,множества,файлы.Общийметодполученияструктурированных переменных – это объединение компонентов,принадлежащих к произвольным (возможно тоже составным)типам, в один составной тип.Статический массив может содержать как простые однотипныеэлементы, такие как integer, real, char…, так и сложные – массивзаписей или массив массивов (один из видов представления матрицы).Никто не запретит нам объявить и массив из матриц, а это ужетрехмерный массив.
Более того, число компонент в массивах мыопределяем с помощью типа диапазон произвольным способом,например: «array[1..n, 1..m] of real» или «array[1..5] of integer».Подобные определения никак не относятся к предопределеннымтипам, они называются пользовательскими типами, которые мы задаемсами.Таким образом, прежде чем использовать статические массивы вкачестве параметров подпрограмм, необходимо описать нужные типыв специальном разделе type программы.Примеры различных описанийconstn=10; m=7;type// ---------- раздел описаний пользовательских типов -----12Воробьева И.А.
«Информатика. Язык Паскаль»massR = array[1..n] of real;// тип – одномерный массивиз n вещественных чиселmassI = array[1..5] of integer; // тип – одномерный массивиз 5 целых чиселmatrixR= array[1..n, 1..m] of real; // тип – матрица вещественныхчисел размерности (n, m)QmatrixI= array[1..3, 1..3] of integer; // тип – квадратная матрицавещественных чисел размерности (3, 3)Замечание 6.1.
Матрицу можно задать и другим способом. Например,если считать ее не двумерным массивом однотипных элементов, аодномерным массивом, каждый элемент, которого сам являетсяодномерным массивом.Пример объявления матрицы в форме «массива массивов»VECTOR = array[1..m] of real; // тип – вектор из m вещ. чиселDUB= array[1..n] of VECTOR; // массив из n одномерных массивовтипа VECTORилиn строк длины m (матрица [n, m])илиn столбцов длины m (матрица [m, n])VAR//---------------- объявление переменных ---------------Vec: VECTOR;// вектор из m вещ. чиселM: DUB;// массив из n одномерных массивов типа VECTORrez: real;grad: matrixR; // матрица вещественных чисел размерности (n, m)Number: massI;// одномерный массив из 5 целых чиселR1, R2: massR; // одномерные массивы R1 и R2 из n вещ. чиселKol: QmatrixI ;// объявлена матрица размерности (3, 3)//---------------- раздел процедур и функций ----------------------23Воробьева И.А. «Информатика.
Язык Паскаль»procedure primer1 (out A: massR);procedure primer2 (var B: massI, var Sum: QmatrixI);function primer3 (const C1, C2: matrixR): integer;procedure primer4 (var M1: DUB);BEGIN//------------- раздел операторов ----------…primer1 (grad);primer2 (Number, Kol);rez:= M[1][2]; // присвоили вещественное числоVec:=M[2];// присвоили вещественный вектор длины m…END.Последнее, что важно напомнить о работе с массивами и матрицами вподпрограммах – это то, что параметры в подпрограммы могут бытьпереданы двумя основными способами: по значению (параметр-значение);procedure primer5 (A: massR, i, j: integer, x: real); по адресу переменной (параметр-переменная и параметрконстанта).procedure primer4 (var M1: DUB);function primer3 (const C1, C2: matrixR): integer;procedure primer1 (out A: massR);Если массив достаточно большого размера, он должен передаваться вподпрограмму только как параметр-переменная или параметрконстанта: если массив в ходе выполнения подпрограммы не изменяется, егонужно описать как параметр-константу; если изменяется – как параметр-переменную.Входные параметры-массивы не описывают как параметры-значения,поскольку это приводит к неоправданному расходу памяти и временина бесполезное копирование.34Воробьева И.А.
«Информатика. Язык Паскаль»Напоминание. Параметр-константа – это не совсем то, что вы привыкливидеть в разделе программы Const. Параметр-константа – этопараметр, который передают в подпрограмму, точно зная, что ондолжен использоваться только как информация, но не долженизменяться.
Своего рода, защита от случайного изменения тойпеременной, которая не должна изменяться подпрограммой, т.е.параметр-константа в физическом представлении может бытьизменяемой переменной.В функции, которая решает задачу «поиск максимума в матрице»,элементы матрицы, передаваемой в функцию, должны быть защищеныот случайного изменения (т.е.
параметр-константа). А в процедуре,которая решает задачу «заменить все отрицательные элементыматрицы нулями», передаваемую матрицу можно и даже нужноменять, т.е. передавать ее надо как параметр-переменную.Подумайте: почему для решения первой задачи была выбранафункция, а для решения второй – процедура?6.5. Примеры программ с массивами в качестве параметровподпрограммТаблица 6.6. Задачи на разработкупрограммы с использованием указанной в задании подпрограммыОбщая задачаСоставить программу с разработкой и использованием указанной взадании подпрограммы.Подпрограмма не должна использовать «внутри себя»глобальных переменных. Все необходимое для работыподпрограммы и передачи результата должно осуществлятьсячерез параметры подпрограммы.Индивидуальная задачаДля каждой из двух матриц: A (2 строки, 4 столбца) и B (3 строки, 3столбца) вычислить и вывести количество отрицательныхэлементов.
Также определить, в какой из них среднееарифметическое значение прочих элементов имеет большуювеличину (вывести одно из сообщений: “больше в A”, “больше в B”45Воробьева И.А. «Информатика. Язык Паскаль»или “одинаково”).ПодзадачаДля вычисления количества отрицательных элементов исреднего арифметического значения прочих элементов матрицыиспользовать подпрограмму.началоввод A(na,ma), B(nb,mb)вывод A(na,ma), B(nb,mb)na, ma, AПОДСЧЕТ ОТРИЦ. ЭЛ. ИСР. АРИФМ.
НЕОТРИЦ.ЭЛЕМЕНТОВ в «A»Otr, SredAвывод Otrnb, mb, ВПОДСЧЕТ ОТРИЦ. ЭЛ. ИСР. АРИФМ. НЕОТРИЦ.ЭЛЕМЕНТОВ в «В»Otr, SredBвывод Otr+SredA < 0ANDSredB < 0−+SredA > SredB+−SredA < SredB−«БОЛЬШЕ в A»«Not SredA, SredB»«БОЛЬШЕ в В»конец«ПОРОВНУ»56Воробьева И.А. «Информатика. Язык Паскаль»Головной модульprogram SRAVN;{--------------определения, необходимые для подпрограммы----------------}constn= 3; // максимум 3 строкиm= 4; // максимум 4 столбцаtypeMatrix = array[1..n, 1..m] of integer;{---------------------сюда позже вставим БЛОК *, а пока только -------------------------------------------заголовок функции с заглушкой-----------------------------}//_________ описание функции//_________ Mt – матрица//_________ n1, m1 – ее размерность//_________ Sred - среднее арифметическое элементов «≥0»//_________ возвращает: Otr - число отрицательных элементовFunction Otr (const Mt: Matrix; n1, m1: byte; out Sred: real): integer;BeginSred:= -1;// заглушка «все элементы отрицательны»Otr:=n1*m1; // значит Sred= -1 – нет неотрицательных элементовEnd;{---------- теперь доопределяем переменные, которые нам нужны в ----------------------------------головном модуле----------}CONSTna=2; ma=4; // реальные размеры матрицы Аnb=3; mb=3; // реальные размеры матрицы BVARA: Matrix=( // объявлена матрица размерности (3, 4),(0, 1, 10, -2),// 1-я строка(10, -10, 0, -7),// 2-я строка(0, 0, 0, 0)// 3-я строка; // НО наша матрица A(2,4) (добавлены нули в фиктивные элементы)67Воробьева И.А.
«Информатика. Язык Паскаль»B: Matrix=(// объявлена матрица размерности (3, 4)(7, -1, 10, 0),// 1-я строка(10, -10, 0, 0),// 2-я строка(0, 0, 0, 0)// 3-я строка; // НО наша матрица B(3,3) (добавлены нули в фиктивные элементы)SredA, SredB: real; // Ср. арифм. неотрицат. элементов в A и BBEGINwriteln('--------Поиск в матрицах А и В ---------'); // заголовок//--------- вывод матриц А(na,ma) и B(nb,mb)// -------- самостоятельно ---------------//--------- вызов решающей подзадачи для Аwriteln('Число отрицательных в А = ', Otr(A, na, ma, SredA):3 );//--------- вызов решающей подзадачи для Bwriteln('Число отрицательных в B = ', Otr(B, nb, mb, SredB):3 );IF (SredA < 0) AND (SredB < 0) then writeln( 'В матрицах A и В всеэлементы отрицательны')ELSEif SredA > SredB then writeln( 'Больше в A')else if SredA < SredB then writeln( 'Больше в B')else writeln( 'Поровну') ;END.Определим все обобщенные данные, которые нам потребуютсядля подзадачи, на основе реальных данных исходной задачи:n1 – максимальное число строк в матрице,m1 – максимальное число столбцов в матрице,;;78Воробьева И.А.
«Информатика. Язык Паскаль»i – индекс строк,Mt–;прямоугольнаяj – индекс столбцов,(n1,m1)матрицаэлементов, причем значения элементов:изцелочисленных;Otr – число отрицательных элементов в матрице,Sred – среднее арифметическое неотрицательных (в матрице,ситуации;;) элементов, и введем признак альтернативной– отсутствие неотрицательных элементов вматрице;Цветом выделены переменные, которые для функции будутвходными и выходными и, следовательно, будут ее параметрами иливозвращаемыми значениями.