Fortran素数判断程序出现ENDDO与DO标签不匹配错误是什么原因?
报错根本原因
你混用了Fortran两种DO循环的语法规则:
- 你写的
do 10,i=2,n-1是带标签的旧式DO循环语法,这种语法要求循环的结束位置必须绑定编号为10的语句标签,不能用普通的end do闭合。 - 你代码最后用
end do来闭合循环,是现代无标签DO循环的写法,这种写法要求do后面不能加语句标签,两种语法混写就触发了标签不匹配的报错。
除此之外你的代码还有两处逻辑问题:
- 无标签的
continue语句没有实际作用,还把素数判断、停止程序的逻辑写到了循环体内,导致循环最多执行一次就会终止 mod(n,i)返回结果为整数,和浮点数0.0比较会有隐式类型转换的隐患,建议直接和整数0比较
两种修复方案
方案1:改用无标签的现代Fortran语法(推荐)
program prime integer n,i print *, 'enter a number' read *,n do i=2,n-1 if(mod(n,i).eq.0) then print*, 'it is not prime' read* stop end if end do ! 循环正常结束说明没有找到因数,直接输出即可 print *, 'it is prime' read * stop end program
方案2:保留带标签的旧式语法
program prime integer n,i print *, 'enter a number' read *,n do 10,i=2,n-1 if(mod(n,i).eq.0) then print*, 'it is not prime' read* stop end if 10 continue ! 这里加对应标签10,作为循环结束标识 print *, 'it is prime' read * stop end program
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

