Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2007, 04:41   #1
Умелец
Пользователь
 
Регистрация: 16.03.2007
Сообщений: 48
По умолчанию Процедуры и функции. В чем отличие?

Всем Привет! Хочется уточнить касательно Pascal, в чем всетаки разница между процедурами и функциями, знаю что функция возвращает значение, процедура нет, хотя некоторые мне говорят что как таковых отличий между ними не существует. Читал в разной литературе, но до меня не доходят именно главы про процедуры и функции, про формальные и фактические параметры и т.д.
Подскажите если не трудно я ведь только учусь и хочу разобраться.
P.S. может покажите простенький пример одной и той же задачи сначала с использованием процедуры, а потом с использованием функции, чтобы посмотреть различия.
Заранее огромное Спасибо!
Умелец вне форума Ответить с цитированием
Старый 05.09.2007, 08:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Попробую обьяснить: Разница между процедурами и функами именно в том что функа может возвращать результ а процедура нет, чтобы получать из процедуры какой либо результ можно в нее подставить параметр-переменную : var i:integer Разница между параметром-переменной и параметром-константой (s:string есть в том что изменения параметр-переменной после окончания работы с процедурой сохраняются в ту переменную которую подставили : q(as,ii); вот в данном случае ii - параметр-переменная, обязательно должна быть обьявленна, и расчеты с этим параметром обязательно возвращаются в эту переменную. т.е. нельзя обьявить q(as,20); ибо procedure q(s:string; var i:integer); где i параметр-переменная т.е. если возле параметра пишется var, это говорит паскалю, что он должен результат расчетов с этой переменной вертуть в нее.
С другой стороны параметр-константа (s:string) может изменятся внутри тела процедуры, но результат изменения по окончанию процедуры никак не влияет на подставленное в этот параметр значение переменной, т.е. ты можеш скольугодно менять значение s внутри, но as (см. пример), которая туда в примере подставляется никак не изменится внутри тела процдуры (в данном примере)

procedure q(s:string; var i:integer);
begin
s:=s+'1'; {Эти расчеты имеют место только внутри процедуры}
i:=i+10; {а это уже изменит значение фактической переменной, прибавит к ней 10}
end;

function j(s:string; var i:integer):string;
begin
j:=s+'1'; {Это говорит о том что функция должна вернуть s+'1'}
i:=i*10; {значение Переменки, которую сюда подставили умножится на 10, и в нее же запомнится}
end;

var as:string; ii:integer;
begin

as:='2';
ii:=1;
q(as,ii);
writeln(as);
writeln(ii);
writeln;
writeln(j(as,ii));
end.


Учти если используеш параметр-переменную, то в функцию на место этого параметра нельзя подставить константу или число (или строку, или массив, в зависимости от типа)

т.е. в данном случае :
q(as,ii); - Верно!
q(as,10); - Неверно!

Яснышко?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.09.2007, 08:13   #3
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Функции - это процедуры особого характера, результатом работы которых является некоторое значение, подобное переменной.
Функция, как и процедура, может иметь список параметров, следующих за именем функции в круглых скобках. Но если имя процедуры используется только для ее вызова, то с именем функции связывается ее значение. На примере сложения двух целых чисел проиллюстрируем возможности Турбо Паскаля 7.0 по оформлению программ при помощи процедур и функций, а также рассмотрим различия между этими двумя подходами.
Код:
 
Program ProcedureAndFunction;
  Uses 
    Crt;
 Var
    a, b, SumNumbers : integer;
Procedure Summa1(Var Sum: integer; a, b : integer);
Begin
  Sum:= a+b;
End;
 
Function Sum(a, b : integer) : integer;
Begin
  Sum:= a+b;
End;
 
Begin
  ClrScr;
  a := 12;
  b := 15;
  Summa1(SumNumbers, a, b);
  writeln ('С помощью процедуры сумма чисел равна ',SumNumbers);
  writeln ('С помощью функции сумма чисел равна ',Sum(a, b));
End.
Вызов процедуры производится по ее имени. Наряду с параметрами-значениями a и b, которые подлежат сложению, в списке параметров присутствует параметр-переменная Sum, который содержит возвращаемое процедурой значение - сумму.
Функция же имеет только два параметра. Это связано с тем, что само имя функции представляет собой идентификатор параметра, значение которого после окончания работы функции равно результату вычисления. Этот параметр соответствует параметру-переменной Sum процедуры. При объявлении функции ей в соответствие ставят определенный тип данных - тип возвращаемого функцией значения.
Объявление функции
Код:
Function Sum(a, b : integer) : integer;
внешне похоже на объявление переменной Sum типа integer. Тип функции объявляется следом за списком параметров - после закрывающейся скобки этого списка и двоеточия.
Процедуры и функции в Турбо Паскале отличаются не только описанием, но и способом их вызова. Так вызов функции Sum можно произвести в следующей форме
Код:
SumNumbers:= Sum(a,b);
Если не обращать внимания на наличие списка параметров, то этот оператор выглядит как присвоение переменной SumNumbers значения переменной Sum. Компилятор, кончно же, знает, что Sum - это имя функции (т.к. определение предшествует использованию) и организует вычисления соответствующим образом. Точно так же, как константа или переменная, вызов функций может использоваться в списках параметров оператора write (см. программу), что для процедур невозможно.
Последнее отличие процедур от функций заключается в необходимости присваивания результата вычисления в теле функции переменной, имя которой совпадает с именем функции. Если такое присваивание в теле функции не выполнено, то функция не возвратит никакого результата (точнее возвратит произвольный результат).
Итак, из вышесказанного возьмите на заметку следующее.
Оформлять подпрограмму как функцию целесообразно только в том случае, если ожидается результат работы подпрограммы. Если же последовательность команд ориентирована на выполнение некоторого действия (выдача информации на экран и т.п.), целесообразно оформлять ее как процедуру.

Источник.
Alex21 вне форума Ответить с цитированием
Старый 05.09.2007, 09:05   #4
Умелец
Пользователь
 
Регистрация: 16.03.2007
Сообщений: 48
По умолчанию

Ребята Спасибо большое за помощь, надеюсь через год усиленных занятий я с вами буду разговаривать на совсем другом языке, и может мне будет смешно от того как я этого не мог понять.
Умелец вне форума Ответить с цитированием
Старый 05.09.2007, 09:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ниче смешново нет, я сам себя таким помню, и ничуть не смущаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2007, 17:43   #6
Snake_ua
Пользователь
 
Регистрация: 25.09.2007
Сообщений: 66
По умолчанию

Люди, я сейчас не дома, поэтому в хелпе посмотреть не могу, но если память мне не изменяет, то помойму можно сделать так:

procedure q(s:string; var i:integer): string;

Или память мне изменяет?
Snake_ua вне форума Ответить с цитированием
Старый 15.10.2007, 17:49   #7
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
procedure q(s:string; var i:integer): string;
наверное изменяет
zetrix вне форума Ответить с цитированием
Старый 15.10.2007, 17:52   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
procedure q(s:string; var i:integer): string;
Т.е. вы хотите сделать нечто вроде:
Код:
mystring:=q('aaa',12)
Не выйдет. Для этого нужно объявлять как раз функцию, а не процедуру...
mihali4 вне форума Ответить с цитированием
Старый 15.10.2007, 17:53   #9
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Цитата:
Люди, я сейчас не дома, поэтому в хелпе посмотреть не могу, но если память мне не изменяет, то помойму можно сделать так:

procedure q(s:string; var i:integer): string;

Или память мне изменяет?
Процедура - это отдельная подпрограмма. В данном случае q - только лишь название процедуры.
Если написать так:

function q(s:string; var i:integer): string;

то это становится похожим на правду.
Alex21 вне форума Ответить с цитированием
Старый 20.10.2010, 11:02   #10
maxymkkka
Новичок
Джуниор
 
Регистрация: 20.10.2010
Сообщений: 1
По умолчанию функцый и процедуры

я навичок в паскале и у меня простой вопрос. как прочесть и покозать "table" (не знаю как на русском)
maxymkkka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедуры и функции V25 Паскаль, Turbo Pascal, PascalABC.NET 1 17.11.2008 20:02
Процедуры и функции 11111 Помощь студентам 10 26.11.2007 15:06
DLL + Процедуры(не функции) LEKA Общие вопросы Delphi 1 02.05.2007 20:37