• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Pascal RGR

  • Автор темы Автор темы Rume
  • Дата начала Дата начала
Ну и собственно программа:
Код:
Const
 b=31.39329;
 Xn=0.5;
 Xk=2.0;
 Dx=0.5;
 An=0.1;
 Ak=0.5;
 Da=0.1;
Var
 x,a:Real;
 Na,Nx,i,j:Byte;

Function f(xf,af:real):real;
begin
 If xf<1 then f:=Sin(af*xf/b) else
 f:=Sqrt(sqr(af)*sqr(sqr(xf))+sqr(b))/xf/sqr(xf);
end;

BEGIN
 Nx:=ROUND((Xk-Xn)/Dx);
 Na:=ROUND((Ak-An)/Da);
 for i:=0 to Na do
  begin
   a:=An+Da*i;
   for j:=0 to Nx do
    begin
     x:=Xn+Dx*j;
     Writeln('x=',x:3:1,'    a=',a:3:1,'    f=',f(x,a):0:5);
    end;
  end;
 Readln;
END.
 
спасибо, но почему то мне кажется что чего-то не хватает....
 
не хочу показаться совсем дураком, но вот к примеру нам нужно написать текст процедуры ввода массива, табулирования функции, ResOut...просто без этого беда будет, а по скольку вы сказали, что в том, что я вам скидывал (в плане "программы") очень много ошибок, я не совсем знаю как это записать...
 
и вот еще проблема, нужно не константами брать, а вызывать из различных подпрограмм (надеюсь правильно выразился). Тоесть например из программы высчитывания b мы вызываем это значение, а не задаем его в виде константы.
 
не хочу показаться совсем дураком, но вот к примеру нам нужно написать текст процедуры ввода массива, табулирования функции, ResOut...просто без этого беда будет, а по скольку вы сказали, что в том, что я вам скидывал (в плане "программы") очень много ошибок, я не совсем знаю как это записать...
Мне очень жаль, но я просто опять не понимаю, о чем речь. Вы выложили задачу, я написал программу, эту задачу решающую. Причем тут массивы? С какого они тут боку-припёку? Нет, не вижу. Извините.
 
и вот еще проблема, нужно не константами брать, а вызывать из различных подпрограмм (надеюсь правильно выразился). Тоесть например из программы высчитывания b мы вызываем это значение, а не задаем его в виде константы.
Можно объединить программы. Например, так:
Код:
Const
 Xn=0.5;
 Xk=2.0;
 Dx=0.5;
 An=0.1;
 Ak=0.5;
 Da=0.1;
 a0=2.51;
 b0=-0.69;
Var
 x,a,b:Real;
 Na,Nx,i,j:Byte;

Function I0(x:real):Real;
begin
 I0:=0.5*Sin(x*2);
end;

Function I1(x:real):Real;
begin
 I1:=Cos(x*2)/4+x*Sin(x*2)/2;
end;

Function I2(x:real):Real;
begin
 I2:=x/2*Cos(x*2)+(sqr(x)/2-0.25)*Sin(x*2);
end;

Function I3(x:real):Real;
begin
 I3:=(sqr(x)*0.75-0.375)*Cos(x*2)+(x*sqr(x)/2-0.75*x)*Sin(x*2);
end;

Function I4(x:real):Real;
begin
 I4:=sqr(sqr(x))*Sin(x*2)/2-2.0*((sqr(x)*0.75-0.375)*Sin(x*2)-(x*sqr(x)/2-x*0/75)*Cos(x*2));
end;

Function f(xf,af:real):real;
begin
 If xf<1 then f:=Sin(af*xf/b) else
 f:=Sqrt(sqr(af)*sqr(sqr(xf))+sqr(b))/xf/sqr(xf);
end;

