Министерство Образования Российской Федерации
Новосибирский Государственный Технический Университет
Кафедра прикладной информатики
Лабораторная работа №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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.