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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2008, 18:29   #21
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Это понятно, теперь надо понять как отрицательный корень возвращать, ведь значения корня два, одно положительное, а второе отрицательное.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 11.09.2008, 18:38   #22
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Не знаю сколько ты классов кончил, но по-моему в классе восьмом уже знают, что если y^2=x, то y1=+sqrt(x); y2=-sqrt(x); при этом действительные корни существуют только при x>=0; В классе 10-11 уже знают, что и корни из отрицательных чисел тоже есть, только они представлены иррациональными числами, или комплексными, но для решения задач практической геомеотрии они смысла не имеют.
puporev вне форума Ответить с цитированием
Старый 11.09.2008, 18:47   #23
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Не знаю сколько ты классов кончил, но по-моему в классе восьмом уже знают, что если y^2=x, то y1=+sqrt(x); y2=-sqrt(x); при этом действительные корни существуют только при x>=0; В классе 10-11 уже знают, что и корни из отрицательных чисел тоже есть, только они представлены иррациональными числами, или комплексными, но для решения задач практической геомеотрии они смысла не имеют.
Это понятно, но в программе почему то, что y1=+sqrt(x), что y2=-sqrt(x), получаются одинаковые положительные значения. Я думал что можно как то задать отрицательное значение корня.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 11.09.2008 в 18:50.
rainbow вне форума Ответить с цитированием
Старый 11.09.2008, 18:52   #24
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
но в программе почему то что y1=+sqrt(x), что y2=-sqrt(x), получаются одинаковые
Этого не может быть, потому что этого не может быть никогда, разве что при х=0.
puporev вне форума Ответить с цитированием
Старый 11.09.2008, 19:03   #25
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Этого не может быть, потому что этого не может быть никогда, разве что при х=0.
Я это уже понял, сейчас уже ищу ошибку в программе.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 13.09.2008, 08:33   #26
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Есть две функции, они почти одинаковые, отличаются только знаком в одном из уравнений, можно ли объеденить их в одну функцию?
Код:
Function Pokrprpol (var Sop:real):real;
var
Xa,Xb,Dx,Ds:real;
begin
Xa:=0;
Xb:=xe;
Dx:=(Xb-Xa)/N;
Sop:=0;
repeat
Y:=Sqrt(Sqr(R)-Sqr(Xa-xo))+yo;
Ds:=Dx*Y;
Sop:=Sop+Ds;
Xa:=Xa+Dx;
until Xa=Xb;
Pokrprpol:=Abs(Sop);
end;

Function Pokrprotr (var Sot:real):real;
var
Xa,Xb,Dx,Ds:real;
begin
Xa:=0;
Xb:=xe;
Dx:=(Xb-Xa)/N;
Sot:=0;
repeat
Y:=(-Sqrt(Sqr(R)-Sqr(Xa-xo)))+yo;
Ds:=Dx*Y;
Sot:=Sot+Ds;
Xa:=Xa+Dx;
until Xa=Xb;
Pokrprotr:=Abs(Sot);
end;
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 13.09.2008 в 08:39.
rainbow вне форума Ответить с цитированием
Старый 13.09.2008, 10:24   #27
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Для таких случаев, когда в процедурах или функциях используются другие процедуры или функции, имеется так называемый процедурный, или функциональный тип переменных. Можете почитать об этом в учебниках.
Ваш случай будет выглядеть примерно так (не зная сути задачи невозможно написать точно).
Код:
type
   Func=function(a,b,c,d:real):real;//тип - функция

var
  {peremennye osnovnoj programmy}

{$F+}                                     //раздел описания функций
function F1(R,Sa,xo,yo:real):real;//первая функция- положительный корень
  begin
     F1:=Sqrt(Sqr(R)-Sqr(Xa-xo))+yo;
  end;
