⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex0908.f90

📁 Fortran 95程序设计【彭国伦】第9章
💻 F90
字号:
module typedef
  type player
    character(len=80) :: name
    real weight, height
	real score
  end type
end module

program ex0908
  use typedef
  implicit none
  character(len=20)  :: filename = "ex0908dat.txt"
  integer, parameter :: fileid = 20
  logical :: alive   ! 检查文件是否存在
  type(player) :: p  ! 读取选手数据
  character(len=10)  :: title ! 读取数据项目
  real tempnum       ! 读取数据
  logical, external :: GetNextPlayer ! 找出下一位球员数据的函数
  integer i          ! 循环记数器
  integer error      ! 检查文件读取是否正常

  inquire(file=filename, exist=alive)
  if ( .not. alive ) then ! 文件不存在就结束程序
    write(*,*) trim(filename)," doesn't exist."
	stop
  end if
  
  open(unit=fileid, file=filename)
  do while(.true.)
    if ( GetNextPlayer(fileid, p%name) ) then
	  do i=1,3
   	    read(fileid, "(A4,1X,F)", iostat=error ) title, tempnum
		if ( error/=0 ) then
		  write(*,*) "文件读取错误"
		  stop
		end if
	    ! 要经由每一行最前面两个中文字来判断读入的是什么数据
	    select case(title)
	    case("身高")
	      p%height = tempnum
	    case("体重")
	      p%weight = tempnum
	    case("得分")
	      p%score = tempnum
		case default
		  write(*,*) "出现不正确的数据"
		  stop
        end select
	  end do
	else
	  exit  
	end if

	if ( p%score > 20.0 ) then ! 印出得分高于20分的选手数据
	  write(*,"('姓名:',A8/,'身高:',F5.1,' 体重:',F5.1,' 得分:',F4.1)") p
	end if
  end do

  stop
end
! GetNextPlayer函数会从文件中找出下一位球员的数据位置
! 如果文件中还有数据需要读取, 传回.true.
! 如果文件中没有数据需要读取, 传回.false.
logical function GetNextPlayer(fileid, name)
  implicit none
  integer, intent(in) :: fileid
  character(len=*), intent(out) :: name
  character(len=80) title
  integer  error

  do while(.true.)
    read(fileid,"(A80)",iostat=error) title
	
	if ( error/=0 ) then ! 文件中已经没有数据了
	  GetNextPlayer = .false.
	  return
	end if

	if ( title(1:4)=="姓名" ) then
	  name = title(6:)
	  GetNextPlayer = .true.
	  return
	end if
  end do

  return
end function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -