не могу понять в зависимости от чего Z получает значение в тексте программы.
подскажите почему
uses crt;
label 0; {описываем метку}
var
rez:real;
m,n:longint; {описали глобальные переменные, используемые в программе}
function fact(z: longint): real; {заголовок функции с формальным параметром-
значением, типом}
var
y: real; {описали локальную переменную}
begin
y:=1; {для получения результата необходимо присвоить у значение 1. также
при помощи этого реализуется вычисление 0! и 1!}
while z>1 do {запускаем цикл в обратную сторону, для упрощения опустим
множитель 1}
begin
y:=y*z;
z:=z-1
end;
fact:=y{вычисляем факториал, присваиваем его значение функции}
end; {конец функции}
begin{начало тела программы}
writeln('введите неотрицательные числа'); {для удобства пользователя просим
ввести числа}
0:readln(m,n); {в память вводятся числа}
if m or n <0 then begin
writeln(‘вы ошиблись, вводите неотрицательные числа’);
goto 0 {при ошибке пользователя предотвращаем выдачу неверного результата}
end;
rez:=(fact(m)+fact(n))/fact(m+n); {вычисляется значение данного выражения}
writeln('результат: ',rez) {выводим на экран результаты счета}
readkey
end.
Z - это формальный параметр, с которым работает подпрограмма.
Ты передаешь в функцию какое-то значение, внутри функции оно доступно под именем Z.
так я же ни где z н присваиваю значение. А Z здесь параметр-переменная или параметр-константа?
если хочешь что бы функция не давала никакого значения Z просто обнули его в самом начале.
спасибо за помощь
У меня еще вопрос
Почему эти 2 примера работают одинаково
uses crt;
var
x,y:byte;
z:real;
function qw(a:byte):real;
begin
z:=(x+y)*2/y;
qw:=z;
writeln(z:0:9)
end;
begin
clrscr;
write(' vvwdite a i b ');
read(x,y);
qw(x);
writeln(' (x+y)*2/y= ',qw(x):0:13);
readkey
end.
uses crt;
var
x,y:byte;
z:real;
function qw{(a:byte)}:real;
begin
z:=(x+y)*2/y;
qw:=z;
writeln(z:0:9)
end;
begin
clrscr;
write(' vvwdite a i b ');
read(x,y);
qw;
writeln(' (x+y)*2/y= ',qw:0:9);
readkey
end.
я вот понимаю функцию так: в теле функции пишем операторы, имени функции присваиваем значение. потом при вызове функции используется ее значение. Вот например я делал программу, там надо найти дату на к дней назад с учетом висогного года. Значит можно сделать функцию логического типа и если год високосный то ей присвоить значение TRUE иначе FALSE. а потом в самой программе при проверке условия просто подтавляем
IF ИМЯ ФУНКЦИИ THEN в феврале 29 дней...
я правильно понял?
function visgod:longint{хотя можно integer};
begin
if (god mod 4=0) and not((god mod 100=0) and (god mod 400<>0)) then
visgod:=god;
end
Вроде того?
Я вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=19970&view=findpost&p=112078
тебе уже показывал, КАК ИМЕННО, а не "вроде того"...
всегда прокалываюся здесь
еще в тетради записывал, что не надо логич переменной присваивать значение с промощью условного оператора.
эх..
спасибо за ответы
у меня еще вопрос
Function f(a:'a'..'z'):boolean;Почему так нельзя описывать параметры?? Обязательно надо создать свой диапазонный тип??
не позволяет конструировать типы в заголовках подпрограммЯсно, т.е. можно использовать только уже описанные типы. А вот здесь
procedure(const A: array of mas_type; const size: integer);при описание массива?? И еще, как еще можно описать параметры, кроме как через VAR,CONST?? или это все способы??
А вот здесь - ты не конструируешь новый тип, ты используешь открытый массив - их возможно использовать только в качестве параметров подпрограммы. Даже если в 32-битных компиляторах ты создашь динамический массив через
type
T = array of integer;
procedure p(var arr: array of integer);
procedure p(var v);
begin
end;
Спасибо volvo
помог как всегда
Можно еще вопрос?
Вот в основной программе можно сделать так
n:=f(z);А в самой функции f как-нибудь можно написать
k:=f;Чтоб в К лежало значение этой функции, но чтоб при этом не было рекурсии, чтоб здесь компилятор не просил параметр. Если можно, то как?
Если имя функции написано справа от знака присваивания - то это в любом случае трактуется компилятором как рекурсия. Для решения данной проблемы можно описать переменную result (которая уже есть в более новых компиляторах), и пользоваться ей, и только в самом конце присвоить ее значение имени функции, НО...
Возникает вопрос: а зачем тебе это? Зачем понадобилось внутри функции получать ее же значение? А если оно еще не вычислено до конца, тогда что?
Я так и не понял, зачем тебе внутри функции ее же значение понадобилось несколько раз? Ну, ладно...
var i: integer;
function f(value: integer): integer;
var result: integer;
begin
result := value + 30; { <--- Предварительный результат функции }
{ ... }
i := result; { <--- Запоминаем }
{ ... }
result := result * 3; { пришлось еще ДОвычислить }
f := result; { <--- окончательный результат }
end;
begin
writeln('function = ', f(12)); { <--- Печатаем окончательный результат }
writeln('i = ', i) { <--- А это - промежуточный }
end.
function f(n:integer):byte;Функция подсчета количества цифр в числе.
var
k:byte;
begin
k:=0;
repeat
n:=n div 10;
inc(k)
until n<=0;
f:=k
end;
function f(n: integer): byte;, если что
begin
if n < 10 then f := 1
else f := 1 + f(n div 10);
end;