Если в качестве формального параметра указана переменная, то такой параметр и есть параметр-значение. Примерами таких параметров служат параметры a, b и с в процедуре sq :
В этом случае фактическим параметром, соответствующим a либо b либо c , может быть любое выражение соответствующего типа, в частности, константа.
Например, обратиться к sq можно так:
Для параметров-значений машина при вызове процедур производит следующие действия: выделяет место в памяти для каждого формального параметра, вычисляет значение фактического параметра и записывает его в ячейку, соответствующую формальному параметру.
Если фактический параметр есть имя переменной, например, r , то значение этой переменной пересылается в соответствующий формальный параметр, например, a . На этом всякая связь между a и r обрывается.
Если даже фактический и формальный параметры одинаково обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это полезно знать, чтобы не допустить распространенной среди начинающих программистов ошибки – пытаться передать информацию из процедуры в вызывающую программу через параметр-значение.
В программе происходит засылка числа 2 в ячейку, отведенную для переменной i , затем идет обращение к процедуре p с фактическим параметром i = 2. При этом значение 2 пересылается в другую ячейку, отведенную для формального параметра i . В этой ячейке после выполнения оператора i := i * 2 появляется число 4. Но после возврата из процедуры на оператор writeln программа "знает" только одну переменную i , которая по-прежнему содержит число 2. Поэтому программа выведет i = 2.
Если формальный параметр есть параметр-значение, то соответствующим фактическим параметром должно быть выражение того же типа, что и формальный параметр.
объясните, в чём ошибка, и как её исправить
type fraction=record
a,b,integ:integer; end;
function min(a,b:integer):integer; // наим из 2 чисел
begin
if a b then max:=a else max:=b;
end;
function nod(a,b:integer):integer; //НОД
var x,i:integer;
begin
x:=max(a,b) div 2;
for i:=1 to x do
if (a mod i=0) and (b mod i=0) then nod:=i;
end;
function nok(a,b:integer):integer;
var i:integer;
begin
for i:=a*b downto min(a,b) do
if (i mod a=0) and (i mod b=0) then nok:=i;
end;
procedure red(var fr:fraction); //сокращение дроби
var d:integer;
begin
d:=nod(fr.a,fr.b);
if d<>1 then begin
fr.a:=fr.a div d;
fr.b:=fr.b div d;
end;
end;
procedure r2w(var fr:fraction); //из прав в неправ
begin
fr.a:=fr.a+fr.b*fr.integ;
fr.integ:=0;
end;
procedure w2r(var fr:fraction); //из неправ в прав
begin
fr.integ:=fr.integ+fr.a div fr.b;
fr.a:=fr.a-(fr.a div fr.b)*fr.b;
end;
procedure ob_zn(var fr1,fr2:fraction); //приведение к ощбщему знаменателю
var m1,m2:integer; //доп. множители 1 и 2
begin
m1:=nok(fr1.b,fr2.b) div fr1.b;
m2:=nok(fr1.b,fr2.b) div fr2.b;
fr1.a:=fr1.a*m1; fr1.b:=fr1.b*m1;
fr2.a:=fr2.a*m2; fr2.b:=fr2.b*m2;
end;
function _plus(fr1,fr2:fraction):fraction; //сложение
begin
ob_zn(fr1,fr2);
_plus.integ:=fr1.integ+fr2.integ; //РУГАЕТСЯ НА ЭТУ СТРОЧКУ.
_plus.a:=fr1.a+fr2.a;
_plus.b:=fr1.b;
red (_plus);
w2r (_plus);
end;
begin
// ввод дроби в виде
// "1 5 8" — это
// одна целая пять восьмых
readln (fr1.integ,fr1.a,fr1.b);
readln (fr2.integ,fr2.a,fr2.b);
fr:=_plus(fr1,fr2);
writeln (fr.integ,’ ‘,fr.a,’ ‘,fr.b);
end.
Примечание:
строчка с ошибкой выделена в комментариях
Задача: посчитать экстремумы функции итерационным способом.
В строке:
writeln(‘Минимальный элемент f(x): X = ‘,iter1);
выбивает ошибку.
Подскажите пожалуйста как устранить
Uses Crt;
Const dx=0.01;
var
x0,xn,x,y:real;
integ:real;
function f(x:real):real;
begin
result:=sin(x)-cos(2*x);
end;
function iter1(x0,xn:real):real;
begin
y:=f(x0);
while x0 xn do
begin
x0:=x0+dx;
if f(x0)> y then
begin
iter2:=f(x0);
end; end;
begin
clrscr;
begin
writeln(‘Введите нижнюю границу’); readln(x0);
writeln(‘Введите верхнюю границу’); readln(xn);
writeln(‘ Итерационный вариант: ‘);
writeln(‘Минимальный элемент f(x): X = ‘,iter1);
writeln(‘Максимальный элемент f(x): X =’,iter2);
readln; end;
end.
Здесь легко и интересно общаться. Присоединяйся!
integ:real;
Не стоит называть одни переменные под другие (типы) , даже сокращенно. Это путает.
while x0 xn do
Это что за невычисляемая хрень. Если надо хн сравнивать с х0, то и сравнивайте с ним. А с собой сравнивать вообще смысла нету.
Что такое итер2. Вы его 2 раза используете, но не обьявляете.
clrscr;
begin — вот этот бегин излишен. Он не помешает, но смысла в нем нету.
Вы вызываете итер1 без параметров (а итер 2 вообще не существует) , а сами-же описали его с 2 параметрами.
что-то не пойму логики условия, походу проблема в этом