2017-09-16 41 views
-1

说明:我在Ada 95中制作的程序假设根据用户的输入输出一个税表,如下所示:Ada 95 - 子程序内循环给出输出*** inf ***

价格:无税|税收|价格与税收

如果用户输入价格:10最新价格: 20,步骤: 0.5和为整数。程序然后在停止之前以0.5的步长从10重复到20。

我面临的问题是“税收”和“含税价格”的输出值。我得到的结果是两列都是**** inf ****。我不知道这实际上意味着什么,我也找不到任何其他信息。所以我做了另一次尝试,得到了我想要的结果,除了迭代中的第一行外。它从Value 10 Taxes = 0开始,最后Pris的税额= 0,但所有其他列和行都是正确的。

是不是假设像在Main中一样,用与子程序一样的方式来处理子程序?我在另一个文件中有完全相同的程序,不同之处在于它全部在Main中,而不是在子程序中。

有没有其他人经历过这一点,并知道如何解决它?

--------代码------------------------------------- -----------------

with Ada.Text_IO;   use Ada.Text_IO; 
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; 
with Ada.Float_Text_IO; use Ada.Float_Text_IO; 

procedure Momstabell is 

-- First Price, Last Price, Steps & Taxes(in Integer),- Subprogram 

procedure Hamta(S : in String; 
     Tal : out Float) is 

begin 


    Put(S); 
    loop 
     Get(Tal); 
     exit when Tal > 0.0; 
    end loop; 


end Hamta; 

procedure Skriv_Ut(Forsta_Pris, Sista_Pris, Steg, Momsprocent : in 
Float) is 

    First_Price, Last_Price, Steps, Price_With_Tax, Tax_Percentage, Tax : 
    Float; 

begin 

    New_Line; 
    Put("=== Price List ===");New_Line; 
    Put("Price without tax "); 
    Put("Tax "); 
    Put("Price with tax"); 

    -- Local Variables -- 
    First_Price := Forsta_Pris; 
    Last_Price := Sista_Pris; 
    Steps := Steg; 
    Tax_Percentage := Momsprocent; 

    Tax := Tax_percentage/First_Price; 
    Price_With_Tax := First_Price + Tax; 

    while First_Price <= Last_Price loop 

     New_Line; 
     Put(" "); 
     Put(First_Price, Aft => 2, Exp => 0); 
     Put("  "); 
     Put(Tax, Aft => 2, Exp => 0); 
     Put("  "); 
     Put(Price_With_Tax, Aft => 2, Exp => 0); 

-- Iteration -- 

     First_Price := First_Price + Steps; 
     Tax := First_Price/Tax_Percentage; 
     Price_With_Tax := First_Price + Tax; 


    end loop; 

end Skriv_Ut; 

-- Deklaration of Variables 

Forsta_Pris: Float; 
Sista_Pris: Float; 
Steg: Float; 
Momsprocent: Float; 
Moms : Float; 

begin 

    Hamta("Mata in första pris: ",Forsta_Pris); 
    Hamta("Mata in sista pris: ", Sista_Pris); 
    Hamta("Mata in Steg: ",Steg); 
    Hamta("Mata in Momsprocent: ",Moms); 
    Skriv_Ut(Forsta_Pris, Sista_Pris, Steg, Momsprocent); 

end Momstabell; 

问候 罗伯特

+1

代码的快照会获得合理答案非常有用。 – kaza

+0

优先复制/粘贴到快照。 Codepen/JsFiddle更喜欢复制/粘贴:) – admcfajn

+1

你的问题是关于Ada,所以复制/粘贴。没有Javascript,所以没有JsFiddle,也可能没有Codepen。 –

回答

1

如果您在常规计算中获得浮点型无穷大,您很可能将其除以零。

另外,如果您需要将所得到的总和与一分钱匹配,则您不得使用花车花钱。

+0

嘿,首先感谢您的快速评论!对我来说真正的问题是while循环在我编写的前一个程序中起作用,其中包含迭代的完全相同的变量。 现在,当我试图使用子程序它不起作用,并且我得到浮点数无穷大。 –

+0

@ R.Englund您是否尝试过,调试该程序?乍一看,它看起来算法明智,所以问题可能在一些实现细节。 –

2

当我编译你的代码(与-gnatl得到一个代码交错编译器的消息),我得到

70. Steg: Float; 
71. Momsprocent: Float; 
    | 
    >>> warning: variable "Momsprocent" is read but never assigned 

72. Moms : Float; 

为了避免搬出了调试器,我改变了这些声明在Skriv_Ut

subtype My_Float is Float range Float'Range; 
First_Price, Last_Price, Steps, Price_With_Tax, Tax_Percentage, Tax : 
    My_Float; 

由于GNAT未检测到浮点数字溢出 - 此代码将检测Inf(可能是NaN)结果。

运行程序给出

$ ./momstabell 
Mata in första pris: 10 
Mata in sista pris: 20 
Mata in Steg: .5 
Mata in Momsprocent: 5 

=== Price List === 
Price without tax Tax Price with tax 
    10.00  0.00  10.00 

raised CONSTRAINT_ERROR : englund.ada:59 range check failed 

,其中第59行是

58.  First_Price := First_Price + Steps; 
59.  Tax := First_Price/Tax_Percentage; 
60.  Price_With_Tax := First_Price + Tax; 

我觉得你的问题是这两条线:

Hamta("Mata in Momsprocent: ",Moms); 
Skriv_Ut(Forsta_Pris, Sista_Pris, Steg, Momsprocent); 
+0

谢谢你,Simon Wright,你刚刚度过了我的一天!我一直在抨击我的头试图找到问题2天,从来没有胸部: Hamta(“妈妈在Momsprocent:”,妈妈); Skriv_Ut(Forsta_Pris,Sista_Pris,Steg,Momsprocent); 第一行代码“妈妈”,这意味着税务,不匹配第二行与“Momspercent”这是百分比。我一直认为它必须处理while循环中的数学问题。 再次感谢您! –