function F2(R,Sa,xo,yo:real):real;//вторая функция - отрицательный корень
  begin
   F2:=-Sqrt(Sqr(R)-Sqr(Xa-xo))+yo;
  end;
{$F-} //конец раздела
Function Pokrprotr (Sot:real;FF:Func):real;
var
Xa,Xb,Dx,Ds:real;
begin
Xa:=0;
Xb:=xe;
Dx:=(Xb-Xa)/N;
Sot:=0;
repeat
Ds:=Dx*FF(R,Sa,xo,yo);
Sot:=Sot+Ds;
Xa:=Xa+Dx;
until Xa=Xb;
Pokrprotr:=Abs(Sot);
end;
В основной программе вызываете Function Pokrprotr с актуальными параметрами, например:
if aaaaa then Z:=Pokrprotr(sot,F1)
else Z:=Pokrprotr(sot,F2);
puporev вне форума Ответить с цитированием
Старый 13.09.2008, 11:24   #28
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Я сделал проще, через переменную
zn:integer, если zn:=1 то функция берет положительный корень, если zn:=-1, то функция берет отрицательный корень.
Код:
Function Pokrprotr (zn:integer; var Sot:real):real;
var
Xa,Xb,Dx,Ds:real;
begin
Xa:=0;
Xb:=xe;
Dx:=(Xb-Xa)/N;
Sot:=0;
repeat
Y:=(zn)*(Sqrt(Sqr(R)-Sqr(Xa-xo)))+yo;
Ds:=Dx*Y;
Sot:=Sot+Ds;
Xa:=Xa+Dx;
until Xa=Xb;
Pokrprotr:=Abs(Sot);
end;
Проблема теперь другая, программа виснет, когда вызывается функция:
Код:
Function Pelpr(Xa,xe:real; N:longint):real;
var
Xb,Dx,Ds,Sep:real;
begin
Xb:=xe+a;
Dx:=(Xb-Xa)/N;
Sep:=0;
repeat
Y:=Sqrt(Sqr(a)*Sqr(b)-Sqr(b)*Sqr(Xa-xe))/a;
Ds:=Dx*Y;
Sep:=Sep+Ds;
Xa:=Xa+Dx;
until Xa=Xb;
Pelpr:=Sep;
end;
Вызывается она вот так:
Код:
Const
a:longint=29;
b:longint=35;
Var
N:longint;
Xa;xe:real
..........
Xa, N и xe были определены ранее
N:=20
Xa:=0;
xe:=6.883;
Writeln('Sep= ',Pelpr(Xa,xe,N):7:3);
end.
То же самое и сдесь:
Код:
program otl;
Uses Crt;
{$Q+,R+}
Const
a:longint=29;
b:longint=35;
var
N:longint;
Y,Xa,xe,Xb,Dx,Ds,Sep:real;
begin
ClrScr;
Writeln('Введите N');
Readln(N);
xe:=Sqrt(Sqr(a)*Sqr(b)-Sqr(a)*Sqr(34))/b;
Xb:=xe+a;
Dx:=(Xb-Xa)/N;
Sep:=0;
repeat
Y:=Sqrt(Sqr(a)*Sqr(b)-Sqr(b)*Sqr(Xa-xe))/a;
Ds:=Dx*Y;
Sep:=Sep+Ds;
Xa:=Xa+Dx;
until Xa=Xb;
Writeln('Sep= ',Sep:7:3);
end.
При некоторых значениях N вылазит ошибка Invalid Floating Operation, хотя эта функция никаким боком не зависит от N,
N учавствует 1 раз при расчете Dx;
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 13.09.2008 в 15:28.
rainbow вне форума Ответить с цитированием
Старый 15.09.2008, 06:37   #29
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Все, уже разобрался:
Так как компьютер тупой, он все равно округлит хоть до одной миллиардной, по умолчанию или в большую сторону, или в меньшую. Поэтому надо писать условие так:
Код:
until Xa>=Xb;
Или лучше весь цикл так:
Код:
While Xa<Xb do
begin
.............................
end;
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 24.09.2008, 13:23   #30
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию Помогите разобраться

Написал прогу, но не могу отформатировать таблицу как мне надо
Вот кусок кода, который отвечает за вывод таблицы:
Код:
begin
ClrScr;
Writeln('Результат вычислений сводится в таблицу');
Writeln('В таблице:');
Writeln('колонка A-результат вычисления по методу прямоугольников');
Writeln('колонка B-результат вычисления по методу трапеций');
Writeln('колонка С-результат вычисления по методу Симпсона');
Writeln('вычисления площадей производятся в сумме областей A и B');
Writeln('Введите n и нажмите любую клавишу или ESC для выхода');
Writeln;
Writeln('------------------------------------------------------------');
Writeln('| Число разбиений |              Результат                 |');
Writeln('|                 |----------------------------------------|');
Writeln('|       n         |      A     |      B      |     C       |');
Writeln('|----------------------------------------------------------|');
Perem(xe,xo,yo,xp,yp,xp1,yp1);
repeat
Write('|      ');
Read(N);
Ploshad(xe,xp1,yp1,xp,xo,yo,N,Smr,Smt,Sms);
Write('                  |  ');
Write(Smr:8:4);
Write(' |  ');
Write(Smt:8:4);
Write('  |  ');
Write(Sms:8:4);
Writeln('  |');
c:=Readkey;
until c=#27;
Writeln('------------------------------------------------------------');
end.
Но почему то резутьтат вычислений переходит на следующую строку, а не остается там где должен.

Т.е значения A, B, C в таблице должны быть напротив значения n=20.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите разобраться Tanuska___:) БД в Delphi 1 04.09.2008 14:56
Помогите разобраться! Holodok Помощь студентам 12 02.05.2008 18:13
помогите разобраться!) Юliana Помощь студентам 1 30.01.2008 01:16
помогите разобраться с Rss Hallo HTML и CSS 0 24.11.2006 18:44