примеры кода Pascal
26.08.2015, 12:55

                                             Примеры кода.

1.Упорядочить линейный массив

2. Составить рекурсивную функцию вычисления значения факториала заданного натурального числа

3. Решение ОДУ: метод Ейлера, метод Рунге-Кутты 4-го порядка.

 

1. Упорядочить одномерный числовой массив

program z1;
uses crt;
var A:array[1..100] of integer;  {of real}      {массив целый или действительный}
                     t:integer;  {real}                 {переменная такого же типа для временного хранения при обмене}
    n:integer;                                          {размерность и счетчики}
    i,j:integer;

begin
writeln('введите размерность N');readln(n);           {ввод размерности}

clrscr;
  writeln('исходный массив');
  writeln('');
  for i:=1 to n do                                     {ввод с клавиатуры или генерируем}
        {write('A[',i,']=  ');readln(A[i]);}
        A[i]:=random(90)+10;

    for i:=1 to n do                                   {вывод массива}
        write(A[i]:4);

writeln('');
                                             {сортировка методом пузырька}
for i:=1 to n-1 do                     {начиная с первого до предпоследнего}
     for j:=i+1 to n do                {сравнивая со всеми последующими}
        if A[i]<A[j] then              { if A[i]>A[j] then}
        begin                             {при необходимости меняем местами}
           t:=A[i];   A[i]:=A[j];   A[j]:=t
       end;
writeln('');
writeln(' полученный массив');                 {вывод}
  writeln('');
  for i:=1 to n do
        write(A[i]:4);
readln;
end.

 

                                                                                                                                  вверх

2.Составить рекурсивную функцию вычисления значения факториала заданного натурального числа.

                 {...........рекурсивная функция вычисления факториала}
                 {вх.параметры: число , возвращаемое значение: факториал}
function f(n:integer):integer;
begin
    if n <= 1 then          {если число меньше 2 то факториал равен 1 и это признак завершения работы}
        f := 1
   else                         {иначе функция равна числу умноженному на функцию от параметра на 1 меньшего}
      f := n * f(n - 1);
end;

                                                                                                                                    вверх

3.Решение ОДУ: метод Ейлера, метод Рунге-Кутты 4-го порядка.

uses crt;
const h=0.1;      {шаг сетки}
const y0=0.7;       {начальное условие}
var
a,b:real;             {края отрезка }
x,yE0,yRK0,yE1,yRK1:real;        {аргумент, значение по методу Ейлера и Рунге-Кутты}
 name : string;       {имя файла}
    f1 : text;     {файловая переменная}
dyE,dyRK:real;     {погрешности методов}

 

function f(x,y:real):real; {функция - правая часть ур-я}
begin
{f:=(y+2*x/y);}
f:=x*y-0.2*y*y;
end;

function fE(x,y,h:real):real; {функция - очередное значение по методу Ейлера}
begin
fE:=y+h*f(x,y);                {формула метода}
end;

Function fRK(x,y,h:real):real; {функция - коэффициенты метода Рунге-Кутты}
                               {и очередное значение }
var k1,k2,k3,k4:real;         {вычисляемые коэффициенты}
begin
 k1:=f(x,y);
 k2:=f(x+h/2,y+h*k1/2);
 k3:=f(x+h/2,y+h*k2/2);
 k4:=f(x+h,y+h*k3);
 fRK:=y+h*(k1+2*k2+2*k3+k4)/6;  {формула метода}
end;

 

      {======= Основная программа }
begin
 TextBackGround(Blue); TextColor(Yellow); ClrScr;
a:=0;b:=1;    { Читаем с клавиатуры граныцы отрезка  }
{Writeln( 'Введите края отрезка  a,b  (предполагается 0, 1)' ); readln( a,b );}

if (a<b) then     {проверяем корректность ввода}

   begin                        {если ввод корректен}
                     { Читаем строку с клавиатуры в переменную name }
     {Write( 'Ввведите имя файла для таблицы значений  -> ' );
     readln( name ); }
     name:= 'q.txt';
     assign(f1, name  );   { Назначаем имя файла файловой переменной }
     reWrite(f1);                 { Открываем файл на запись }

