Помощь в решении задач по информатике и другим предметам www.diplomant-spb.ru
Фортран. Задачи.
Задача 1
Дана программа
real x(100) ,y(100) ,h,a,b
write (*/*)' Введите значения a,b,h'
read(*,*) a,b,h
n=(b-a)/h+l
x(1)=a
do i=2 , n
x(i)=x(i-l)+h
enddo
do i=l,n
if (x(i) .It. (-1.)) y(i) = (x(i)+l)**4
if (x(i) .ge. (-1. ) .and.x(i) . lt.1. ) y(i)=l+cos (3.14*(x(i)**2))
if (x(i) .ge. (1.)) у (i)=(- (x(i)-l) **2. )
enddo
do i=l,n
write(*,*) i,x(i),y(i)
enddo
end
Промежуток расчета: от -1,5 до 1,5 Шаг расчета: 0,25
Задание: изменить текст программы так, чтобы не использовался логические блоки (т.е. использовался только оператор цикла).
Решение
При известном промежутке расчета и шаге изменения переменной
х можно разбить цикл в исходной программе на три цикла, соответствующие трём веткам вычисления. Поскольку промежуток и шаг расчета заданы явно, можно обойтись без ввода этих величин.
real x(100) ,y(100) ,h,a,b
a=-1.5
b=1.5
h=0.25
n=(b-a)/h+l
x(1)=a
do i=2 , n
x(i)=x(i-l)+h
enddo
n1=(-1-a)/h
do i=l,n1
y(i) = (x(i)+l)**4
enddo
n2=(1-(-1))/h
do i=nl+1,n2
y(i)=l+cos (3.14*(x(i)**2))
enddo
n3=(b-1)/h+1
do i=n2+1,n3
у (i)=(- (x(i)-l) **2. )
enddo
do i=l,n
write(*,*) i,x(i),y(i)
enddo
end
схема алгоритма
Задача 3
Дана программа
real x,n,eps,summa,k
write(*,*) 'Введите значение х'
read(*,*) x
if (abs(x).ge.1) then
write(*,*) 'error'
goto 20
else
write(*,*) 'Введите значение eps1
read(*,*) eps
n=l
k=x
summa=(l+x)**(0.5)
10 k={(-1)**(n-1))*(x**n)*((2*n-3)/(2*n))
sumna=summa+k
n=n+l
if(abs(k).gt.eps) goto 10
write(*,*) summa
endif
20 end
Программа должна вычислять функцию
Задание: найти ошибки
Решение
-
Начальное значение переменной summa устанавливается сразу в искомое значение заданной функции
-
При вычислении общего члена ряда вместо факториала вычисляется лишь последний множитель.
Исправленный текст приведен ниже
real x,n,eps,summa,k
write(*,*) 'Введите значение х'
read(*,*) x
if (abs(x).ge.1) then
write(*,*) 'error'
goto 20
else
write(*,*) 'Введите значение eps1
read(*,*) eps
n=2
k=x/2.
summa=1+x/2.
10 k=k*(-1)*x*((2*n-3)/(2*n))
sumna=summa+k
n=n+l
if(abs(k).gt.eps) goto 10
write(*,*) summa
endif
20 end
схема алгоритма
Задача 4
Дана программа
real x, summa
write(*,*) 'Введите значение х'
read(*,*) x
if (abs(x).ge.1) then
write(*,*) 'error'
goto 20
else
write(*,*) 'Введите значение eps1
summa=sum(x)
write(*,*) summa
endif
20 end
real function sum(m)
real n,k,m,eps
read(*,*) eps
n=l
k=l
sum=l
10 k=((-1)**(n-1))*(m**n)*((2*n-3)/(2*n))
sum=sum-k
n=n+l
if(abs(k).gt.eps) goto 10
return
end
Программа должна вычислять функцию
Задание: найти ошибки
Решение
-
Главная программа написана правильно, хотя решение разместить приглашение к вводу eps в главной программе, а сам ввод – в функции несколько экстравагантно.
-
В функции осталась ошибка из задачи 3 – неправильное вычисление общего члена ряда
Исправленный текст приведен ниже
real function sum(m)
real n,k,m,eps
read(*,*) eps
n=2
k=m/2.
sum=1+m/2.
10 k=k*(-1)*x*((2*n-3)/(2*n))
sum=sum+k
n=n+l
if(abs(k).gt.eps) goto 10
return
end
схема алгоритма
Задача 5
Заданы векторы A(a
b a
2,...,
aw) и В(в
10, В
9,...,
b1). Задание: составить подпрограмму, задающую матрицу C вида
Решение
В описании задачи вектор b расположен в обратном порядке, на что следует обратить внимание.
Воспользуемся представлением двумерного массива как одномерного.
subroutine zzz(n,a,b,c)
integer n
real a(*),b(*),c(*)
integer k,l
do k=1,n
do l=1,n
c((l-1)*n+k)=a(k)*b(n-l+1)
enddo
enddo
схема алгоритма