Изучение операторов ввода-вывода и форматирования текста языка Фортран (Лабораторная работа № 2), страница 2

      ym=(ymax-ymin)

      if(mod(ym+EPS,dy).le.abs(EPS/(dy-EPS)))then  !если область делится шагом нацело

      my=(ym+dy/2)/dy+1

      else

      my=(ym+dy/2)/dy+2

      end if

      else

      my=1 

      end if

      end 

      !подпрограмма заполнения таблицы, формальный параметр n- номер файла для записи

       subroutine tab(n)

      common /f/ xmin,xmax,dx,ymin,ymax,dy

      common /raz/ nx,my,EPS

      parameter(pi=3.1415927)

      dimension x(500)

7     format(1x,'indefened',1x,'|'\)

8     format(E11.4,'|'\)

9     format(1x,'indefened',1x,'|')

10    format(E11.4,'|')

60    FORMAT(4x,'y\x',4x,'|'\)

11     format(4x,'0/0',4x,'|'\)

12     format(4x,'0/0',4x,'|')

      call razmer

      do i=1,nx-1,1         !цикл вычисления всех значений аргумента кроме последнего

      x(i)=xmin+(i-1)*dx

      if(-1*EPS*dx.lt.x(i).and.x(i).lt.EPS*dx)then

      x(i)=0

      else

      if(abs(x(i-1)/x(i)).gt.100.0)then

      x(i)=0              !если х равен 0 в рамках погрешности, то положим его равным 0

      else

      if(abs(90-x(i))/x(i).gt.1E4)

     *x(i)=90               !если х равен 90 в рамках погрешности, то положим его равным 90

      end if

      end if

      end do

      x(nx)=xmax                 !вычисление поседнего х

      ig=nx/9                    !вычисление количества пеносов таблицы

      if(mod(nx,9).ne.0)ig=ig+1

      do ik=1,ig,1                  !цикл по подтаблицам

      write(n,60)

      k=ik*9

      if(((ig-ik).eq.0).and.(mod(nx,9).ne.0))k=nx

      if (nx.gt.1) write(n,8)(x(l),l=(ik-1)*9+1,k-1,1)        !запись заголовка в файл

      write(n,'(E11.4)')x(k)          

      write(n,*)('-',l=1,12*(1+k-(ik-1)*9),1)

      do j=1,my,1

      y=ymin+(j-1)*dy       !вычисляем значение аргументов y по аналогии с х

      if(-1*EPS*dy.lt.y.and.y.lt.EPS*dy)then

      y=0

      else

      if(abs((ymin+(j-2)*dy)/y).gt.100.0)y=0 

      end if

      if (j.eq.my)y=ymax

      write(n,8)y

        do i=(ik-1)*9+1,k,1     !для каждого y вычисляем значение функции и заполняем подтаблицу

            ic=0

            if((abs(mod(x(i),90.0)).lt.EPS/90.0).and.           !если косинус равен 0

     *(abs(mod(x(i),180.0)).gt.EPS/180.0))ic=1

            if(i.ne.k)then

                if(abs(mod(y,180.0)).lt.EPS/180.0)then      !если синус равен 0

                if(ic.eq.1)then

                write(n,11)                          !если ситуация 0/0

                else

                write(n,7)

                end if

                else

      if(ic.eq.1)then

              write(n,8)0.0

                else

                write(n,8)(cos(x(i)*pi/180)/sin(y*pi/180))

                end if

                end if

            else

                if(abs(mod(y,180.0)).lt.EPS/180.0)then

                if(ic.eq.1)then

                write(n,12)

                else

                write(n,9)

                end if

                else

      if(ic.eq.1)then

                write(n,10)0.0

                else

                write(n,10)(cos(x(i)*pi/180)/sin(y*pi/180))

                end if

                end if

            end if

         end do

      write(n,*)('-',i=1,12*(1+k-(ik-1)*9),1)

      end do

      write(n,*)

      end do

      pause

      end

    !главная программа   

      program main

      common /f/ xmin,xmax,dx,ymin,ymax,dy

      open (10,File='H:\fortran\in.txt',status='old')   !открытие файла для чтения

      call vvod(10)                                     !считывание исходных данных

      close(10) 

      open (20,File='H:\fortran\out.txt',status='old')   !открытие файла для записи

      i=20

      call proverka(i)                              !вызов проверки

      print *,'The end'

      pause

      if(i.ne.1)then                !остановка программы при наличии ошибок

      stop

      else

      call tab(20)

      close(20)

      end if

      end

V.Набортестов

Входныеданные:

Minx, maxx, шагх, Miny, maxy, шагy

Результат

Назначение

5 10 -1 90 90 0

Ошибка

Количество m и n верное

Отрицательный шаг

На коррект-ность данных

1 5 9 0 0 0

Шаг>max-min

10 5 1 90 90 0

Max<min

89 90.01 1e-4 89 90 0.5

Невидимый шаг

3 7 4 90 90 5

Ymin=ymax, но шагy≠0

6.5 9.07 0.5 90 90 0

Шагх не делит интервал нацело

89 92 0.25 -1 2 0.25

неопределенность

0/0

30 30 0 -1e-5 1e-5 1e-5

неопределенность

f(x,y)=∞

-50 50 10 67 112 11.5

Одно из значений f=0.1000E+01

f(x,y)=1

89 92 0.25 60 60 0

Одно из значений f=0.0000E+00

f(x,y)=0

0 0 0 90 90 0

f=0.1000E+01

f(x,y)=1

VI.Протокол тестирования

Входные данные:

Minx, maxx, шагх, Miny, maxy, шагy

Результат

Назначение

89 90.01 0.01 -5e-7 1e-7 1e-7

Все аргументы присутствуют, есть сообщение 0/0

Исследовании функции при маленьким шаге и значениях (большой погрешности) на 0, бесконечность, неопределенность 0/0

0 0 0 -1.009e-7 1.001e-7 1e-11

Неверный шаг

На корректность данных

0 0 0 -99e-7 1e-7 1e-7

Все аргументы присутствуют, есть сообщение indefened

Исследовании функции при маленьким шаге и значениях (большой погрешности) на бесконечность

30 30 0 -99e-7 1e-7 1e-7

89 90.01 0.001 90 90 0.00

Неверный шаг

На корректность данных

89 90.01 0.01 90 90 0.00

Все аргументы присутствуют, функция принимает значение 0 при х=90

Исследовании функции при маленьким шаге (большой погрешности) на 0