BEGIN
 b:=(I4(b0)+I3(b0)*2+I2(b0)*5+I1(b0)*4+I0(b0)*4)-(I4(a0)+I3(a0)*2+I2(a0)*5+I1(a0)*4+I0(a0)*4);
 Nx:=ROUND((Xk-Xn)/Dx);
 Na:=ROUND((Ak-An)/Da);
 for i:=0 to Na do
  begin
   a:=An+Da*i;
   for j:=0 to Nx do
    begin
     x:=Xn+Dx*j;
     Writeln('x=',x:3:1,'    a=',a:3:1,'    f=',f(x,a):0:5);
    end;
  end;
 Readln;
END.
 
Эхх...просто не смогу объяснить...
Попробую на примере показат тогда...(

---{b*sin^2ax при x<2
y={
---{xsqrt(ax+b) при Х>+2

Код:
Program TabRgr
const Nmax = 20
  type
Tmy=array[1..Nmax,1..Nmax] of Extended;
Tmx=array[1..Nmax] of Extended;
Ter=array[1..Nmax,1..Nmax] of integer;
  var
A,Mx:Tmx;
My: Tmy;
Xn,Xk,Dx,B,C,D,Xo,Eps,Z,Zt:Extended;
I,J,K,N,Err,Km:integer;
Er:Ter;
{Текст процедуры ввода массива}
Procedure DataIn(N: Integer;var A:Tmx);
var
  I:integer
begin
  for I:=1 to N do
   read(A[I]);
end;
 {Текст процедуры табулирования}
Procedure Tab(B,Xn,Xk,Dx:Extended; N:Integer; var Er:Ter;
var A,Mx:Tmx; Var My:Tmy};
var
  I,J:Integer;
  X,Y:Extended
begin
  for J:=1 to N do
   begin
     I:=1;
     X:=Xn;
     Er[J,I]:=0
repeat
   if X<2 then
     Y:=B*sqr(sin(A[j]*X))
    else if (A[j]*X+B)>0 then
        Y:=X*sqrt(A[J]*X+B)
       else Er[J,I]:=1;
       Mx[I]:=X; My[J,I]:=Y;
        Inc(I);
        X:=X+Dx;
      until X>Xk
    end;
end;
{Текст подпрограммы-функции}
Function F(C,D,X:Extended):Extended;
begin
  F:=C*sin(X)+X-D;
end;
{Пропустим нахождение корня}
{Текст процедуры вывода данных}
Procedure ResOut(Var Mx:Tmx; var A:Tmx; Var My:Tmy;
Var Er:Ter; K:integer);
Var
  I,J:Integer
begin
  for J:=1 to N do {Вывод результатов выполнения программы}
     begin
        writeIn('A[',J,']=',A[J]:8:4);
         writeIn('X',  'Y');
          for I:=1 to K do
           if Er[J,I]=1 then
            writeIn(Mx[I]:6:3, ' ошибка данных')
           else
            writeIn(Mx[I]:6:3,'   ',My[J,I]:6:3);
     end;
  end;

begin {Начало главной програмы}
 writeIn('Введите значение переменных:Xn,Xk,Dx,N');
 readIn(Xn,Xk,Dx,N);
writeIn('Xn=',Xn:4:2,' Xk=', Xk:4:2,' Dx=', Dx:4:2,' N=', N);
writeIn('Введите значения: параметров уравнения C,D; начального',
' приближения Xo, погрешности Eps, предельного числа циклов Km');
readIn(C,D,Xo,Eps,Km);
writeIn('C=',C:6:3, ' D=',D:6:3, ' Xo=',Xo:7:3, ' Eps=',Eps:7:5, ' Km=',Km:3);
  writeIn('Введите массив из N элементов');
   DataIn(N,A);    {Вызов подпрограммы ввода массива}
    Equat(Xo,Eps,Km,Err,Z); {Вызов подпрограммы  нахождения корня уравнения}
    if Err = 1 then
   begin
     writeIn('Корень не найден за', Km:2,' итераций');
     exit
    end;
   Zt:= F(C,D,Z);     {Погрешность вычисления корня по невязке}
   B:=Z;
  writeIn('Корень равен B=', B:4:2, ' Zt=', Zt:8:7);
 Tab(B,Xn,Xk,Dx,N,Er,A,Mx,My);    {Вызов подпрограммы табулирования}
 K:= trunc((Xk-Xn)/Dx+1);
ResOut(Mx,A,My,Er,K);                {Вызов подпрограммы вывода данных}    
readln;
end.

Кусок пропустил правда, но что смог - написал
Вот по этой программе мы должны были делать, лично я в ней нечего не понимаю(
 
Ладно, спасибо за проделанную работу, немного разными комментами подукрашу и будет небольшой шанс что пройдет :)
respect сайту и лично вам :)
 
Вот только если можно, не сможете сделать так, чтобы были не константы, а значения, которые пользователь вводит сам. И все, я перестану вам докучать.
 
лично я в ней нечего не понимаю
Я тоже. Тем более, там решается нелинейное уравнение, а мы вроде как договорились, что В ищем через интеграл. И в любом случае - не вижу в упор, зачем в этой задаче нужны массивы. По-моему, они тут "не пришей кобыле хвост".
Вот только если можно, не сможете сделать так, чтобы были не константы, а значения, которые пользователь вводит сам.
Пожалуйста:
Код:
Const
 a0=2.51;
 b0=-0.69;
Var
 x,a,b,Xn,Xk,Dx,An,Ak,Da:Real;
 Na,Nx,i,j:Byte;

Function I0(x:real):Real;
begin
 I0:=0.5*Sin(x*2);
end;

Function I1(x:real):Real;
begin
 I1:=Cos(x*2)/4+x*Sin(x*2)/2;
end;

Function I2(x:real):Real;
begin
 I2:=x/2*Cos(x*2)+(sqr(x)/2-0.25)*Sin(x*2);
end;

Function I3(x:real):Real;
begin
 I3:=(sqr(x)*0.75-0.375)*Cos(x*2)+(x*sqr(x)/2-0.75*x)*Sin(x*2);
end;

Function I4(x:real):Real;
begin
 I4:=sqr(sqr(x))*Sin(x*2)/2-2.0*((sqr(x)*0.75-0.375)*Sin(x*2)-(x*sqr(x)/2-x*0/75)*Cos(x*2));
end;

Function f(xf,af:real):real;
begin
 If xf<1 then f:=Sin(af*xf/b) else
 f:=Sqrt(sqr(af)*sqr(sqr(xf))+sqr(b))/xf/sqr(xf);
end;

BEGIN
 b:=(I4(b0)+I3(b0)*2+I2(b0)*5+I1(b0)*4+I0(b0)*4)-(I4(a0)+I3(a0)*2+I2(a0)*5+I1(a0)*4+I0(a0)*4);
 Write('Xn= ');
 Readln(Xn);
 Write('Xk= ');
 Readln(Xk);
 Write('Dx= ');
 Readln(Dx);
 Write('An= ');
 Readln(An);
 Write('Ak= ');
 Readln(Ak);
 Write('Da= ');
 Readln(Da);
 Nx:=ROUND((Xk-Xn)/Dx);
 Na:=ROUND((Ak-An)/Da);
 for i:=0 to Na do
  begin
   a:=An+Da*i;
   for j:=0 to Nx do
    begin
     x:=Xn+Dx*j;
     Writeln('x=',x:3:1,'    a=',a:3:1,'    f=',f(x,a):0:5);
    end;
  end;
 Readln;
END.
И все, я перестану вам докучать.
Да нет, обращайтесь, чем сможем - поможем.
 
Тем более, там решается нелинейное уравнение, а мы вроде как договорились, что В ищем через интеграл. И в любом случае - не вижу в упор, зачем в этой задаче нужны массивы. По-моему, они тут "не пришей кобыле хвост".

Да я у пары знакомых поспрашивал, они тоже самое говорят, но такая у нас преподавательница, женщина 75-80 лет) Требует, чтобы они там были.

Но спасибо за программу.
 
В общем мне сказали, что "неправильным способом" решено.
Нужно чтобы как в примере было :(
 
Назад
Сверху