题目
编写一个 Octave / MATLAB 程序,从标准输入读入两个数 a 和 b,依次输出它们的和、差、积与商;当除数 b 为 0 时,不得执行除法运算,并输出明确的安全提示。
输入格式:一行输入两个数字 a 和 b,以空格或换行分隔。
输出格式:分行输出加、减、乘的结果;商单独一行输出。若除数为 0,则商的部分输出除零警告说明。
数据范围与约定:a, b 为双精度浮点数,支持正负数与小数。
思路与算法
1. 输入捕获机制
在 Octave 脚本中,从标准输入捕获批处理数据可调用 scanf("%f %f", 2) 一次性读取两个浮点数值。相较交互式 input(),在自动化评测与批处理流中 scanf 表现更稳定,且返回值携带实际读取到的元素个数。
2. 浮点除零防御
不同于 C 语言整数除零会直接触发硬件异常崩溃,Octave 浮点除零默认静默返回 Inf 或 NaN。虽然进程不会崩溃,但会污染后续计算流水线。必须显式通过 abs(b) < 1e-12 或 b ~= 0 进行防御判定。
3. 格式化输出对齐
使用 fprintf 指定浮点占位符 %.4f,确保输出小数位数受控且自动换行,避免 disp 因默认显示策略产生不必要的浮动缩进。
完整程序
% Octave / MATLAB 第1题:两数求和、差、积、商
% 从标准输入读入两数并执行基本运算,处理除零异常
% 1. 读取输入数据(期望读入 2 个数值)
[vals, count] = scanf("%f %f", 2);
if count < 2
fprintf("错误:未能成功读取两个数值,请检查输入格式。\n");
return;
end
a = vals(1);
b = vals(2);
% 2. 执行加、减、乘运算
sum_val = a + b;
diff_val = a - b;
prod_val = a * b;
fprintf("和: %.4f\n", sum_val);
fprintf("差: %.4f\n", diff_val);
fprintf("积: %.4f\n", prod_val);
% 3. 除法安全判断:考虑浮点精度容差
if abs(b) > 1e-12
div_val = a / b;
fprintf("商: %.4f\n", div_val);
else
fprintf("商: 除数为 0,无法计算商\n");
end运行示例
示例 1:
输入:
15.5 2.5输出:
和: 18.0000
差: 13.0000
积: 38.7500
商: 6.2000示例 2:
输入:
9.0 0输出:
和: 9.0000
差: 9.0000
积: 0.0000
商: 除数为 0,无法计算商