2017-09-16 56 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循環中的數學問題。 再次感謝您! –