Fortran嵌套DO与DO WHILE循环实现成绩录入校验问题咨询
Fortran成绩平均值计算程序修复方案
原代码问题梳理
- 变量
j未初始化就参与逻辑判断,初始值为内存随机值,导致输入校验逻辑完全失效 - 没有单独的输入校验循环,不符合“仅接收0-100之间成绩”的要求,用户输入非法值也会直接存入数组
- 每次循环直接调用
sum(a)计算数组总和,未赋值的数组元素为随机值,总和计算结果错误 - 平均值计算逻辑错误:直接固定除以10,没有根据实际录入的有效成绩数量动态计算
修复后代码
program Average implicit none integer :: i, valid_cnt = 0 real :: sum_grades = 0.0, avg, input_grade real, dimension(10) :: grades ! 外层循环控制最多录入10个有效成绩 do i = 1, 10 ! 内层循环做输入合法性校验,直到输入符合要求为止 do write(*, '(A, I2, A)') "请输入第", i, "个成绩(范围0<成绩<100):" read(*, *) input_grade if (input_grade > 0 .and. input_grade < 100) exit write(*, *) "输入不合法,请输入0到100之间的数值!" end do ! 合法成绩存入数组,累加总和和有效计数 grades(i) = input_grade sum_grades = sum_grades + input_grade valid_cnt = valid_cnt + 1 end do ! 所有成绩录入完成后计算平均值 avg = sum_grades / valid_cnt write(*, '(A, F6.2)') "有效成绩的平均值为:", avg end program Average
逻辑说明
- 外层
do i=1,10循环严格限制最多录入10个有效成绩,满足数量限制要求 - 内层无限循环做单条成绩校验,只要输入不在(0,100)区间就提示重新输入,直到用户输入合法值才退出内层循环,满足范围校验要求
- 边录入边累加总和和有效成绩计数,避免读取数组未初始化区域的随机值,计算结果准确
- 录入完成后统一计算平均值,逻辑清晰无冗余
内容的提问来源于stack exchange,提问作者Bit4261
相关产品推荐
相关产品推荐

