[ЗВУК] [ЗВУК] Рассмотрим программу с использованием подпрограммы функции для решения следующей задачи. Нам дана матрица целого типа, которая называется D. Матрица у нас не квадратная, количество строк равно n, а количество столбцов — это m. А также дан целочисленный массив C, длина которого L. Нам нужно сформировать новый массив, который будет содержать элементы тех строк матрицы, у которых номера отсутствуют в нашем массиве. Рассмотрим следующий пример. Пусть у нас вот такая вот матрица, у нее три строки и четыре столбца, то есть это матрица 3 на 4, и одномерный массив C, в котором четыре элемента. Мы с вами последовательно рассматриваем номера строк. У первой строки номер равен 1, и этот номер отсутствует в нашем одномерном массиве, то есть 1 в нашем одномерном массиве нет. Тогда все элементы этой строки последовательно должны быть помещены в новый массив. Пусть новый массив у нас называется B, а длина его будет k. Тогда туда попадают 1, 2, 3 и 4. То есть все элементы, которые расположены в первой строке нашей матрицы. Далее, мы рассматриваем вторую строку, то есть индекс, равный 2. Мы видим, что 2 присутствует в массиве C на первом месте. Значит эти элементы, расположенные во второй строке, в наш новый массив не попадут. Теперь рассмотрим третью строку, то есть индекс равный 3. Мы видим, что 3 отсутствует в нашем массиве, и значит все элементы этой строки последовательно будут записаны в наш новый массив. То есть сначала 0, затем 1, еще раз 1 и 0. Совершенно очевидно, что в некоторых случаях мы с вами не получим нового массива. Тогда, когда у нас все номера строк будут присутствовать в нашем одномерном массиве. Тогда нам нужно будет предусмотреть вывод соответствующего сообщения. Для вычисления нового массива у нас будет использоваться функция. То есть у нас с вами должен быть один выходной параметр, который является результатом нашей функции. Удобно сделать этим выходным параметром длину массива. Потому что если длина нашего массива останется равной 0, то тогда мы с вами сможем легко проверить — сформирован у нас массив или нет. При 0 он не сформирован. Если же длина массива будет отлична от 0, значит у нас есть новый массив. Но тут возникает законный вопрос. Ведь результатом наших вычислений является еще и новый массив. Как же мы получим его из функции? Для этого нам нужно просто передать имя этого массива как параметр переменную, то есть снабдить ее слово var. Тогда мы с вами получим измененный массив как результат работы нашей функции, то есть значения элементов этого массива будут доступны после того, как работа функции завершится. И теперь давайте рассмотрим, как будет выглядеть наша программа. Здесь задается два типа. Для массива и для матрицы. В данном случае я не использую константу, а просто указываю явно, сколько у меня в массиве элементов и сколько строк и столбцов в моей матрице. Далее, я объявляю глобальные переменные. Матрица у меня d, два массива B и C, а так же n, m, k и L, это значения целого типа. Это у меня количество строк и столбцов матрицы и длина для массивов B и C. Теперь я рассматриваю функцию, которая называется count — вычисление, и в эту функцию мне нужно передать исходные данные и получить результаты. Исходными данными у меня является матрица, результатом у меня является новый массив, но я передаю оба массива как параметры-переменные и B, и C, несмотря на то, что один из них не изменяется, в целях экономии памяти. Дальше у меня n, m и L — это параметры значения целого типа. Результатом будет длина нового массива. Далее, я объявляю счетчики, которые потребуются мне для того, чтобы подсчитать результат. Я начинаю с того, что длина массива b инициализируется нулем. Сразу после оператора begin. Далее, я рассматриваю последовательно все номера строк матрицы, то есть i у меня будет принимать значения от 1 до n. Для каждого номера я проверяю, присутствует ли этот номер в исходном одномерном массиве c. Для этого я беру счетчик t и записываю цикл досрочного выхода. Пока t меньше или равно L, то есть я не дошла до конца массива c, и c текущее не равно i, то есть номеру строки, я увеличиваю t. Если t при выходе из этого цикла больше L, следовательно номер нашей строки отсутствует в нашем одномерном массиве. И тогда я должна все элементы этой строки записать в новый массив. Для этого я устраиваю цикл по столбцам внутри этой строки. Номера столбцов у нас от 1 до m, и на каждом шаге я проделываю два действия. Следовательно, здесь составной оператор. Я увеличиваю k и в массив b на очередное k-тое место я записываю наш элемент матрицы data j. Затем я должна закрыть внешний цикл for, и для того, чтобы из функции вернуть результат, я имени функции count присваиваю длину нового массива. Этот оператор вернет результат функции. Альтернативным способом было бы вместо count написать result, результат был бы тот же самый. Я пропускаю в данном случае ввод матрицы и ввод и вывод массива, потому что мы рассматривали эти процедуры и функции в предыдущих задачах. Но когда я буду рассказывать, как работает программа на компьютере, мы с вами вернемся к этим процедурам. Наша функция завершается оператором end. Далее, я покажу, как выглядит тело основной программы. Сначала вызывается процедура ввода матрицы, матрица наша d, а количество строк и столбцов — это n и m. Затем вызывается процедура ввода элементов и длины исходного массива, она называется input array, массив у нас с, а количество элементов в нем — это l. Далее, я вызываю функцию. В переменную k будет возвращена длина нового массива, а на входе у этой функции — матрица, ее количество строк и столбцов, исходный массив, его длина, и на выходе у нас новый массив b, который у нас с вами содержит элементы, которые будут переписаны из матрицы в массив. Далее, нужно проверить, существует ли новый массив. При k = 0 его не существует и я вывожу сообщение о том, что у меня нет b, а в противном случае я вызываю процедуру вывода одномерного массива для соответствующих параметров. Длина массива называется k, массив называется b. И тело главной программы завершается end с точкой. Рассмотрим программу, которая решает задачу с использованием функции и вычисляет новый массив, в котором будут содержаться элементы тех строк, номера которых отсутствуют в одномерном массиве. Процедура ввода массива полностью совпадает с предыдущей задачей. Процедура ввода матрицы выполняет обычные действия, которые нужны при вводе матрицы. К ее параметрам относятся n и m — количество строк и столбцов, и у нас эти параметры являются параметрами переменными, потому что они здесь вводятся. И сама матрица также является параметром переменной, потому что в этой процедуре вводятся значения ее элементов. i и j — это локальные переменные этой процедуры. И далее, в теле процедуры производятся обычные действия, которые нужны при вводе матрицы. Сначала вводится количество строк и столбцов, а затем сами элементы. Процедура вывода массива на экран совпадает с той, которую мы рассматривали с вами в предыдущей задаче. Мы не будем на ней подробно останавливаться. Далее, следует функция count, которая решает нашу задачу. Результатом этой функции является целое число. Это число в данном случае будет длиной массива b. Если массив b не сформирован, то значение переменной k остается 0. Если же он сформирован, то тогда k отлично от 0. Локальные переменные этой функции — это i, j, t и k. И делаются следующие действия. Длина массива b в начале равна 0, затем последовательно перебираются номера строк, далее проверяется есть ли номер строки i в одномерном массиве. Если он там отсутствует, t > L, то есть мы не нашли ни одного c [ t ], равного i, то тогда мы должны все элементы этой строки поместить в наш новый массив. Для этого мы устраиваем цикл по столбцам, и на каждом шаге этого цикла мы увеличиваем количество элементов в новом массиве и на это место записываем элемент матрицы. Далее мы возвращаем значение из этой функции, присваивая ее имени результат, и далее у нас начинается главная программа. Давайте посмотрим внимательно на оператор вызова первой процедуры – input_matr (n, m, d). А теперь посмотрим на заголовок самой этой процедуры. Мы с вами видим, что формальные и фактические параметры у нас называются по-разному. Это вполне допустимо, необходимо лишь только, чтобы у нас совпадал порядок, количество и типы формальных и фактических параметров. Формальный параметр называется b, и это матрица. А при вызове на его место подставляется имя матрицы d, которая является фактическим параметром. Далее у нас вызывается процедура input_array. Здесь у нас имена формальных и фактических параметров также разные. Здесь массив называется a, и это формальный параметр. А в главной программе он называется c. Но тем не менее сейчас мы увидим, что всё прекрасно работает. Далее вызывается функция count, результат возвращается в переменную k, и здесь у нас с вами также есть различные параметры. Все параметры, которые указываются при вызове функции, у нас являются формальными. Далее следует вызов функции count. Результат возвращается в переменную k. В скобках указаны имена всех фактических параметров, которые будут переданы в соответствующую функцию, и здесь опять важно, чтобы порядок, количество и типы параметров совпадали. Первый параметр у нас — это матрица, второй параметр — это одномерный массив, третий параметр — это также одномерный массив. И дальше три величины целого типа. Далее проверяется существование одномерного массива. Если его нет, то мы выводим сообщение о том, что у нас нет массива b. А в противном случае вызываем процедуру print_array, которая выведет элементы нашего массива на экран. Запустим нашу программу, и в качестве данных зададим тот тест, который мы рассматривали, когда читали условие задачи. Итак, количество строк в матрице d равно 3, количество столбцов равно 4. Далее мы с вами вводим матрицу. Первую строку, вторую и третью. Затем нам нужно ввести количество элементов в одномерном массиве c. Это четыре элемента. И дальше мы вводим элементы последовательно. 2, 4, 6, и −4. И мы с вами видим, что элементы всех тех строк, номера которых отсутствуют в нашем одномерном массиве, а это первая строка [БЕЗ СЛОВ] и последняя строка в новый массив. Теперь давайте попробуем задать исходные данные, при которых новый массив не будет сформирован. Например, я возьму матрицу 3 x 3 и задам девять элементов. Далее я введу n = 4. В программе этот параметр называется L, но поскольку здесь у нас работает процедура, то имя у нас выведено для формального параметра. Итак, пусть элементы массива равны 1, 2, 3 и 4. В этом случае у нас нет массива b, потому что все номера строк присутствуют в нашем одномерном массиве. То есть здесь у нас есть два случая: либо массив создан, либо это не так. И мы с вами подобрали тестовые примеры для каждого из этих случаев. [МУЗЫКА] [МУЗЫКА]