回 帖 发 新 帖 刷新版面

主题:用三角形的三遍求面积的程序代码是什么啊

各位大哥大姐
帮帮小妹吧
老师留的作业
我改了好多遍还是有两个错误3个警告


题目是这样的:

三角形的三遍a,b,c的长度输入后可求出三角形的面积
公式是: area=√s(s-a)(s-b)(s-c)
请各位大哥大姐帮帮忙吧

回复列表 (共21个回复)

11 楼

在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 楼

三角形的面积 -- 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 楼

如上只是简单的计算了 相对误差,但如何解决这个问题,如何进行误差分析,请参考一些数值计算的基础文献。

14 楼

呵呵,看到好多大侠的回帖,也谈了goto。个人感觉goto还是挺好用的,有时候用goto可以省却一些判断语句,可以少写代码^_^。只要goto语句别太多就行了。
其实楼主应该把代码放出来,让大家看看你的问题究竟在哪里,找出自己的错误,可以提高自己的编程水平。
在这里替楼主鸣谢一下jstzhurj、cgl_lgs、yeg001、asymptotic几位大侠(排名不分先后^_^)!

15 楼

既然以高精度的计算结果作为一个评判标准,直接以高精度计算就行了。考虑越多,程序看上去越庞大,还是程序简单一点为好,尤其是菜鸟对付老师布置的作业。

16 楼

jstzhurj 网友理解有偏差: 并非 kind 大小问题,而是算法的精度问题,就算 kind = 4 的单精度,其有效数字应该有 6 到 7 位,因此,我们求解三角形面积得到的答案,精度应该至少有 6 位,但目前简单的程序无法达到,所以作为一个 “完整”的 答案,必须考虑 a 略大于 b + c 的情形。
至于用 kind = 8,则要求至少 14 位精度。 所以,并非 kind  的问题。

17 楼

[quote]jstzhurj 网友理解有偏差: 并非 kind 大小问题,而是算法的精度问题,就算 kind = 4 的单精度,其有效数字应该有 6 到 7 位,因此,我们求解三角形面积得到的答案,精度应该至少有 6 位,但目前简单的程序无法达到,所以作为一个 “完整”的 答案,必须考虑 a 略大于 b + c 的情形。
至于用 kind = 8,则要求至少 14 位精度。 所以,并非 kind  的问题。[/quote]

不是精度问题是什么问题?你计算相对误差不是用一个相误差小的的值来估算相对误差大的值么?

话说回来,你就是用四倍精度,得到的值还是一个近似值。

18 楼

Kahan W. 在 1986 年就 这种 Flat  triangle (a 略大于 b + c) 专门写了一个手稿,在 What Every Computer Scientist Should Know About Floating-Point Arithmetic 中有引用,愿意看的可以看看。

还是那句话,想真正 数值编程 的网友,这篇文献应该看,在编程的时候,应该想想您所用算法能得到的精度,也许不是每个问题都能得到答案,但天长日久,对您在数值编程方面还是有帮助的。

19 楼


明白了你的良苦用心,赞一个!
 -------- __@      __@       __@       __@      __~@
 ----- _`\<,_    _`\<,_    _`\<,_     _`\<,_    _`\<,_
 ---- (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)

20 楼

[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)倍,不就可以降低数值误差了吗?
您那个文献有什么高招,能否给个摘要。

我来回复

您尚未登录,请登录后再回复。点此登录或注册