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 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.