回 帖 发 新 帖 刷新版面

主题:[讨论]fortran考试题

期末考试题,真心不会 老师给了样题,可是现在连样题都不会编。。。。。。求帮助!!!                                                                                                   统计一个班(最多35个人)的学习成绩,要求如下:(1)输入每个学生的学号和6门课程的成绩,读取记事本文件内成绩(2)计算每个学生的平均分和总分(3)按总分从高到低排除名次,并按名次输出每个学生的情况,包括学号、各科成绩、平均分、总分(4)根据用户要求输出某门课程(从键盘输入)成绩在90分以上(合90分)且总分在前5名的学生情况,包括学生、各科成绩、平均分、总分。(即查询功能)                                                                                                      要求:(1)利用子程序(2)分模块(3)用type

回复列表 (共3个回复)

沙发

Module StudMod
  Implicit None
  Integer , Parameter :: INUMBER_OF_COURSE = 6
  Type T_Stud
    Integer :: iStuNumber !//学号
    Real :: rScore( INUMBER_OF_COURSE ) !//6门成绩
    Real :: rScoreAll , rScoreAvg !//总分和平均分
  End Type T_Stud
  
Contains
  
  Subroutine GetStudInfo( cFilename , stStudArray )
    Character( Len = * ) ,Intent( IN ) :: cFilename
    Type( T_Stud ) , Intent( OUT ) :: stStudArray( : )
    Integer :: i
    Open( 12 , File = cFilename )
    Do i = 1 , size( stStudArray )
      Read( 12 , * ) stStudArray( i )%iStuNumber , stStudArray(i)%rScore
    End Do
    Close( 12 )
  End Subroutine GetStudInfo
  
  Subroutine CalcScore( stStud )
    Type( T_Stud ) , Intent( INOUT ) :: stStud
    Integer :: i
    Real :: rTmp
    rTmp = 0.0
    Do i = 1 , INUMBER_OF_COURSE
      rTmp = rTmp + stStud%rScore( i )
    End Do
    stStud%rScoreAll = rTmp
    stStud%rScoreAvg = rTmp / INUMBER_OF_COURSE
  End Subroutine CalcScore
  
  Subroutine OutputInfo( stStud , iNum )
    Type( T_Stud ) , Intent( IN ) :: stStud(:)
    Integer , Intent( IN ) :: iNum
    Write(*,"(i,6f7.1,f9.1,f9.3)") stStud( iNum )%iStuNumber,stStud( iNum )%rScore ,stStud( iNum )%rScoreAll, stStud( iNum )%rScoreAvg
  End Subroutine OutputInfo
  
  Subroutine HeapSort( stD , comp_f )
    Type ( T_Stud ) , Intent( INOUT ) :: stD( : )
    Real , External :: comp_f
    Integer i,ir,j,l,n
    Type ( T_Stud ) :: stTemp
    n = size( stD )
    If ( n < 2 ) Return
    l = n / 2 + 1
    ir = n
    Do while( .TRUE. )
      If( l > 1 ) then
        l = l - 1
        stTemp = stD( l )
      Else
        stTemp = stD( ir )
        stD( ir ) = stD( 1 )
        ir = ir - 1
        If( ir == 1 ) then
          stD( 1 ) = stTemp
          return
        End If
      End If
      i = l
      j = l + l
      Do while( j<=ir )
        If( ( j < ir ) ) then
          If ( comp_f( stD(j) , std(j+1) ) > 0.0 ) then
            j = j+1
          End If
        EndIf
        If( comp_f( stTemp , stD(j) ) > 0.0 )then
          stD(i) = stD( j )
          i = j
          j = j + j
        Else
          j = ir + 1
        End If
      EndDo
      stD( i ) = stTemp
    End Do
  End Subroutine HeapSort
  
  Real Function comp_f_Score( st1 , st2 )
    Type( T_Stud ) , Intent( IN ) :: st1 , st2
    comp_f_Score = st1%rScoreAll - st2%rScoreAll
  End Function comp_f_Score




End Module StudMod




Program Main
  Use StudMod
  Implicit None
  Integer , Parameter :: INUMBER_OF_STUD = 35 !35个学生
  Type( T_Stud ) :: stStuds( INUMBER_OF_STUD ) !定义学生数组结构体
  Integer :: i , iCourseNumber 
  Call GetStudInfo( "info.dat" , stStuds ) !读入学生信息
  Do i = 1 , INUMBER_OF_STUD
    Call CalcScore( stStuds(i) ) !计算平均分和总分
  End Do
  Call HeapSort( stStuds , comp_f_Score ) !排序
  Do i = 1 , INUMBER_OF_STUD
    Call OutputInfo( stStuds , i ) !输出排序后的学生信息
  End Do
  Write(*,*) "请输入挑选的课程号(1-6):"
  Read(*,*) iCourseNumber
  Do i = 1 , 5
    If( stStuds(i)%rScore( iCourseNumber ) > 90.0 ) then
      Call OutputInfo( stStuds , i ) !输出满足筛选条件的学生信息
    End If
  End Do
End Program Main

板凳


万分感谢!!!!

3 楼

111111111

我来回复

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