Написание программы, вычисляющей функцию sec(x+y) (Лабораторная работа № 2), страница 2

        j1=j

        p1=0

        if (j.lt.b2) then

            write (2,500) i       

        end if       

        end if

        end do

        write(2,*)

        sh1=c1

112     call sravn(i-sh1,i,k1,0.0001)       

        if (k1.eq.1) then  

        sh1=sh1+c1

        goto 112

        end if      

        i=i+sh1

        call sravn(abs(i-sh1),abs(i+sh1),k1,0.001)             

        if ((k1.eq.1).and.((i-sh1).lt.0).and.((i+sh1).gt.0)) i=0

        if ((i-c1.lt.b1).and.(i.gt.b1)) i=b1

      if ((a2.ne.j1).and.(i.le.b1)) call fs(a2,b2,c2,i,0)         

        end do

        !-------------------format--------------

510     format ('|',('n/a'),7(' ')\)

500     format ('|',e10.4\)

501     format ('|',('y/x'),7(' ')\)  

        !-----Zakritie failov 1,2   

        close(1,err=3)

        close(2,err=3)

        return

        !-----Oshibka otkritiya

1       print *,'Error OPEN'

        Return

        !-----Oshibka chteniya

2       print *,'Error READ'

        Return

        !-----Oshibka zakritiya

3       print *,'Error CLOSE'

        return

        end

        !----------Glavnaya podprogramma----------

        program laba2

        implicit none

        print *, 'Hello!'

        call vvod

        print *, 'Ok!'

        pause

        end
4.Тесты

A1,B1,C1,A2,B2,C2

Результат

Примечание

1

60 120 50 0 1 2

|y/x               |0.0000E+00|0.1000E+01

-----------------------------------------------

|0.6000E+02|0.2000E+01|0.2063E+01

|0.1100E+03|-.2924E+01|-.2790E+01

|0.1200E+03|-.2000E+01|-.1942E+01

Независимо от того, делит шаг диапазон изменения нацело или нет, последним значением аргумента является

заданный максимум

2

60 120 10 0 10 2

|y/x                |0.0000E+00|0.2000E+01|0.4000E+01|0.6000E+01|0.8000E+01|0.1000E+02

------------------------------------------------------------------------------------------------------------

|0.6000E+02|0.2000E+01|0.2130E+01|0.2281E+01|0.2459E+01|0.2669E+01|0.2924E+01

|0.7000E+02|0.2924E+01|0.3236E+01|0.3628E+01|0.4134E+01|0.4810E+01|0.5759E+01

|0.8000E+02|0.5759E+01|0.7185E+01|0.9567E+01|0.1434E+02|0.2865E+02|n/0      

|0.9000E+02|n/0                |-.2865E+02|-.1434E+02|-.9567E+01|-.7185E+01|-.5759E+01

В данном тесте представлен фрагмент результата.

Возникает ситуация, когда cos(x+y)=0

И на 0 делить нельзя.

Данная ситуация обозначается как “n/0”

3

130 120 10 0 10 2

’Parametres error’

Входные данные не удовлетворяют условиям:

A1>=B1 и C1<0 или B1>=A1 и C1>0

A2>=B2 и C2<0 или B2>=A2 и C2>0         

4

130 120 0 0 10 2

’Parametres error period’

Шаг изменения аргумента равен 0

5

130

Error read

Ошибка чтения


6. Исследование

Исследования 3, 4. Невидимый шаг

        subroutine sravn(x,x_,res,pogr)

        implicit none

        real x,x_,pogr

        integer res       

        x=abs(abs(x-x_)/x)               

        if (x.lt.pogr) then

        res=1

        else

        res=0       

        end if

        end

---------------------------------------------

111     call sravn(j-sh2,j,k1,0.0001)       

        if (k1.eq.1) then       

        sh2=sh2+c2

        goto 111

        end if

Если возникает невидимый шаг, то шаг наращивается, до тех пор, пока не станет видимым.

Исследования 6, 7. Ноль аргумента

         call sravn(abs(i-sh2),abs(i+sh2),k1,0.001)       

         if ((k1.eq.1).and.((i-sh2).lt.0).and.((i+sh2).gt.0)) i=0

Если модули двух чисел находящихся по обе стороны от  нуля не отличаются до погрешности, то значение, находящееся между ними, становится 0.    

Добавлено разрезание таблицы содержащей большое количество столбцов.

Пример:

|y/x       |0.8900E+02|0.8901E+02|0.8902E+02|0.8903E+02|0.8904E+02|0.8905E+02|0.8906E+02

|0.0000E+00|0.5730E+02|0.5788E+02|0.5847E+02|0.5907E+02|0.5969E+02|0.6031E+02|0.6096E+02

|y/x       |0.8907E+02|0.8908E+02|0.8909E+02|0.8910E+02|0.8911E+02|0.8912E+02|0.8913E+02

|0.0000E+00|0.6161E+02|0.6228E+02|0.6297E+02|0.6367E+02|0.6438E+02|0.6511E+02|0.6586E+02

|y/x       |0.8914E+02|0.8915E+02|0.8916E+02|0.8917E+02|0.8918E+02|0.8919E+02|0.8920E+02

|0.0000E+00|0.6663E+02|0.6741E+02|0.6821E+02|0.6904E+02|0.6988E+02|0.7074E+02|0.7163E+02

……………………………………………………………………………………………………………………………………………………………………………………………………………………