Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Отредактируйте пожалуйста... Что-то у меня не получается. (http://www.tehnari.ru/f41/t31455/)

Sergei47 25.12.2009 20:56

Отредактируйте пожалуйста... Что-то у меня не получается.
 
Program C12;
var C,f,x,y,k: real;
Begin
writeln ('A BoT BaM u PEzyJIbTAT');
read (x,y,k);
x:=2.64;
y:=0.138;
k:=8;
f(x,y):=(1-exp(x)+sqr(y))/(sqrt(x)+sqrt(y); (там выдает ошибку)
C:=f(x,y)+2*f(x+2,y-k)+f(x-y,k);
WRITELN ('C=',C);
READLN;
END.

Vladimir_S 25.12.2009 21:35

Цитата:

Сообщение от Sergei47 (Сообщение 274577)
Program C12;
var C,f,x,y,k: real;
Begin
writeln ('A BoT BaM u PEzyJIbTAT');
read (x,y,k);
x:=2.64;
y:=0.138;
k:=8;
f(x,y):=(1-exp(x)+sqr(y))/(sqrt(x)+sqrt(y); (там выдает ошибку)
C:=f(x,y)+2*f(x+2,y-k)+f(x-y,k);
WRITELN ('C=',C);
READLN;
END.

Естественно, выдает! Так функции в Паскале не задаются. А как правильно - есть в любом учебнике и руководстве. Кстати, в знаменателе еще и общая скобка не закрыта. Но это так, мелочь.

DDS 25.12.2009 23:01

Вы бы задание выложили...

Vladimir_S 25.12.2009 23:18

Да задание-то понятно! Ладно уж, выложу как надо:
Код:

Program C12;
var
C,f,x,y,k: real;

Function f(xf,yf:real):real;
begin
 f:=(1-exp(xf)+sqr(yf))/(sqrt(xf)+sqrt(yf));
end; {f}

Begin
 writeln ('A BoT BaM u PEzyJIbTAT');
 x:=2.64;
 y:=0.138;
 k:=8;
 C:=f(x,y)+2*f(x+2,y-k)+f(x-y,k);
 WRITELN ('C= ',C);
 READLN;
END.


Sergei47 26.12.2009 07:49

Цитата:

Сообщение от Vladimir_S (Сообщение 274653)
Function f(xf,yf:real):real;

Вот здесь ошибку выдает:(...

DDS 26.12.2009 09:55

Цитата:

Сообщение от Sergei47 (Сообщение 274742)
Вот здесь ошибку выдает:(...

Да, здесь он действительно выдаёт ошибку duplicat identifier(2 одинаковых имени). Так переменуйте переменную f на f1 или что-нибудь подобное.
Но далее он всё равно выдаст ошибку invalid floating operation.
Для борьбы с этим я предлагаю поставить перед вычислением f поставить if. Тогда функция будет иметь вид
Код:

Function f(xf,yf:real):real;
begin
if (xf>0)and(yf>0) then
 f:=(1-exp(xf)+sqr(yf))/(sqrt(xf)+sqrt(yf));
end; {f}


Sergei47 26.12.2009 10:07

спс попробую..

Vladimir_S 26.12.2009 17:27

Сижу красный, как рак. От стыда. Извините - не надо ничего переименовывать, а надо просто убрать f из раздела описания переменных.
А вот что касается второй ошибки (floating)... Я предполагаю, что либо значения параметров заданы неверно, либо вид функции. А если уж вставлять условный оператор, то надо бы продолжить чем-нибудь типа ELSE выдать сообщение о неподходящих значениях параметров и осуществить прерывание программы (HALT). Иначе значение функции останется неопределенным, что некрасиво.

Vladimir_S 26.12.2009 17:53

Ну вот вариант с полной защитой. Отлаженный:
Код:

Program C12;
var
C,x,y,k: real;

Function f(xf,yf:real):real;
begin
 f:=(1-exp(xf)+sqr(yf))/(sqrt(xf)+sqrt(yf));
end; {f}

Begin
 Repeat
  Repeat
  Write('x= '); ReadLn(x);
  If x<0 then WriteLn('x<0 !!!');
  until x>=0;
  Repeat
  Write('y= '); ReadLn(y);
  If y<0 then WriteLn('y<0 !!!');
  until y>=0;
  If (x-y)<0 then Writeln('(x-y)<0 !!!');
 until (x-y)>=0;
 Repeat
  Repeat
  Write('k= '); ReadLn(k);
  If k<0 then WriteLn('k<0 !!!');
  until k>=0;
  If (y-k)<0 then Writeln('(y-k)<0 !!!');
 until (y-k)>=0;
 writeln ('A BOT BAM u PE3YJIbTAT:');
 {x:=2.64;
 y:=0.138;
 k:=8;}
 C:=f(x,y)+2*f(x+2,y-k)+f(x-y,k);
 WRITELN ('C= ',C);
 READLN;
END.


DDS 26.12.2009 20:50

Vladimir_S, да ладно Вам! Предстваьте какой я должен был сидеть, после ваших постов и сообщений от Long Cat :)


Часовой пояс GMT +4, время: 04:14.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.