对象“Antal_rader”在其声明结束之前不能使用

问题描述 投票:0回答:1

OBS!我的代码是用瑞典语术语编写的。

我必须编写增值税表,但我遇到了一些有关浮点数及其舍入值的方式的问题。起初,我使用了 while 循环,但这不起作用,因为它(一段时间后)受到浮动问题的影响太大。

我创建了一个 For 循环,理论上它应该工作得更好。然而。我的一个变量有问题。

变量“Antal_Rader”在 For 循环之前被声明,但我仍然收到错误代码:“对象“Antal_rader”不能在其声明结束之前使用”

代码:

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

procedure Momstabellen is
   Forsta_Pris : Float;
   Sista_Pris : Float;
   Steglangd : Float;
   Momsprocent : Float;
   Moms : Float;
   Antal_Rader : Float;
   Nuvarande_Rad : Float;
   
   
begin
   -- 1. Ta emot alla variabler för momstabellen:
   Put("Första pris: ");
   Get(Forsta_Pris);
   while Forsta_Pris < 0.0 loop
      Put("Felaktigt värde!");
      New_Line;
      Put("Första pris: ");
      Get(Forsta_Pris);
    end loop;
   
   Put("Sista pris: ");
   Get(Sista_Pris);
   while Sista_Pris < Forsta_Pris loop
      Put("Felaktigt värde!");
      New_Line;
      Put("Sista pris: ");
      Get(Sista_Pris);
   end loop;
   
   Put("Steg: ");
   Get(Steglangd);
   while Steglangd < 0.0 loop
      Put("Felaktigt värde!");
      New_Line;
      Put("Steg: ");
      Get(Steglangd);
   end loop;
   
   Put("Momsprocent: ");
   Get(Momsprocent);
   while Momsprocent < 0.0 or Momsprocent > 100.0 loop
      Put("Felaktigt värde!");
      New_Line;
      Put("Momsprocent: ");
      Get(Momsprocent);
   end loop;
   New_Line;

-- 2. Skapa en layout för momstabellen:
   Put("============ Momstabell ============");
   New_Line;
   Put("Pris utan moms  Moms   Pris med moms");
   New_Line;

问题出在这里:

   

   Antal_Rader := (Sista_Pris - Forsta_Pris)/Steglangd;
   
   for I in 0 .. Antal_Rader loop
      
      Nuvarande_Rad := Antal_Rader * Steglangd + Forsta_Pris;   
      Moms := Nuvarande_Rad/100.0 * Momsprocent;
      
      Put(Nuvarande_Rad, Fore=> 6, Aft => 2, Exp => 0);
      Put(Moms, Fore => 8, Aft => 2, Exp => 0);
      Put(Nuvarande_Rad + Moms, Fore => 9, Aft => 2, Exp => 0);
     
   end loop;
    
     
end Momstabellen;

我尝试更改 For 循环的第一行,也尝试更改“Antal_Rader”的位置,但没有任何效果。

我对此很陌生,所以我想不出还有更多的事情要做。

variables declaration ada
1个回答
0
投票

这是程序的一个版本,经过更改后可以在没有任何编译器消息的情况下进行编译。您应该对其进行测试以确保它能够满足您的要求。

with Ada.Text_IO; use Ada.Text_IO;

procedure Momstabellen is
   type Money is delta 0.01 digits 8 range 0.0 .. 999_999.99;

   package money_io is new Decimal_IO (Money);
   use money_io;

   subtype Procent is Money range 0.0 .. 100.0;

   Forsta_Pris   : Money;
   Sista_Pris    : Money;
   Steglangd     : Money;
   Momsprocent   : Procent;
   Moms          : Money;
   Antal_Rader   : Money;
   Nuvarande_Rad : Money;

begin
   -- 1. Ta emot alla variabler för momstabellen:
   Put ("Första pris: ");
   Get (Forsta_Pris);
   -- Definition of Money prohibits a value less than 0.0

   -- Put ("Sista pris: ");
   --  Get (Sista_Pris);
   --  while Sista_Pris < Forsta_Pris loop
   --     Put ("Felaktigt värde!");
   --     New_Line;
   --     Put ("Sista pris: ");
   --     Get (Sista_Pris);
   --  end loop;
   loop
      Put ("Sista pris: ");
      Get (Sista_Pris);
      exit when Sista_Pris >= Forsta_Pris;
      Put_Line ("Felaktigt värde!");
   end loop;

   -- Again, the definition of Money prevents input of value < 0.0
   Put ("Steg: ");
   Get (Steglangd);

   -- The definition of the subtype Procent ensures a value within the
   -- required range.
   Put ("Momsprocent: ");
   Get (Momsprocent);

   -- 2. Skapa en layout för momstabellen:
   Put ("============ Momstabell ============");
   New_Line;
   Put ("Pris utan moms  Moms   Pris med moms");
   New_Line;

   Antal_Rader := (Sista_Pris - Forsta_Pris) / Steglangd;

   for I in 0 .. Integer (Antal_Rader) loop
      Nuvarande_Rad := Antal_Rader * Steglangd + Forsta_Pris;
      Moms          := Nuvarande_Rad / 100.0;
      Moms          := Moms * Momsprocent;

      Put (Nuvarande_Rad, Fore => 6, Aft => 2, Exp => 0);
      Put (Moms, Fore => 8, Aft => 2, Exp => 0);
      Put (Nuvarande_Rad + Moms, Fore => 9, Aft => 2, Exp => 0);
   end loop;

end Momstabellen;
© www.soinside.com 2019 - 2024. All rights reserved.