2017-09-16 4 views
-1

Desciption: Le programme que je fais dans Ada 95 est supposé sortir une liste de taxes en fonction de l'entrée de l'utilisateur comme ci-dessous:Ada 95 - while-loop inside Le sous-programme donne la sortie *** inf ***

Prix sans taxes | Taxe | Prix ​​avec les taxes

Si l'entrée utilisateur Premier prix: 10, Dernière Tarif: 20, étapes: 0,5 et impôt en entier. Le programme passe ensuite de 10 à 20 avec des pas de 0,5 avant de s'arrêter.

Le problème auquel je fais face est la sortie de la valeur de "Tax" et "Prix avec les taxes". Le résultat que je reçois est **** inf **** sur les deux colonnes. Je n'ai aucune idée de ce que cela signifie réellement, et je ne peux trouver aucune autre information à ce sujet. J'ai donc fait une autre tentative et obtenu le résultat que je voulais sauf la première ligne à l'intérieur de l'itération. Il a commencé avec la valeur 10 Taxes = 0 et le dernier Pris avec taxes = 0, mais toutes les autres colonnes et lignes étaient correctes.

N'est-ce pas supposé fonctionner de la même manière avec les sous-programmes comme c'est le cas avec les boucles comme dans le Main? J'ai exactement le même programme dans un autre fichier, la différence est que tout est dans le Main et pas dans un sous-programme comme celui-ci.

Quelqu'un d'autre a-t-il déjà vécu cela et sait comment le résoudre?

-------- 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; 

Meilleures salutations Robert

+1

instantané du code serait très utile pour obtenir des réponses raisonnables. – kaza

+0

Copier/coller préférable à l'instantané. Codepen/JsFiddle préférable de copier/coller :) – admcfajn

+1

Votre question concerne Ada, donc copier/coller. Pas de Javascript, donc pas de JsFiddle, et probablement pas de Codepen non plus. –

Répondre

1

Si vous obtenez Infinity float dans les calculs réguliers, vous divisez probablement par zéro.

De même, vous ne devez pas utiliser de flottants pour de l'argent si vous avez besoin que les sommes obtenues correspondent à un cent.

+0

Hey, tout d'abord merci pour le commentaire rapide! Le vrai problème pour moi est que la boucle while fonctionne dans le programme précédent que j'ai écrit, avec exactement les mêmes variables, y compris l'itération. Maintenant, lorsque j'essaie d'utiliser des sous-programmes, cela ne fonctionne pas, et je reçois l'infini flottant. –

+0

@ R.Englund avez-vous essayé, bien, déboguer le programme? À première vue, cela semble correct sur le plan des algorithmes, donc le problème est probablement lié à certains détails de mise en œuvre. –

2

Lorsque je compile votre code (avec -gnatl pour obtenir des messages du compilateur intercalées avec une liste de code), je reçois

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

72. Moms : Float; 

Pour éviter wheeling le débogueur, j'ai changé les déclarations en Skriv_Ut à

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

car GNAT ne détecte pas de débordement numérique à virgule flottante - ce code détectera les résultats Inf (et probablement NaN).

L'exécution du programme donne

$ ./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 

où la ligne 59 est

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

Je pense que votre problème est ces deux lignes:

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

Merci beaucoup Simon Wright, vous venez de faire ma journée! Je me suis cogné la tête en essayant de trouver le problème pendant 2 jours et jamais sur la poitrine: Hamta ("Mata in Momsprocent:", Moms); Skriv_Ut (Forsta_Pris, Sista_Pris, Steg, Momsprocent); La première ligne du code "Moms" qui signifie Taxe, ne correspond pas à la deuxième ligne avec "Momspercent" qui est le pourcentage. J'ai toujours pensé que ça avait à voir avec les maths dans la boucle while. Encore merci! –