主题:用三角形的三遍求面积的程序代码是什么啊
yin223
[专家分:0] 发布于 2010-09-24 11:37:00
各位大哥大姐
帮帮小妹吧
老师留的作业
我改了好多遍还是有两个错误3个警告
题目是这样的:
三角形的三遍a,b,c的长度输入后可求出三角形的面积
公式是: area=√s(s-a)(s-b)(s-c)
请各位大哥大姐帮帮忙吧
回复列表 (共21个回复)
11 楼
yeg001 [专家分:14390] 发布于 2010-09-25 12:06:00
在stzhurj兄的基础上简单修改了一下
program main
implicit none
real a,b,c,s
DO
write(*,*) 'please input the values of a,b,c'
read(*,*) a,b,c
if((a+b>c) .and. (a+c>b) .and. (b+c>a)) exit
write(*,*) 'It is not a triangle.'
END DO
s=0.5*(a+b+c)
write(*,*) sqrt(s*(s-a)*(s-b)*(s-c))
end program main
作业贴不是很受欢迎, 伸手要了代码, 作业就不用做了. 那还能学到东西么?
还是踏踏实实看看书, 问问老师比较实在.
[color=FF0000]发帖的时候没看到stzhurj兄已经回帖了[/color]
12 楼
asymptotic [专家分:16630] 发布于 2010-09-25 12:56:00
三角形的面积 -- Helen 公式,数值编程,说难不难,说易也不容易。难点在于误差分析,以上程序,当三角形很狭长是,如何? 比如 a + b 近似等于 c,如何误差分析?
抛准引玉,相对误差计算如下:
! this module is dedicated to get machine independent data type
Module TypeKind
implicit none
integer(kind = kind(1)), parameter:: IP = kind(1) ! integer
integer(kind = IP), parameter:: LP = kind(.true.) ! logical
integer(kind = IP), parameter:: SP = kind(1.0) ! single precision
integer(kind = IP), parameter:: DP = kind(1.0D0) ! double precision
End Module
program main
use:: TypeKind
use:: Triangle_Area
implicit none
real(kind = SP):: sa, sb, sc, sArea
real(kind = DP):: da, db, dc, dArea
real(kind = DP):: ErrRel ! Relative Error
sa = 9.0_SP; sb = 4.53_SP; sc = sb;
call TriangleArea(sa, sb, sc, sArea)
da = 9.0_DP; db = 4.53_DP; dc = db;
call TriangleArea(da, db, dc, dArea)
! Relative Error
ErrRel = abs(1.0_DP - real(sArea, DP) / dArea)
write(unit = *, fmt = "(D24.16)") ErrRel
ErrRel = abs(dArea - real(sArea, DP)) / dArea
write(unit = *, fmt = "(D24.16)") ErrRel
stop
end program
Module Triangle_Area
interface TriangleArea
module procedure Single_TriangleArea
module procedure Double_TriangleArea
end interface
contains
subroutine Single_TriangleArea(a, b, c, Area)
use TypeKind, WP => SP
implicit none
real(kind = WP), intent(in):: a, b, c
real(kind = WP), intent(out):: Area
real(kind = WP):: s
s = 0.5_WP * (a + b + c)
Area = sqrt(s * (s - a) * (s - b) * (s - c))
return
end subroutine
subroutine Double_TriangleArea(a, b, c, Area)
use TypeKind, WP => DP
implicit none
real(kind = WP), intent(in):: a, b, c
real(kind = WP), intent(out):: Area
real(kind = WP):: s
s = 0.5_WP * (a + b + c)
Area = sqrt(s * (s - a) * (s - b) * (s - c))
return
end subroutine
End Module
作为菜鸟,误差分析可以暂时不管;但若是要上一定层次,误差分析必不可少。
13 楼
asymptotic [专家分:16630] 发布于 2010-09-25 12:57:00
如上只是简单的计算了 相对误差,但如何解决这个问题,如何进行误差分析,请参考一些数值计算的基础文献。
14 楼
大智若愚 [专家分:90] 发布于 2010-09-25 13:06:00
呵呵,看到好多大侠的回帖,也谈了goto。个人感觉goto还是挺好用的,有时候用goto可以省却一些判断语句,可以少写代码^_^。只要goto语句别太多就行了。
其实楼主应该把代码放出来,让大家看看你的问题究竟在哪里,找出自己的错误,可以提高自己的编程水平。
在这里替楼主鸣谢一下jstzhurj、cgl_lgs、yeg001、asymptotic几位大侠(排名不分先后^_^)!
15 楼
jstzhurj [专家分:4680] 发布于 2010-09-25 13:28:00
既然以高精度的计算结果作为一个评判标准,直接以高精度计算就行了。考虑越多,程序看上去越庞大,还是程序简单一点为好,尤其是菜鸟对付老师布置的作业。
16 楼
asymptotic [专家分:16630] 发布于 2010-09-25 15:36:00
jstzhurj 网友理解有偏差: 并非 kind 大小问题,而是算法的精度问题,就算 kind = 4 的单精度,其有效数字应该有 6 到 7 位,因此,我们求解三角形面积得到的答案,精度应该至少有 6 位,但目前简单的程序无法达到,所以作为一个 “完整”的 答案,必须考虑 a 略大于 b + c 的情形。
至于用 kind = 8,则要求至少 14 位精度。 所以,并非 kind 的问题。
17 楼
jstzhurj [专家分:4680] 发布于 2010-09-25 15:50:00
[quote]jstzhurj 网友理解有偏差: 并非 kind 大小问题,而是算法的精度问题,就算 kind = 4 的单精度,其有效数字应该有 6 到 7 位,因此,我们求解三角形面积得到的答案,精度应该至少有 6 位,但目前简单的程序无法达到,所以作为一个 “完整”的 答案,必须考虑 a 略大于 b + c 的情形。
至于用 kind = 8,则要求至少 14 位精度。 所以,并非 kind 的问题。[/quote]
不是精度问题是什么问题?你计算相对误差不是用一个相误差小的的值来估算相对误差大的值么?
话说回来,你就是用四倍精度,得到的值还是一个近似值。
18 楼
asymptotic [专家分:16630] 发布于 2010-09-25 16:21:00
Kahan W. 在 1986 年就 这种 Flat triangle (a 略大于 b + c) 专门写了一个手稿,在 What Every Computer Scientist Should Know About Floating-Point Arithmetic 中有引用,愿意看的可以看看。
还是那句话,想真正 数值编程 的网友,这篇文献应该看,在编程的时候,应该想想您所用算法能得到的精度,也许不是每个问题都能得到答案,但天长日久,对您在数值编程方面还是有帮助的。
19 楼
jstzhurj [专家分:4680] 发布于 2010-09-25 16:37:00
明白了你的良苦用心,赞一个!
-------- __@ __@ __@ __@ __~@
----- _`\<,_ _`\<,_ _`\<,_ _`\<,_ _`\<,_
---- (*)/ (*) (*)/ (*) (*)/ (*) (*)/ (*) (*)/ (*)
20 楼
BiCGSTAB [专家分:780] 发布于 2010-09-25 17:07:00
[quote]Kahan W. 在 1986 年就 这种 Flat triangle (a 略大于 b + c) 专门写了一个手稿,在 What Every Computer Scientist Should Know About Floating-Point Arithmetic 中有引用,愿意看的可以看看。
还是那句话,想真正 数值编程 的网友,这篇文献应该看,在编程的时候,应该想想您所用算法能得到的精度,也许不是每个问题都能得到答案,但天长日久,对您在数值编程方面还是有帮助的。[/quote]
a,b,c分别增大10^n倍,算完面积减小10^(2n)倍,不就可以降低数值误差了吗?
您那个文献有什么高招,能否给个摘要。
我来回复