clrscr;                   {шапка}
Writeln ('Задание 2.');
Writeln ('исполнитель: Иванов И. гр.А1');
Writeln('');
Writeln( 'Решение задачи Коши методами: Ейлера, Рунге-Кутты' );
Writeln( '     y=y+2x/y  ,  y(0)=',y0  ,',  xe[0,1]' );Writeln();
Writeln( '   x','y(Eйлер)':15,'y(Рунге-Кутты)':17 );
Writeln( '-----------------------------------------------------');
Writeln(f1, '   x','y(Eйлер)':15,'y(Рунге-Кутты)':17 );
Writeln(f1, '-----------------------------------------------------');
    x:=a;            {начинаем от левой границы}
    dyE:=0;   dyRK:=0; {установим для начала нулевые погрешности методов}                  

                          {если это левая граница, то значение совпадает}
                        {с начальным условием иначе вычисляем}

        
    while x<=b do    {цикл: пока не достигнем правой границы}
        begin
        if x=a then
          begin yE1:=y0;       {по методу Ейлера}
                yRK1:=y0;   {по методу Рунге-Кутта}
          end
         else  begin               { двигаемся на шаг вправо}
                  yE0:=yE1 ;     {по методу Ейлера}
                  yRK0:=yRK1 ;  {по методу Рунге-Кутта}

                  yE1:=fE(x-h,yE0,h);      {по методу Ейлера}
                  yRK1:=fRK(x-h,yRK0,h);  {по методу Рунге-Кутта}
               end;
                 {выводим в файл значениея аргумента}
                 {точное значение, значение по методу Ейлера, Рунге-Кутта}
         writeln(f1,x:5:1,yE1:15:7,yRK1:15:7);;
        //writeln(f1);
                 {и для контроля выводим на экран}
        writeln(x:5:1,yE1:15:7,yRK1:15:7);
                   {вычисляем максимальные погрешности методов}
        if x>a then
          begin
           if dyE<abs(yE1-yE0) then dyE:=abs(yE1-yE0);
           if dyRK<abs(yRK1-yRK0) then dyRK:=abs(yRK1-yRK0);
          end;
     x:=x+h;
     end;
     
     

  close( f1 ); {close( f2 );}    { Закрыть файл }
  Writeln;                       { Пропустить строку }
  Writeln( 'Погрешность метода Ейлера        dE=',dyE:10:10 );
  Writeln( 'Погрешность метода Рунге-Кутты  dRK=',dyRK:10:10 );
  Writeln( 'Файл результатов ', name, '   записан.' );
  end
else
  Writeln( 'Некорректный ввод' );
  Writeln;
end.

                                                                                                                                  вверх

4. Методы численного интегрирования.

Program Integral;
uses crt;
const m=10;
var a,b,eps:real;
    i,n: integer;
    s1,s2:real;
    s3,s4:real;
 {Сама функция}
Function F(x:real): real;
begin
 F := exp(x)/sqrt(1+x*x+0.3*x) ;
End ;

            {--------------------------}
function Rect(a,b:real;n:integer;m:real) :real ;
var h,s:real;
i:integer;

begin
h:=  (b - a) / n;
S:= 0;
For i := 1 To n - 1  do
S := S + F(a+ h * (i-1+m));
Rect :=  S*h;
end;
            {--------------------------}

           {--------------------------}
function Trap(a,b:real;n:integer) :real ;
var h,s:real;
i:integer;
begin
h := (b - a) / n;
s := 0;

For i := 1 To n - 1 do
s := s + F(a+i*h);

Trap := h * (F(a) + F(b) + 2 * s) / 2;
end;

           {--------------------------}
function Simpson(a,b:real;n:integer) :real ;
var h,s1,s2,s:real;
i:integer;

begin
h:=  (b - a) / n;
s1 := 0;              {вычисление первой суммы (см. формулу)}
For i := 1 To n - 1 do
  s1 := s1 + F(h * i + a);

s2 := 0;            {Вычисление второй суммы (см. формулу).}
For i:= 1 To n  do
  s2 := s2 + F(h * i - 0.5 * h + a);
                     {Итоговая формула }
s := h / 3 * (0.5 * F(a) + s1 + 2 * s2 + 0.5 * F(b));

Simpson:= s  ;
end;
           {--------------------------}
           


begin
 TextBackGround(Blue); TextColor(Yellow); ClrScr;
   a:=2;b:=4;
    for i:=1 to m do
        begin
        n:=10*i;
        writeln('n=',n);

        s1:=Rect(a,b,n,0);s2:=Rect(a,b,2*n,0) ;
        writeln('м. прямоугольников (левые)    I=',s2:10:8,'   eps=', abs(s2-s1):10:8 );
        s1:=Rect(a,b,n,0.5);s2:=Rect(a,b,2*n,0.5) ;
        writeln('м. прямоугольников (средние)  I=',s2:10:8,'   eps=', abs(s2-s1):10:8 );
        s1:=Rect(a,b,n,1);s2:=Rect(a,b,2*n,1) ;
        writeln('м. прямоугольников (правые)   I=',s2:10:8,'   eps=', abs(s2-s1):10:8 );
        s1:=Trap(a,b,n);s2:=Trap(a,b,2*n) ;
        writeln('метод трапеций                I=',s2:10:8,'   eps=', abs(s2-s1):10:8 );
        s1:=Simpson(a,b,n);s2:=Simpson(a,b,2*n);
        writeln('метод Симпсона                I=',s2:10:8,'   eps=', abs(s2-s1):10:8 );
 if i<m then writeln('Enter');
        readln;
        end;
        
readln;
end.

                                                                                                                           вверх

 

Категория: Pascal | Добавил: gawtol | Теги: Паскаль, Исходник
Просмотров: 825 | Загрузок: 0 | Рейтинг: 0.0/0