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

Страницы работы

6 страниц (Word-файл)

Содержание работы

Министерство Образования Российской Федерации

Новосибирский Государственный Технический Университет

Кафедра прикладной информатики

Лабораторная работа №2

По дисциплине: Программирование вычислений

Факультет ПМИ

Группа ПМ-64

Студент: Штанько А.Б.

Преподаватель:  Рояк М.Э.

Новосибирск

2008


1. Условие задачи

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

2. Анализ задачи

Дано:

Диапазон значений y, шаг изменения  y  и диапазон значений x, шаг изменения ( A1, B1, C1, A2, B2, С2)

y€[A1,B1], x€[A2,B2]

Результат: Таблица значений функции ((m+1)*(n+1), m-количество значений y, n- количество значений x,

m+1 строка – значения функции при y=B1

n+1  столбец – значения функции при x=B2

Метод решения:

Заметим, что sec(x+y)=1/cos(x+y)

Проверка входных данных: A1>=B1 и C1<0 или B1>=A1 и C1>0

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

Необходимая проверка: приx+, где k- целое, функция не имеет смысла, так как

сos(x+y)=0, sec(x+y)=1/cos(x+y), а на 0 делить нельзя.

3. Текстпрограммы

        !-------------------sravnenie--------------

        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

        !--------------Pecat' pervoy stroki---------

        subroutine fs(i1,b2,c2,j,t)

        implicit none

        real i,b2,c2,i1,j,sh2

        integer p1,k1,t

        p1=0

        i=i1       

        write(2,*)

        if (i.gt.b2) return

        write(2,501)                       

        do while (i.le.b2)

        write(2,500) i       

        sh2=c2       

113     call sravn(i-sh2,i,k1,0.0001)

        !print *,'113'       

        if (k1.eq.1) then

        sh2=sh2+c2

        goto 113

        end if                  

        i=i+sh2               

        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       

        if ((i-c2.lt.b2).and.(i.gt.b2)) i=b2

        p1=p1+1

        if (p1.eq.6) then

        write(2,*)

        !write(2,500) j

        return

        end if

        end do       

        write(2,*)

        !if (t.eq.0) write (2,500) j        

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

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

        end

        !---------Podprogramma nahogdeniya sec------------

        subroutine sec(a,b,pi)

        implicit none

        real pi, a, b

        b=1/cos(a/180*pi)       

        end

        !---Podprogramma obrabotki dannih i vivoda rezultatov v fail----

        subroutine vvod

        implicit none

        real A1,B1,C1,A2,B2,C2,i,j,pi,md,sh1,sh2,res,j1    

        integer k1,p1

        integer m,n

        sh1=0

        sh2=0

        res=0

        k1=0

        p1=0       

        pi=3.14159265

        !-----Otkritie faila s ishodnimi dannimi

        open(unit=1,FILE='I:/fortran/test/t1.txt', status='OLD',err=1)

        read (1,*,err=2) A1,B1,C1,A2,B2,C2

        if((c1.le.0).or.(c2.le.0))then

        print *,'Parametres error period'

        return

        end if     

        n=(B1-A1)/C1

        m=(B2-A2)/C2

        if((n.lt.1).or.(m.lt.1))then

        print *,'Parametres error'

        return

        end if

        !-----Otkritie faila dlya zapisi rezultatov

        open(2,FILE='I:/fortran/test/r1.txt',status='unknown',err=1)                 

        i=A1

        call fs(a2,b2,c2,a1,1)

        do while(i.le.B1)

        j=A2

        j1=A2  

        write (2,500) i        

        p1=0     

        do while(j.le.B2)

        !-----Proverka deleniya na 0

       md=abs(mod((i+j),90.0))

       if ((md.le.0.001).or.(md.ge.89.999)) then       

        write(2,510)       

        else

          call sec((i+j),res,pi)                   

          write(2,500) res

        end if

        sh2=c2

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

        if (k1.eq.1) then       

        sh2=sh2+c2

        goto 111

        end if

        j=j+sh2

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

        print *, j-sh2, j+sh2       

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

        if ((j-c2.lt.b2).and.(j.gt.b2)) j=b2

        p1=p1+1

        if (p1.eq.6) then

        write(2,*)       

        call fs(j,b2,c2,i,0)

Похожие материалы

Информация о работе