能否用case语句替代大量if简化Pascal坐标判断代码?
用Case语句简化Pascal坐标判断代码
你的这段坐标判断代码可以通过构造离散标识值结合case语句来简化——因为Pascal的case分支要求匹配常量表达式,我们可以先把坐标的符号、相对大小转化为固定数值,再用case分支对应不同的方向逻辑,避免嵌套if的混乱。
简化思路
- 先单独处理原点(0,0)的特殊情况;
- 定义辅助变量记录x、z的符号(1代表正,-1代表负,0代表零);
- 根据
abs(x)和abs(z)的大小关系,分成三类场景:对角线(绝对值相等)、X轴主导(X绝对值更大)、Z轴主导(Z绝对值更大); - 在每类场景里,用case匹配符号组合的常量值,输出对应方向。
简化后的中文版本代码
program Coordenadas; var x, z : integer; x_sign, z_sign : integer; begin writeln('请输入X坐标:'); readln(x); writeln('请输入Z坐标:'); readln(z); // 处理原点特殊情况 if (x = 0) and (z = 0) then begin writeln('坐标 0 0 是世界中心。'); exit; end; // 获取x的符号标识 if x > 0 then x_sign := 1 else if x < 0 then x_sign := -1 else x_sign := 0; // 获取z的符号标识 if z > 0 then z_sign := 1 else if z < 0 then z_sign := -1 else z_sign := 0; // 按坐标类型分支处理 if abs(x) = abs(z) then begin // 对角线方向:匹配符号组合的常量值 case x_sign * 10 + z_sign of 11: writeln(x,' ', z,' 位于东南方向'); 9: writeln(x,' ', z,' 位于东北方向'); // x正、z负 -9: writeln(x,' ', z,' 位于西南方向'); // x负、z正 -11: writeln(x,' ', z,' 位于西北方向');// x负、z负 end; end else if abs(x) > abs(z) then begin // X轴主导:仅需判断x的符号 case x_sign of 1: writeln(x,' ', z,' 位于东方。'); -1: writeln(x,' ', z,' 位于西方。'); end; end else begin // Z轴主导:仅需判断z的符号 case z_sign of 1: writeln(x,' ', z,' 位于南方。'); -1: writeln(x,' ', z,' 位于北方。'); end; end; end.
关键优化点
- 拆分了原代码的多层嵌套if,把逻辑拆分为三个清晰的大类,每个类内部用case替代嵌套判断,可读性大幅提升;
- 用符号组合的整数值作为case的匹配条件,完美适配Pascal对case常量的要求;
- 保留了原代码的所有判断逻辑,同时统一了输入输出的中文表述。
内容的提问来源于stack exchange,提问作者Ya1000
相关产品推荐
相关产品推荐

