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

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

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

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

Министерство образования и науки РФ

Кафедра ПМ

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

по дисциплине

программирование вычислений

вариант №16

Преподаватель: Токарева М.Г.

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

Группа: ПМ-62

Студентка: Коротенко Д.Ю.

Новосибирск 2008г.

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

II. Используемые формулы

Математическая модель

Функция f(x,y)=Cos(x)/Sin(y) имеет область определения :  Область значений: ; функция имеет особые точки:

при х=90 и у    0,           f=0;

при х=0 и у=90,           f=1

при х=90 и у=0,           f=0/0, функция неопределенна

при х ≠ 90 и у=0,          f= ∞, функция неопределенна

Функции Cos(x) и Sin(y) имеют период, равный 2π

Программная модель

Область определения  и значения функции, представимые в ЭВМ, представляют собой диапазон значений 10-38  ÷  1038

Исходные данные проверяются на корректность:

max<min или шаг=0

    max=min и шаг!=0

max!=min и шаг=0

невидимый шаг x

    max-min<шаг

Так представление чисел в ЭВМ не является точным и в ходе вычислений накапливается погрешность, то чтобы избежать потери точности в особых ситуациях, делаются соответствующие проверки:

1.Для вычисления m и n –количества строк и столбцов в таблице:

      EPS=1.192093E-07   - самое маленькое число, представимое в памяти ЭВМ

      if(mod(xmax-xmin +EPS,dx)<=|(EPS/(dx-EPS)|)then  !если область делится шагом нацело

      n=( xmax-xmin +dx/2)/dx+1

      else

      n=( xmax-xmin +dx/2)/dx+2

      end if

      EPS  и dx/2 прибавляются, чтобы компенсировать машинную погрешность

Остаток от деления mod(xmax-xmin +EPS,dx) сравнивается с 0 с точностью |(EPS/(dx-EPS)|)

2.Для обработки особых значений аргументов          

      if(-1*i*EPS*dx.lt.x(i).and.x(i).lt.EPS*i*dx)then       лежитлихвокрестностинулявдиапазонешага

      x(i)=0

      else

      if(abs(x(i-1)/x(i)).gt.100.0)then                               проверка на 0 при очень маленьком шаге

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

      else

      if(abs(90-x(i))/x(i).gt.1E4)              сравнение через относительную погрешность с точностью не меньше 4 значащих цифр

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

      end if

      end if

3.Для обработки особых значений функции

             ic=0

            if((abs(mod(x(i),90.0)).lt.EPS/90.0).and.(abs(mod(x(i),180.0)).gt.EPS/180.0))ic=1

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

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

если синус равен 0 с учетом периода и погрешности, то функция равна “indefened”, неопределенна

            if(ic.eq.1)then

если ситуация 0/0, то функция равна”0/0”, неопределена

III. Структура программы

subroutineproverka (i) // подпрограмма проверки входных данных, проверяет их на корректность

      входные данные и результаты: формальный параметр i-номер устройства для записи, возращает результат проверки (1-все правильно,2-неверный шаг,0-неверные данные)

subroutinevvod (n) // подпрограмма ввода читает входные данные: xmin, xmax, dx, ymin, ymax, dy из файла

входные данные и результаты: пременная n целого типа  номер устройства для чтения

subroutinerazmer//подпограмма вычисления размеров таблицы, результат nx и my - размеры по x и y  

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

Взаимодействиеподпрограмм

program main


subroutine vvod (n)                                                                      subroutine tab(n)

                                                subroutine proverka (n)

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

      !подпограмма ввода,читает входные данные:xmin,xmax,dx,ymin,ymax,dy из файла

     subroutine vvod(n)

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

      read (n,*)xmin,xmax,dx,ymin,ymax,dy

      end

      !подпограмма прверки входных данных, проверяет их на корректность

      !формальный параметр i-номер устройства для записи, возращает результат проверки

      !(1-все правильно,2-неверный шаг,0-неверные данные)

       subroutine proverka (i)

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

1     format(A)

      if((xmax.lt.xmin).or.(ymax.lt.ymin).or.(dx.lt.0).or.(dy.lt.0))    !max<min || шаг=0

     *then

      write(i,1)'NEKORRECTNIE DANNIE'

       i=0

      else

      if((xmax.eq.xmin).and.(dx.ne.0).or.(ymax.eq.ymin).and.(dy.ne.0))   !max=min && шаг!=0

     *then

      write(i,1)'NEKORRECTNIE DANNIE'

       i=0

       else

       if((xmax.ne.xmin).and.(dx.eq.0).or.(ymax.ne.ymin).and.(dy.eq.0))    !max!=min && шаг=0

     *then

       write(i,1)'NEKORRECTNIE DANNIE'

        i=0

       else

       if(dx.ne.0)then

       if((xmax/dx.gt.1E4).or.((xmax-xmin).lt.dx).or.     !  невидимый шаг x ||max-min<шаг

     *((ymax-ymin).lt.dy))then   

      write(i,1)'NEKORRECTNIY SHAG'

       i=2

       else

       i=1

       end if

       else

       if(dy.ne.0)then

       if(ymax/dy.gt.1E4)then

       write(i,1)'NEKORRECTNIY SHAG'                !невидимый шаг y

       i=2

       else

       i=1

       end if

       else

       i=1

       end if

       end if

       end if

       end if

       end if

       end

       !подпограмма вычисления размеров таблицы, результат nx и my - размеры по x и y    

       subroutine razmer

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

      common /raz/ nx,my,EPS

      EPS=1.192093E-07  

      if(dx.ne.0.0)then

      xn=(xmax-xmin)

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

      nx=(xn+dx/2)/dx+1

      else

      nx=(xn+dx/2)/dx+2

      end if

      else

      nx=1

      end if   

      if(dy.ne.0.0)then

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

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