Ada购物找零机程序报错原因分析及修复方案咨询
Ada购物找零程序报错排查与修复
原始代码
with Ada.Text_IO ; use Ada.Text_IO ; with Ada.Float_Text_IO ; use Ada.Float_Text_IO ; with Ada.Integer_Text_IO ; use Ada.Integer_Text_IO ; procedure Main is begin declare V_PRODUCT := Float; V_RETURN := Float; V_PAID := Floar; type V_COIN is delta 0.01 digist 8; type INDEX is range 1 ..8; type MY_RANGE_COIN is array (INDEX) of V_COIN; Arr: MY_RANGE_COIN := (0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0); --T_COINS begin Put_Line ("Introducir precio del prodcuto. "); Get (V_PRODUCT); Put_Line ("Introducir cuantia"); Get (V_PAID); Put_Line ("La cantidad a devolver es : " & V_RETURN); end; function V_RETURN; declare REFUND : Float := 0.0; begin REFUND := V_PAID - V_PRODUCT; return REFUND ; end; null; end Main;
报错原因分析
- 变量声明语法错误:Ada变量声明格式应为
变量名 : 类型;,而非变量名 := 类型;;同时V_PAID的类型拼写错误,应为Float而非Floar - 定点类型拼写错误:
digist应为digits,正确写法是type V_COIN is delta 0.01 digits 8; - 函数声明与定义违规:Ada函数必须指定返回类型,且子程序(函数/过程)需放在主程序的声明部分,不能直接嵌入执行代码块;变量名
V_RETURN与函数名重名,引发作用域冲突 - 未初始化变量直接使用:
V_RETURN未赋值就参与字符串拼接,且字符串与数值类型不能直接用&拼接,需先转换为字符串格式 - 作用域问题:
V_PRODUCT、V_PAID在内部declare块中声明,外部函数无法访问这些变量
修复后的代码
with Ada.Text_IO; use Ada.Text_IO; with Ada.Float_Text_IO; use Ada.Float_Text_IO; with Ada.Strings.Fixed; use Ada.Strings.Fixed; procedure Main is -- 移至主声明区,让函数可访问 V_PRODUCT : Float; V_PAID : Float; -- 修正定点类型拼写错误 type V_COIN is delta 0.01 digits 8; type INDEX is range 1 .. 8; type MY_RANGE_COIN is array (INDEX) of V_COIN; Arr : MY_RANGE_COIN := (0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0); -- 重命名函数并规范声明,指定返回类型 function Calculate_Return return Float is REFUND : Float := 0.0; begin REFUND := V_PAID - V_PRODUCT; return REFUND; end Calculate_Return; -- 辅助函数:将Float转为带两位小数的字符串 function Float_To_String(Val : Float) return String is Str : String(1..10); Last : Natural; begin Put(Str, Val, 2, 0, 0); return Trim(Str, Ada.Strings.Left); end Float_To_String; begin Put_Line("Introducir precio del producto. "); Get(V_PRODUCT); Put_Line("Introducir cuantia"); Get(V_PAID); -- 调用计算函数并转换为字符串后输出 Put_Line("La cantidad a devolver es : " & Float_To_String(Calculate_Return)); end Main;
修复说明
- 修正变量声明语法,将
:=改为:,并修复Floar的拼写错误 - 修正定点类型的
digist为digits - 将
V_PRODUCT、V_PAID移至主程序声明区,确保函数可访问 - 重命名函数为
Calculate_Return避免命名冲突,同时规范声明返回类型 - 引入
Ada.Strings.Fixed库实现数值转字符串,解决拼接问题 - 将函数定义移至主声明区,符合Ada语法规范
内容的提问来源于stack exchange,提问作者Pepe del Águila
相关产品推荐
相关产品推荐

