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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 16:15   #1
pavloff_049
Новичок
Джуниор
 
Регистрация: 30.09.2011
Сообщений: 2
По умолчанию Go To

Ребят...неделю писал программу метод касательных через процедуру Go to, наконец то заработала, но препод увидев ее ругаться начала на мою бездарность, говорит что вызов процедуры нерационально...кто может подскажите как это исправить, вот моя задача

Код:
Program MHK;
Uses CRT;
var a, b, Y: real;
function f(x: real): real;
var func: real;
begin
func:=x*x-20*sin(x);
f:=func;
end;
function f1(x: real): real;
var func: real;
begin
func:=2*x-20*cos(x);
f1:=func;
end;
function f2(x: real): real;
var func: real;
begin
func:=2+20*sin(x);
f2:=func;
end;
procedure schet (a, b: real; var res: real);
var k, E, O, x0, x, r: real;
label m1;
begin
E:=0.00001;
k:=0;
IF f(a)*f2(a)>0
THEN
begin
x0:=a;
GOTO m1;
end
ELSE
x0:=b;
GOTO m1;
m1:
k:=k+1;
x:=x0-f(x0)/f1(x0);
O:=x0-x;
writeln ('k:',k:2:0,' x:',x0:2:5,' f(x):',x:2:5,' E:',O:2:5);
O:=x-x0;
IF O>=0 Then O:=O Else O:=-O;
IF O>=E
THEN
begin
x0:=x;
GOTO m1;
end
ELSE
res:=x;
end;
BEGIN
a:=0.001;
b:=4;
schet (a,b,Y);
writeln ('Otvet:',Y:2:5);
END.
заранее спасибо=)))

Последний раз редактировалось Stilet; 30.09.2011 в 21:38.
pavloff_049 вне форума Ответить с цитированием
Старый 30.09.2011, 16:53   #2
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

вместо к примеру функции f

function f(x: real): real;
var func: real;
begin
func:=x*x-20*sin(x);
f:=func;
end;

в коде заменить к примеру
x:=x0-f(x0)/f1(x0);

на
x:=x0-(x0*x0-20*sin(x0))/(x0*x0-20*sin(x0));

А так это бред какой то хер поймёшь что он делает...
Guy вне форума Ответить с цитированием
Старый 30.09.2011, 17:32   #3
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
var
  a, b, y: real;

function f(x: real): real;
begin
  f := (x * x - 20 * sin(x)) * (2 + 20 * sin(x));
end;

function f1(x: real): real;
begin
  f1 := (x * x - 20 * sin(x)) / (2 * x - 20 * cos(x));
end;

procedure schet(a, b: real; var res: real);
var
  k, E, O, x0, x: real;
label
  m1;
begin
  E := 0.00001;
  k := 0;
  if f(a) > 0 then
  begin
    x0 := a;
    GOTO m1;
  end
  else
    x0 := b;
  GOTO m1;
m1:
  k := k + 1;
  x := x0 - f1(x0);
  O := x0 - x;
  writeln('k:', k:2:0, ' x:', x0:2:5, ' f(x):', x:2:5, ' E:', O:2:5);
  O := x - x0;
  if O >= 0 then
    O := O
  else
    O := -O;
  if O >= E then
  begin
    x0 := x;
    GOTO m1;
  end
  else
    res := x;
end;
ZuBy вне форума Ответить с цитированием
Старый 30.09.2011, 22:02   #4
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

1. Например вместо функции f можно поставить один оператор:
f:=x*x-20*sin(x)
2. Оформи код для удобночитаемости. Вот неправильное оформление кода:
Код:
var i:integer;
begin
i:=6;
Writeln('testProgram');
if i>6 then
begin
Writeln('i>6')
Writeln(':-)');
end;
else Writeln(':-(')
...
end;
А вот правильное:

Код:
var i:integer;
begin
   i:=6;
   Writeln('testProgram');
   if i>6 then
      begin
      Writeln('i>6')
      Writeln(':-)');
      end;
   else Writeln(':-(')
...
end;
Из книги:
Цитата:
Где можно поставить один пробел, можно поставить несколько.
Турбо Паскаль 7.0 Самоучитель


Код трудночитаем и имеет глупые процедуры и способы исчисления.
Сократи код убрав ненужные функции и переменные.

Итого:
1. Оформи код.
2. Построй код правильнее.

Последний раз редактировалось hon; 01.10.2011 в 19:54.
hon вне форума Ответить с цитированием
Старый 30.09.2011, 22:23   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я уже молчу про использование меток (вполне можно (И НУЖНО) обойтись без них!),
но вот этот участок кода меня шокировал:
Цитата:
Код:
 if f(a) > 0 then
  begin
    x0 := a;
    GOTO m1;
  end
  else
    x0 := b;
  GOTO m1;
m1:
  k := k + 1;
это полная бессмыслица - переходить туда, куда и так перейдёт управление.
этот кусочек кода должен быть записан так (с полным сохранением функциональности!):
Код:
 if f(a) > 0 then
    x0 := a
  else
    x0 := b;
m1:
  k := k + 1;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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