Ada 95 - 子程序中的while循环提供输出*** inf ***

时间:2017-09-16 15:31:42

标签: ada

Desciption :我在Ada 95中制作的程序假设根据用户的输入输出税单,如下所示:

无税价格|税|含税价格

如果用户输入 First Price:10 Last Pris: 20,步骤 0.5且作为整数。然后程序在停止之前从步骤0.5到10迭代到20。

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

对于子程序,它是否与主程序中的循环方式相同?我在另一个文件中有完全相同的程序,区别在于它全部在Main中,而不是在子程序中。

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

-------- Code -------------------------------------- ----------------

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;

祝你好运 罗伯特

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

如果你在常规计算中得到浮动无穷大,你最有可能除以零。

另外,如果你需要得到的金额与一分钱相匹配,你就不能使用花车。