You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

修复说明

  1. 修正变量声明语法,将:=改为:,并修复Floar的拼写错误
  2. 修正定点类型的digist为digits
  3. 将V_PRODUCT、V_PAID移至主程序声明区,确保函数可访问
  4. 重命名函数为Calculate_Return避免命名冲突,同时规范声明返回类型
  5. 引入Ada.Strings.Fixed库实现数值转字符串,解决拼接问题
  6. 将函数定义移至主声明区,符合Ada语法规范

内容的提问来源于stack exchange,提问作者Pepe del Águila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:07:50