Министерство образования и науки РФ
Кафедра ПМ
Лабораторная работа №1
по дисциплине
программирование вычислений
вариант №6
Преподаватель: Токарева М.Г.
Факультет: ФПМИ
Группа: ПМ-62
Студентка: Коротенко Д.Ю.
Новосибирск 2008г.
I.Условие задачи
Данные для исследований:
1 исследование 2 исследование
II. Используемые формулы
Если 3 точки лежат на одной прямой, то S=0
S= =|(y1-y3)*(x1-x2)+(x1-x3)*(y2-y1)|/2 формула для вычисления
площади треугольника
Наименьший угол лежит напротив наименьшей стороны, т.о. для поиска наименьшего угла сравниваем длины сторон a, b и d
|a|=sqrt((x1-x3)**2+(y1-y3)**2) – длина стороны а
Если b и d образуют наименьший угол а, то его косинус вычисляется через скалярное произведение векторов b и d:
cosa=((x1-x2)*(x3-x2)+(y1-y2)*(y3-y2))/(||b||*||d||)
Угол а вычисляется по своему косинусу:
a=acos(cosa)
III. Структура программы
subroutineproverka (i) // процедура проверки исходных данных на корректность с учетом переполнения и нарушений порядка
входные данные и результаты: пременная i целого типа является результатом проверки коректности данных ( принимает значения 0,1,2 и 3 – означают причину некорректности данных)
subroutinevvod (j) // процедура ввода исходных данных
входные данные и результаты: пременная j целого типа отвечает за корректность данных и наличие хотя бы 1 вызова подпрограммы ( принимает значения 1 и 2)
subroutinesquare () // процедура вычисления площади треугольника
subroutineugol(x1,y1,x2,y2,x3,y3,c,d)// вспомогательная процедура вычисления косинуса угла
входные данные и результаты: вещественные переменные x1, x2, x3, y1, y2, y3 являются координатами вершин треугольника и передаются в порядке, в котором образуют угол; вещественные переменныеc,d– это нормы сторон, образующих угол
subroutinecos// основная процедура вычисления косинуса угла:сравнением длин сторон треугольника
subroutineminugol// процедура вычисления наименьшего угла
Взаимодействие подпрограмм
program main
subroutine vvod (j) subroutine minugol
subroutine proverka (i)
subroutine cos
subroutine square () subroutine ugol(x1,y1,x2,y2,x3,y3,c,d)
IV. Текстпрограммы
c------------------------------------------------------------------------------------------------------------------------------------
c процедура вычисления площади треугольника
c------------------------------------------------------------------------------------------------------------------------------------
subroutine square ()
common /tre/x1,x2,x3,y1,y2,y3
common /rez/s,a,cosa
s=(y1-y3)*(x1-x2)+(x1-x3)*(y2-y1)
s=abs(s)/2
end
c------------------------------------------------------------------------------------------------------------------------------------
c процедура проверки исходных данных на корректность
c (можно ли построить по 3 заданным точкам треугольник с учетом
с нарушений порядка и переполнения)
c флаг i показывает результат
c------------------------------------------------------------------------------------------------------------------------------------
subroutine proverka (i)
common /tre/x1,x2,x3,y1,y2,y3
common /rez/s,a,cosa
call square() !Если площадь равна 0, то либо данный некорректны,
if (s.gt.0)then !либо переполнение в низком порядке
b=(abs(y1-y3)*1E-20)*(abs(x1-x2)*1E-20) !Масштабирование слагаемых в формуле площади
c=(abs(x1-x3)*1E-20)*(abs(y1-y2)*1E-20)
if((b.lt.5E-2).and.(c.lt.5E-2))then !проверка на переполнение в высоком порядке
call cos !проверка на слишком маленький угол, если стороны
if ((cosa.lt.1).and.(cosa.gt.0))then !отличаются более, чем на 3 порядка
i=1
else
i=3
end if
else
i=2
end if
else
i=0
end if
end
c------------------------------------------------------------------------------------------------------------------------------------
c процедура ввода исходных данных,инициализирует переменные косинуса, угла и площади,
c вызывает процедуру проверки исходных данных на корректность. Идентификатор j отвечает
c за корректность данных и наличие хотя бы 1 вызова подпрограммы
c------------------------------------------------------------------------------------------------------------------------------------
subroutine vvod (j)
common /tre/x1,x2,x3,y1,y2,y3
common /rez/s,a,cosa
print *,'enter the koordinates in the following order:x1 y1-x3 y3'
read *, x1,y1,x2,y2,x3,y3
call proverka(i)
print *, x1,y1,x2,y2,x3,y3
if(i.eq.1) then
a=0
j=2
else
j=1
if(i.eq.2) then
print *,'The data are too extensive'
else
if(i.eq.3)then
print *,'The corner is too small'
else
print *,'The data uncorrected or too small'
end if
end if
end if
end
c------------------------------------------------------------------------------------------------------------------------------------
c вспомогательная процедура вычисления косинуса угла через скалярное произведение
c входные параметры:координаты вершин, заданные в порядке, образующем угол, и
c нормы векторов, образующих угол
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.