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”的位置,但没有任何效果。
我对此很陌生,所以我想不出还有更多的事情要做。
这是程序的一个版本,经过更改后可以在没有任何编译器消息的情况下进行编译。您应该对其进行测试以确保它能够满足您的要求。
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;