Java二分法求方程近似根代码如何实现In.txt读参及Out.txt输出
二分法求根代码文件读写改造方案
原错误代码核心问题
- 变量作用域非法:
epsilon、save是main方法的局部变量,不能直接在bisection方法中访问,save.close()直接写在类作用域属于语法错误 - 输入读取逻辑错误:输入第四项是函数表达式字符串,不能用
nextDouble直接读取 - 方法修饰符错误:bisection方法被改为实例方法,无法直接在静态main方法中调用
- 输出方法使用错误:PrintWriter的格式化输出需要用
printf而非println - 资源未规范关闭:Scanner、PrintWriter等IO资源未按规范处理,可能导致内容没写入文件
正确实现代码
import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Scanner; class xyz { // 固定函数逻辑,和原硬编码保持一致,若需要支持动态解析输入的函数可引入JEP等表达式解析库 static double func(double x) { return x * x - 2; } static void bisection(double a, double b, double epsilon, PrintWriter save) { if (func(a) * func(b) >= 0) { save.println("输入的区间a和b不合法,区间两端函数值同号"); return; } double c = a; while ((b - a) >= epsilon) { c = (a + b) / 2; if (func(c) == 0.0) break; else if (func(c) * func(a) < 0) b = c; else a = c; } // 按要求输出保留4位小数的结果 save.printf("%.4f", c); } public static void main(String[] args) throws FileNotFoundException { Scanner in = null; PrintWriter save = null; try { File file = new File("In.txt"); in = new Scanner(file); save = new PrintWriter("Out.txt"); double a = in.nextDouble(); double b = in.nextDouble(); double epsilon = in.nextDouble(); // 跳过后续的函数字符串内容,当前默认使用x²-2 if (in.hasNextLine()) { in.nextLine(); } bisection(a, b, epsilon, save); } finally { // 确保资源一定关闭 if (in != null) { in.close(); } if (save != null) { save.close(); } } } }
运行说明
- 将In.txt放在项目运行的根目录,内容格式和示例一致:
a b 精度 函数表达式,比如-1 5 0.25 (x*x)-2 - 运行代码后,同目录会生成Out.txt,输出内容和示例一致为
1.4375 - 如果需要支持动态读取输入的不同函数表达式,可以引入第三方表达式解析库,解析读取到的函数字符串后替换当前的func方法逻辑即可。
内容的提问来源于stack exchange,提问作者Rafał Masny
相关产品推荐
相关产品推荐

