Ada编程:计算距周六剩余天数的代码优化与输入校验问题
问题解答
1. 简化多分支逻辑的实现方案
你完全可以不用写大量elsif分支,这里有两种符合「不使用数组」要求的更简洁实现:
- 方案1:直接用算术公式计算
你设定的规则可以直接提炼为表达式:if Days <=5 then 6 - Days else 13 - Days end if,一行就能完成计算,不需要多分支匹配。 - 方案2:用Ada的
case语句替换elsif
即使需要分支匹配,case语句的结构也比多层elsif更清晰易读,性能也更稳定。
2. 输入校验逻辑的调整建议
你当前的代码确实存在逻辑漏洞:即使输入超出1-7的范围,打印错误提示后仍然会继续调用Week函数,而Week没有处理非法输入,会触发运行时异常。推荐你把校验逻辑移入子程序内,原因有两个:
- 校验逻辑和业务逻辑绑定,放在函数内可以保证所有调用这个函数的场景都自动有校验能力,不用每次调用都重复写校验代码
- 避免外部调用时忘记校验传入非法值导致的异常
你可以在函数内自定义异常,输入非法时直接抛出,主程序捕获异常做错误提示即可。
优化后完整代码示例
with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure Test3 is -- 自定义参数非法异常 Invalid_Day_Error : exception; function Week (Days : in Integer) return Integer is begin -- 校验逻辑移入函数内 if Days not in 1 .. 7 then raise Invalid_Day_Error with "输入的星期值必须在1-7之间"; end if; -- 直接用算术公式计算结果 return (if Days <= 5 then 6 - Days else 13 - Days); end Week; Input_Day : Integer; begin Put("What day is it: "); Get(Input_Day); Put("It's "); Put(Week(Input_Day), Width => 1); Put_Line(" days until Saturday."); exception when Invalid_Day_Error => Put_Line("Wrong Value"); when Data_Error => Put_Line("Wrong Value: 请输入合法整数"); end Test3;
这个版本还额外加了输入非整数的异常捕获,避免输入字符等内容时程序崩溃。
内容的提问来源于stack exchange,提问作者leun
相关产品推荐
相关产品推荐

