в чем различие между процедурами и функциями
Разница между процедурой и функцией в программировании
Пользователи, далекие от программирования в принципе, сталкиваются с понятиями функции и процедуры редко, и ассоциируются они с чем-то математическим и бюрократическо-медицинским. В программировании же этими понятиями оперирует множество языков, правда, даже специалисты порой не могут четко осознать разницу между функцией и процедурой. Как с тем сусликом: он есть, но его никто не видит. Посмотрим, настолько ли невидимы отличия.
Определение
Функция в программировании — подпрограмма, вызываемая из других подпрограмм необходимое число раз.
Процедура — поименованная часть программы (подпрограмма), многократно вызываемая из последующих частей программы необходимое число раз.
Сравнение
Основная разница между функцией и процедурой — в возвращаемом результате. По сути, и функции, и процедуры представляют собой логически неделимые блоки, из которых складывается код программы. Функция возвращает значение, процедура в большинстве языков программирования — нет, либо (в Си, например) возвращает пустое значение. В последнем случае (в Си) процедура считается подчиненной разновидностью функции.
Заголовок функции содержит слово “function”, идентификатор (собственное имя функции), вариативно список параметров и обязательно — тип результата. В теле функции обязательно прописывается оператор, присваивающий значение имени функции, которое она вернет в качестве результата. Заголовок процедуры содержит слово “procedure”, идентификатор (имя процедуры) и вариативно список параметров. Вызов функции осуществляется в составе выражений там, где эти выражения применяются, вызов процедуры требует отдельного оператора. Вызов процедуры осуществляется только по имени, имя функции же связано с ее значением. На схемах алгоритмов вызов функции изображается в блоке вывода или в блоке процесса, вызов процедуры — в специальном блоке “предопределенный процесс”.
9. Процедуры и функции
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именем. Упоминание этого имени в тексте программы называется вызовом процедуры (функции). Отличие функции от процедуры заключается в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое значение, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами. Обобщенно процедуры и функции будем называть подпрограммами.
Верхняя строка процедуры называется заголовком процедуры и состоит из служебного слова procedure, названия функции, списка параметров и точки с запятой. Следом идут операторные скобки begin-end, называемые телом процедуры. После end обязательно ставится точка с запятой. Процедура может не иметь параметров, в этом случае ставить скобки необязательно.
Заголовок функции отличается тем, что вместо слова procedure пишется function, а после списка параметров или имени (если нет параметров) идет двоеточие и тип результата, который возвращает функция. Вызов встроенной или пользовательской подпрограммы имеет следующий синтаксис:
Если подпрограмма не имеет параметров, то скобки необязательны. Имя подпрограммы должно быть уникальным в пределах модуля и других подключаемых модулей и не должно совпадать с именами встроенных.
В подпрограмме могут быть объявлены локальные переменные, видимые только в теле подпрограммы. Раздел объявления переменных находится между заголовком и телом. Пример:
Имена локальных переменных могут совпадать с именами глобальных переменных. В этом случае использоваться будет локальная переменная.
Параметры процедур и функций
Синтаксис описания параметров разберем на примере:
Параметры в заголовке подпрограммы называются формальными параметрами. Параметры, передаваемые при вызове подпрограммы, называются фактическими.
Параметры одного типа отделяются запятой, после двоеточия указывается тип параметра. Параметры разных типов отделяются точкой с запятой. Список и тип формальных и фактических параметров должен совпадать. За этим следит компилятор.
Параметры, передаваемые в подпрограмму, делятся на:
Пример вызова функции:
В случае с параметрами-значениями и параметрами-константами тип формального и фактического параметра может быть совместимым. Если формальный определен как целое число, то фактический параметр может быть любого целого типа. Только нужно следить, чтобы формальный параметр мог «вместить» фактический параметр. В данном примере тип формального параметра Y «вмещает» переменную a, т. к. область допустимых значений больше. Целый формальный параметр несовместим с другими типами, в том числе с вещественными. А вот вещественный формальный параметр, совместим с целыми и вещественными.
В случае с параметрами-переменными требуется строгое соответствие типов, даже если формальный и фактический параметры являются родственными, например целыми. Т. е. если формальный параметр имеет тип Integer, то фактический параметр тоже должен иметь тип Integer, а не Byte, Word и т. д. Это касается и классов, даже если фактический параметр является потомком класса формального параметра.
Передача массивов в качестве параметров
Для передачи массива в подпрограмму должен быть определен пользовательский тип:
Фактический параметр должен быть переменной массива.
Компилятор не сообщит об ошибке, если объявить параметр-массив таким образом:
Однако во время выполнения вы получите ошибку «type mismatch».
В Паскале есть так называемые открытые массивы. Синтаксис формального параметра открытого массива следующий:
Открытый массив представляет собой одномерный массив. Нижняя граница массива всегда равна 0, даже если нижняя граница передаваемого массива отличается. Соответственно, верхняя граница равна длине массива минус 1. Для определения границ массива можно воспользоваться функциями Low и High. Пример:
Как видно из примера фактическим параметром может быть не только переменная, но и конструктор массива, который представляет собой перечисление элементов через запятую, заключенных в квадратные скобки.
В движке не поддерживаются вариантные открытые массивы, хотя некоторые встроенные подпрограммы имеют параметры такого типа (например, Format).
Возврат значения функции
Функция имеет предопределенную переменную Result, в которую сохраняется возвращаемое значение. Пример:
Выход из подпрограммы
В любой момент можно выйти из подпрограммы. Для этого предусмотрен оператор Exit.
В движке не поддерживается передача в EXIT возвращаемого значения.
Чем отличаются функции от хранимых процедур в T-SQL (Microsoft SQL Server)
Приветствую всех посетителей сайта Info-Comp.ru! Сегодня мы с Вами поговорим о том, чем же отличаются функции от хранимых процедур в Microsoft SQL Server, и для наглядности сформируем итоговую таблицу отличий.
Функции и хранимые процедуры T-SQL
В Microsoft SQL Server существуют такие объекты базы данных, как функции и хранимые процедуры, которые используются для хранения неких уже реализованных алгоритмов на языке T-SQL.
Примечание! В данном материале речь идет о пользовательских функциях и хранимых процедурах, не о системных, которые уже реализованы в SQL Server, а о тех, которые создаем мы с Вами, т.е. программисты T-SQL.
Функции и хранимые процедуры используются в языке T-SQL для реализации бизнес логики, упрощения сложных SQL запросов, а также для написания различных инструкций администрирования баз данных и сервера, которые периодически необходимо выполнять.
Иными словами, функции и хранимые процедуры – это своего рода мини программы внутри базы данных, они помогают нам реализовывать нужные нам алгоритмы и хранить их в базе данных. Кроме этого, функции и хранимые процедуры позволяют декомпозировать одну глобальную задачу на несколько мелких, тем самым упрощая решение этой задачи и дальнейшее сопровождение этого решения, так как весь алгоритм становится модульным и более гибким.
У начинающих может возникнуть вопрос – а чем отличаются функции от процедур? Или это одно и то же?
Конечно же, это не одно и то же, и между этими понятиями, в контексте языка T-SQL, есть нескольких ключевых отличный.
Отличия функций от хранимых процедур в T-SQL
Давайте перейдем к рассмотрению основных отличный функций от хранимых процедур, а чтобы было более наглядно, сделаем это в виде таблицы.
Функция
Хранимая процедура
Операторы DML (INSERT, UPDATE, DELETE) для модификации данных использовать нельзя.
На сегодня это все, надеюсь, материал был Вам полезен, пока!
Различие между процедурами и функциями.
Функции – это процедуры особого характера, результатом работы которых является некоторое значение, подобное переменной.
Функция, как и процедура, может иметь список параметров, следующих за именем функции в круглых скобках. Но если имя процедуры используется только для ее вызова, то с именем функции связывается ее значение. На примере сложения двух целых чисел проиллюстрируем возможности Турбо Паскаля 7.0 по оформлению программ при помощи процедур и функций, а также рассмотрим различия между этими двумя подходами.
a, b, SumNumbers : integer;
Procedure Summa1(Var Sum: integer; a, b : integer);
Function Sum(a, b : integer) : integer;
Summa1(SumNumbers, a, b);
writeln (‘С помощью процедуры сумма чисел равна ‘,SumNumbers);
writeln (‘С помощью функции сумма чисел равна ‘,Sum(a, b));
Вызов процедуры производится по ее имени. Наряду с параметрами-значениями a и b, которые подлежат сложению, в списке параметров присутствует параметр-переменная Sum, который содержит возвращаемое процедурой значение – сумму.
Функция же имеет только два параметра. Это связано с тем, что само имя функции представляет собой идентификатор параметра, значение которого после окончания работы функции равно результату вычисления. Этот параметр соответствует параметру-переменной Sum процедуры. При объявлении функции ей в соответствие ставят определенный тип данных – тип возвращаемого функцией значения.
Function Sum(a, b : integer) : integer;
внешне похоже на объявление переменной Sum типа integer. Тип функции объявляется следом за списком параметров – после закрывающейся скобки этого списка и двоеточия.
Процедуры и функции в Турбо Паскале отличаются не только описанием, но и способом их вызова. Так вызов функции Sum можно произвести в следующей форме
Если не обращать внимания на наличие списка параметров, то этот оператор выглядит как присвоение переменной SumNumbers значения переменной Sum. Компилятор, кончно же, знает, что Sum – это имя функции (т.к. определение предшествует использованию) и организует вычисления соответствующим образом. Точно так же, как константа или переменная, вызов функций может использоваться в списках параметров оператора write (см. программу), что для процедур невозможно.
Последнее отличие процедур от функций заключается в необходимости присваивания результата вычисления в теле функции переменной, имя которой совпадает с именем функции. Если такое присваивание в теле функции не выполнено, то функция не возвратит никакого результата (точнее возвратит произвольный результат).
Итак, из вышесказанного возьмите на заметку следующее.
Оформлять подпрограмму как функцию целесообразно только в том случае, если ожидается результат работы подпрограммы. Если же последовательность команд ориентирована на выполнение некоторого действия (выдача информации на экран и т.п.), целесообразно оформлять ее как процедуру.
Задачи Для Самостоятельного Решения
1. Найти сумму цифр числа.
2. Найти первую цифру числа.
3. Найти количество делителей числа.
4. Найти числа из промежутка от А до В, у которых больше всего делителей.
5. Найти сумму всех делителей числа.
6. Определить, является ли число совершенным, то есть равно ли оно сумме своих делителей, кроме самого себя.
7. Определить, является ли число простым.
8. Среди чисел из интервала от А до В найти все простые.
9. Составьте программу, проверяющую, является ли число палиндромом (например, число 12421 – палиндром).
10. Определить, является ли число автоморфным, то есть квадрат этого числа заканчивается этим же числом, например, числа 6 и 25, т.к. их квадратами являются числа 36 и 625.
Занятие VI
Тема. Решение задач
1. Даны координаты вершин четырехугольника ABСВ. Найти сумму длин его диагоналей. Данные для ввода: A(0,1), B(2,5), C(4,8), D(2,0).
2. Найти сумму площадей треугольников ABC и МНР, заданных координатами вершин. Данные для ввода: А(0;1), В(3;1), С(4;2), М(6;7), Н(4;3), Р(3;8).
3. Найти сумму периметров треугольников ABC и МНР, заданных координатами вершин. Данные для ввода: А(0;1), В(3;1), С(4;2), М(6;7), Н(4;3), Р(3;8).
5. Составить программу поиска большего из трёх чисел, с использованием процедуры поиска большего из двух чисел.
6. Определить длину окружности С и площадь круга S, удаление L центра окружности от начала координат О. Координаты центра окружности равны X и Y, радиус R.
Вычисление С, S, L оформить в виде процедуры.
7. Составьте функцию для определения значений n!, m!,(n-m)!
8. Напишите функцию CUBЕ, которая возвращает куб ее числового параметра.
9. Напишите функцию, которая возвращает объем сферы, радиус которой передается как параметр.
10. Для заданного х составить алгоритм вычисления значения выражения:
11. Для заданного х составить алгоритм вычисления значения выражения:
12. Напишите функцию CUBЕ, которая возвращает куб ее числового параметра.
13. Составьте программу для определения значений n!, m!,(n-m)!
15. Напишите функцию, которая возвращает объем сферы, радиус которой передается как параметр.
16. По координатам вершин двух треугольников, определите их площадь и выведите на печать площадь максимального треугольника. Вычисление длины стороны, площади треугольника оформите в виде функций.
17. Дана отрезки а, b, c, d. Для каждой тройки отрезков, из которых можно построить треугольник, напечатайте площадь данного треугольника. Воспользуйтесь функциями определения возможности создания треугольника и вычисления площади.
18. С клавиатуры вводятся числа, до тех пор, пока не будет введено первое отрицательное число. Определите, сколько чисел из входного потока, равно сумме кубов своих цифр. При решении задачи используйте функцию, которая будет проверять, равно ли натуральное число сумме кубов своих цифр.
19. Напишите функцию логического типа, проверяющую, являются ли все цифры, входящие в натуральную запись, числа N различными.
20. Даны два натуральных числа. Проверить, является ли второе число перевертышем первого.
21. Составьте программу подсчета числа всех натуральных чисел, меньших М, квадрат суммы цифр которых равен Х.
22. Составьте программу подсчета числа всех натуральных чисел, меньших М и делящихся на каждую из своих цифр.
23. Составьте программу нахождения наименьшего натурального N-значного числа Х (X>=10), равного утроенному произведению своих цифр.
24. Дано натуральное число. Определите, сколько четных цифр используется в записи этого числа.
25. Дана последовательность К чисел. Определите, сколько чисел этой последовательности содержит в своей записи все цифры больше некоторого числа n введенного с клавиатуры.
В чем разница между «функцией» и «процедурой»?
Вообще говоря, мы все слышим о функциях или процедурах в языках программирования. Однако я только что узнал, что я использую эти термины почти взаимозаменяемо (что, вероятно, очень неправильно).
В чем разница с точки зрения их функциональности, их назначения и использования?
Пример будет оценен.
Функция возвращает значение, а процедура просто выполняет команды.
Название функции происходит от математики. Он используется для расчета значения на основе ввода.
В большинстве языков программирования даже функции могут иметь набор команд. Следовательно, разница только в возвращении части значения.
Но если вы хотите поддерживать чистоту функции (только взгляните на функциональные языки), вам нужно убедиться, что функция не имеет побочных эффектов.
Это зависит от контекста.
В языках, подобных Паскалю, функции и процедуры являются различными объектами, различающимися в зависимости от того, возвращают они значение или нет. Они ведут себя по-разному в отношении. синтаксис языка (например, вызовы процедур в операторах формы; вы не можете использовать вызов процедуры внутри выражения, а вызовы функций не в операторах формы, вы должны использовать их в других операторах). Поэтому программисты на Паскале различают их.
Хотя вы должны заметить, что в стандарте C говорится не о процедурах, а о функциях
Есть термин подпрограмма или подпрограмма которая обозначает параметризованный фрагмент кода, который можно вызывать из разных мест.
Функции и процедуры являются реализациями тех. Обычно функции возвращают значения, а процедуры ничего не возвращают.
Основные отличия
Расширенные различия
В SQL:
Таким образом, rand () или print («Hello») и т. Д. Являются не функциями, а процедурами. В то время как sqrt (2.0) должен быть функцией: не наблюдается наблюдаемого эффекта или изменения состояния, независимо от того, как часто он вызывается, и он всегда возвращает 1.41 и некоторые.
Это хорошо известный старый вопрос, но я хотел бы поделиться некоторыми соображениями о современных исследованиях и дизайне языков программирования.
Основной ответ
(Для ясности, «вход» и «выход», упомянутые выше, являются упрощенными понятиями, основанными на синтаксических свойствах функций. Многие языки дополнительно поддерживают передачу аргументов в параметры посредством ссылки / совместного использования, чтобы позволить пользователям переносить информацию, закодированную в аргументах во время вызовов Такой параметр может даже называться просто «параметром in / out». Эта функция основана на природе объектов, передаваемых в вызовах, которая ортогональна свойствам функции процедуры / функции.)
Однако, если результат вызова функции не нужен, его можно просто (по крайней мере, логически) игнорировать, и определения функций / вызовы функций должны быть совместимы с определениями процедур / вызовами процедур таким образом. Подобные ALGOL языки, как C, C ++ и Java, все предоставляют функцию «функции» таким образом: кодируя тип результата void как особый случай функций, похожих на традиционные процедуры, нет необходимости предоставлять функцию «процедур» » по отдельности. Это предотвращает некоторое раздувание в дизайне языка.
Я не знаю много о точных причинах расхождения, но, как я понял, кажется, что языковые дизайнеры будут счастливее без раздувания спецификаций в наши дни. То есть «процедура» как отдельная функция не нужна. Техники, подобные void типу, уже достаточны, чтобы обозначить использование, где следует подчеркнуть побочные эффекты. Это также более естественно для пользователей, имеющих опыт работы с C-подобными языками, которые популярны более нескольких десятилетий. Более того, это позволяет избежать затруднений в таких случаях, как R n RS, где «процедуры» фактически являются «функциями» в более широком смысле.
Теоретически, функция может быть указана с указанным типом модуля в качестве типа результата вызова функции, чтобы указать, что результат является специальным. Это отличает традиционные процедуры (когда результат вызова не заинтересован) от других. Существуют разные стили в дизайне языка:
дальнейшее чтение
В соответствии с традиционной концепцией, основанной на математике, существует масса чёрной магии, о которой большинство людей не знают. Строго говоря, вы вряд ли получите ясное представление о ваших книгах по математике. Книги по CS тоже могут не сильно помочь.
Что касается языков программирования, есть несколько предостережений: