Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/64: Рейтинг темы: голосов - 64, средняя оценка - 4.55
148 / 111 / 83
Регистрация: 09.09.2011
Сообщений: 274

Функция как параметр процедуры

15.11.2012, 22:44. Показов 13302. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят просветите в такой теме, функция как параметр процедуры. Как это реалезовать в паскале? И чем это вызвано?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2012, 22:44
Ответы с готовыми решениями:

функция как параметр процедуры
Задача следующая. Составить программу для решения уравнения f(x)=0 на отрезке от А до В с точностью Е методом деления пополам. Метод...

Процедура как параметр процедуры
Поддерживает ли TP7.0 тип параметра "процедура" или "функция" в списке параметров процедуры? У меня на попытки объявления Procedure...

Можно ли передать множество как параметр процедуры
Всем доброго времени суток, нужен совет по поводу: Можно ли в free pascal передать множество как параметр процедуры? Если можно, то как,...

8
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.11.2012, 00:14
stimo15, попробуйте представить себе следующее: допустим, у вас есть процедура которая строит график функции и вы хотите сделать ее универсальной. То есть, чтобы она строила график абсолютно любой функции. У вас в процедуре есть алгоритм, который по точкам выполняет построение, а сами значения точек, в частности координата Y, определяется некоторой функцией. И тогда возникает закономерный вопрос: а как сделать так, чтобы процедура могла вычислить y:=f(x), где f - произвольная функция? Да, можно завести некую глобальную функцию f(x), и осуществлять ее вызов. Однако, что делать, если сначала надо построить, допустим, синус, а затем параболу. В таком случае, код вызова не будет универсальным, так как имена таких функций различны.
И вот мы подошли к самой сути: функции как параметр. Исходя из названия, существует возможность передать функцию как формальный параметр, что собственно в рамках примера и будет являться решением описанной проблемы. И вот почему. Поскольку она будет являться формальным параметром, то абсолютно не имеет значение, какой фактический параметр туда подставляется, пока типы данных совпадают. Вот и универсальность.
Рассмотрим на примере. Пусть необходимо написать процедуру, выводящую на экран значения произвольной функции на отрезке от 0 до 1 с шагом 0.125.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
program test;
 
type
  TFunction=function(x:real):real;{объявляем функцию как тип данных}
 
{$F+}
{фукнция возводящая в куб}
function P(a:real):real;
begin
  P:=a*a*a;
end;
 
function Q(c:real):real;{еще фукнция}
begin
  if a>0 then Q:=sqrt(a)
  else Q:=-1;
end;
{$F-}
 
{наша процедура}
procedure proc(f:TFunction);
var
  x,y:real;
begin
  x:=0.0;
  while x<=1.0 do
  begin
    y:=f(x);{вызываем универсальную функцию}
    writeln(y:0:2);
    x:=x+0.125;
  end;
end;
 
begin
  proc(P);{вызывам первую функцию}
  proc(Q);{вызывам вторую функцию}
  readln;
end.
Вот как-то так.
5
148 / 111 / 83
Регистрация: 09.09.2011
Сообщений: 274
16.11.2012, 01:04  [ТС]
Такого развернутого ответа ни где еще не видел! Огромное спасибо!!!

Добавлено через 24 минуты
А не могли бы вы проверить является написанный мною код верным. Ну тоесть реализован вызов функции как параметр процедуры. Да и вообще корректность кода. Все ли верно?

Условие задачи: решить уравнение f(x)=0 на неком отрезке с заданной точностью, методом дихотомии (деление отрезка пополам)

Функция: 1/(x+sqrt(x+0.3)+exp(-x) +1.7)-x

Код:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uses crt;
type Tfun=function(x:real):real;
var a,b:real;
    i,n:byte;
    Mtoch,Motv:array [1..10] of real;
 
{$F+}
function F(a:real):real;
begin
    F:=1/(a+sqrt(a+0.3)+exp(-a) +1.7)-a;
end;
{$F-}
 
procedure search_coren(Mtoch,a,b:real; f:Tfun; var x:real);
var fx,fa:real;
begin
      while (b-a)>Mtoch do
       begin
        fa:=F(a);
        x:=(a+b)/2;
        fx:=F(x);
            if fa*fx>0 then a:=x else b:=x;
       end;
end;
 
begin
clrscr;
write('A=');
readln(a);
write('B=');
readln(b);
write('N=');
readln(n);
clrscr;
 
for i:=1 to n do
 begin
    write('E[',i,']=');
    readln(Mtoch[i]);
 end;
 
clrscr;
 
for i:=1 to n do
 begin
    search_coren(Mtoch[i],a,b,F,Motv[i]);
    writeln('',Motv[i]);
 end;
 
readkey
end.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.11.2012, 01:11
Если вас терзают сомнения - запустите, посмотрите на результат. Если расчет верен, то все хорошо.
Цитата Сообщение от stimo15 Посмотреть сообщение
Да и вообще корректность кода. Все ли верно?
Если что-то там не верно, то компилятор будет зло ругаться И более того, даже подсветит строчку.
0
 Аватар для Andrew Puchinin
35 / 9 / 1
Регистрация: 25.04.2016
Сообщений: 175
24.11.2016, 15:01
HighPredator, аналогичная проблема, тестирую ваш код (во-первых, обнаружилось, что в процедуре Q переменная "с" а не "а"), и компилятор ругается на вызов функций
Pascal
1
2
proc(P);{вызывам первую функцию}
  proc(Q);{вызывам вторую функцию}
Error: Wrong number of parameters specified for call to "P"
Подскажите, что делать?

Добавлено через 44 минуты
Кажется нашел: надо использовать указатели, то бишь результат вызова будет выглядеть так:
Pascal
1
2
  proc(@P);{вызывам первую функцию}
  proc(@Q);{вызывам вторую функцию}
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
24.11.2016, 15:02
Для Турбо Паскаль.
Pascal
1
2
3
4
5
6
7
var x,y:real;
begin
//ввод x,y
  proc(P(x));{вызывам первую функцию}
  proc(Q(y));{вызывам вторую функцию}
  readln;
end.
0
 Аватар для Andrew Puchinin
35 / 9 / 1
Регистрация: 25.04.2016
Сообщений: 175
24.11.2016, 15:11
Только вот, почему-то, если функция находится в классе, такой вариант не работает, пишет:
Error: Got "<procedure variable type of function(Real)ouble of object;Register>", expected "<procedure variable type of function(Real)ouble;Register>"
Мне пришлось вытащить функцию из класса, чтобы заработало...

Добавлено через 58 секунд
Puporev, а, простите, я на Лазарусе...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
26.11.2016, 17:23
Andrew Puchinin,
сигнатура метода отличается от сигнатуры свободной процедуры/функции. Для указателя на метод предназначено ключевое слово "of object" (а для вложенных -- "is nested"), см. http://www.freepascal.org/docs... fse17.html
1
 Аватар для Andrew Puchinin
35 / 9 / 1
Регистрация: 25.04.2016
Сообщений: 175
26.11.2016, 21:15
bormant, большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2016, 21:15
Помогаю со студенческими работами здесь

Двумерный массив как параметр функции или процедуры
У меня возникла такая проблема. Есть несколько двумерных массивов с идентичной структурой. Для операций над ними я создал процедуру, в...

Функция подсчета суммы тех столбцов массива, номера которых передаются в функцию как параметр
Дан двумерный массив D.( m и n &lt;=10) Разработать 2 подпрограммы: 1. Процедуру ввода массива, используя датчик случайных чисел...

Можно ли вывести выходной параметр процедуры
Здраствуйте подскажите пожалуйста как вывести на экран выходной параметр процедуры без дополнительных переменных procedure znak(var...

Как изменить параметр процедуры?
Вот такая примерно программа и процедура в ней Program test(input,output); procedure test1(var a1); begin asm ...

Фактический параметр процедуры как указатель
Необходимо передать параметр в качестве параметра по умолчанию как указатель в процедуру, что бы менять значение переменной в основной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru