|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ПРОЦЕДУРЫ И ФУНКЦИИВ тексте песни припев дается только один раз, если нужно его повторить, то указывается одно слово “припев”, под которым подразумевается текст, приведенный ранее. Этот же принцип используется в программировании: если какая-либо часть программы многократно повторяется, то ее оформляют отдельно от основной программы и называют подпрограммой. К ней обращаются при необходимости ее использования. Более того, рекомендуется большую задачу разбивать на отдельные смысловые задачи (подпрограммы), программировать их отдельно, отлаживать, а затем объединять в единую программу. Использование подпрограмм считается хорошим стилем программирования. При этом уменьшается в целом объем программы и уменьшается время на ее отладку. Любая программа может содержать несколько подпрограмм, каждая из которых так же может содержать подпрограммы. В Паскале имеется два вида подпрограмм: процедура (procedure) и функция (function). Процедура может возвращать в качестве ответа несколько значений, а функция - только одно. Работа с процедурами и функциями состоит из двух частей: 1) описание процедуры или функции; 2) вызов ее на исполнение (передача управления компьютером) с одновременной передачей исходных данных, необходимых для работы процедуры или функции. По окончании работы процедуры или функции управление возвращается за точку вызова (к следующему оператору). Описание процедуры: procedure имя [(список параметров)]; oписание данных; begin oператоры процедуры или тело процедуры end; Параметры, указанные при описании, называют формальными. Список формальных параметров может отсутствовать. Если он есть, то в нем печисляются имена формальных параметров с указанием типов. Параметры бывают двух видов: параметры-значения и параметры-переменные. При вызове процедуры или функции формальные параметры заменяются фактическими, которые так же могут отсутствовать. Но если есть, то должны соответствовать формальным параметрам по количеству, типу и порядку следования. На место параметра-значения подставляется при вызове процедуры или функции значение выражения, передаваемого как аргумент. Этот параметр описывается указанием имени и типа. Его значение не может быть возвращено в точку вызова (передается входная информация). На место параметра-переменной подставляется переменная, ее значение может быть изменено в процедуре или функции и возвращено обратно (передается входная и выходная информация). Описанию этого параметра должно предшествовать ключевое слово var. Параметры, указанные при описании процедуры или функции, могут рассматриваться, как своеобразное расширение раздела описания и могут участвовать в любых разрешенных операциях, функциях, операторах внутри подпрограммы. Данные, описанные в разделе описания процедуры или функции, называют локальными. Они используются только внутри данной процедуры или функции. Локальные переменные создаются при каждом вызове функции и уничтожаются, когда процедура или функция заканчивает свою работу. Поэтому они недоступны основной программе. Данные, описанные в разделе описания программы, называют глобальными. Область их действия - вся программа, в том числе и процедуры и функции. Поэтому через глобальные переменные так же можно передавать информацию в процедуру или функцию. Вызов процедуры осуществляется по имени с указанием фактических параметров, перечисленных через запятую. Описание функции: function имяф(список_параметров): тип_возвращаемого_значения; oписание данных; begin Операторы функции или тело функции; имяф:= выражение; {обязательный оператор, формирующий возвращаемое функцией значение} end; Вызов функции осуществляется с помощью указателя функции, который записывается в каком-либо выражении: имяф(список_аргументов). Операторов имяф:= выражение может быть несколько в теле функции. Значение, которое вычисляется функцией, задается последним выполненным до завершения работы функции оператором. Если такого оператора присваивания нет в функции, то значение функции не определено, что приведет к аварийному завершению программы. Задача 1. Напишите функцию, определяющую является ли заданный символ русской гласной буквой. Решение. В качестве параметра в функцию будет передаваться символ. А результат должен определять является или не является (да или нет), т.е. значение функции должно быть логическим. function gl (ch: char): boolean; begin gl:= pos (ch, ‘аеиоуыэюя’) <> 0; end; Задача 2. Даны два действительных числа x, y. Вычислите значение выражения z:= (sign x + sign y)· sign (x + y), где sign - функция, определяющая знак числа, т.е. . Решение. В качестве передаваемого параметра будем использовать значение вещественной переменной. Функция будет принимать значение -1, 0 или 1, т.е. целое. var x, y, z: real; function sign (a: real): integer; begin if a < 0 then sign:= -1 else if a = 0 then sign:= 0 else sign:= 1; end; begin {тело основной программы} writeln (‘задайте значения x и y’); readln (x, y); z:= (sign (x) + sign (y)) * sign (x + y); writeln (‘z = ‘, z); end. Упражнение. Решите предложенную задачу без описания функции. Задача 3. Напишите функцию, определяющую следующее за данным простое число. Решение. Передаваемый параметр - целое число, значение функции - целое число. function pr (a: integer): integer; var i: integer; {возможные делители числа} aa: integer; {число - кандидат на простое} f: boolean; {равно true, если нашли простое число} begin f:= false; {простое число еще не нашли} aa:= a; repeat aa:= aa + 1; i:= 1; repeat i:= i + 1; until aa mod i = 0; if aa = i then begin f:= true; pr:= aa end; {нашли простое число} until f; end; Упражнение. Измените функцию так, чтобы она определяла, является ли число простым. С помощью этой функции найдите все простые числа в заданном массиве целых чисел. Задача 4. Напишите функцию, проверяющую принадлежит ли заданный элемент двумерному массиву. С помощью этой функции проверить все ли элементы одномерного массива принадлежат заданному двумерному. Решение. Просматриваем двумерный массив, сравнивая каждый его элемент с элементом одномерного массива. Если нашли совпадение, то элемент имеется в двумерном массиве. Напишем две дополнительные процедуры для вывода одномерного и двумерного массивов. const nn = 5; mm = 5; type mas2 = array [1..nn, 1..mm] of integer; mas1 = array [1..nn] of integer; var a: mas2; {исходный двумерный массив} b: mas1; {исходный одномерный массив} n, m, i, j: integer; f: boolean;
function prov (a: mas2; n, m: integer; x: integer): boolean; {проверяет, принадлежит ли x двумерному массиву} var i, j: integer; f: boolean; begin f:= false; {еще не нашли} i:=1; while (i <= n) and not f do begin j:=1; while (j <= m) and not f do if a[i, j] = x then f:= true {нашли} else j:= j + 1; {переходим к следующему} if not f then i:= i + 1 end; prov:= f end;
procedure wri1 (a: mas1; n: integer); {вывод одномерного массива} var i: integer; begin writeln; writeln (‘одномерный массив’); for i:= 1 to n do write (a[i], ‘ ‘) end;
procedure wri2 (a: mas1; n, m: integer); {вывод двумерного массива} var i, j: integer; begin writeln (‘одномерный массив’); for i:= 1 to n do begin writeln; for j:= 1 to m do write (a[i, j], ‘ ‘); end; end;
begin {основная программа} write (‘введите количество строк и столбцов’); readln (n, m); for i:= 1 to n do for j:= 1 to m do a[i, j]:= random (10); for i:= 1 to n do b[i]:= random (10); {или b[i]:= i} wri2(a, n, m); wri1 (b, n); writeln; f:= true; i:= `; while (i <= 1) and f do begin f:= f and prov (a, n, m, b[i]); if f then i:= i + 1; {если данный элемент есть в двумерном массиве, то переходим к анализу следующего элемента двумерного массива} end; if f then writeln (‘входят все’) else writeln (‘не входит ’, i, ‘элемент’); end. Упражнения. 1. Напишите функцию, проверяющую принадлежит ли заданный элемент одномерному массиву. С ее помощью проверить принадлежит ли каждый элемент двумерного массива заданному одномерному. Программа должна быть эффективной и не допускать лишних переборов. 2. Найдите значение интеграла методом трапеций, оформив вычисление подинтегрального выражения в виде функции. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.014 сек.) |