繁体   English   中英

如何在 Ada 中编写人口增长表?

[英]How to write a population-growth table in Ada?

** 我希望我的代码为人口显示下表,但似乎我的代码甚至不接近于此。 那么我怎样才能使我的代码正确呢? 我最大的问题是使用基于范围的 for 循环。 该表显示了 A 和 B 的人口及其人口增长(百分比),并要求用户输入一些数据,当人口 b 绕过人口 a 时,循环应该停止。 示例代码:**

Enter start year: 1976
Enter country A's population (in million): 200
Enter country A's population increase (in%): 10.0
Enter country B population (in million): 100
Enter country B population increase (in%): 50.0
Year Increase A  Population A  Increase B  Population B
1976  ----        200.00        ------       100.00
1977 20.00        220.00        50.00        150.00
1978 22.00        242.00        75.00        225.00
1979 24.20        266.20        112.50       337.50
In 1979, country B bypassed country A in population.

我的代码:

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 Population is
x,Population_A, Population_B:Float;
Growth_A, Growth_B, Growth_1,Growth_2: Float;
begin
Put("Write in the year: "); Get(x);
Put("Population_A: "); Get(Population_A);
Put("Population_B: "); Get(Population_B);
Put("Population grow for A: "); Get(Growth_A);
Put("Population growth for B: "); Get(Growth_B); New_Line;

Put("Year   Growth A   Population A   Growth B    Population B ");
for I in 1900..2018 loop
  Put(Integer(I)); New_Line;
  while Population_B < Population_A loop
     Growth_1 := Growth_A +1.0;
     Growth_2 := Growth_B +1.0;
     Put(Growth_1, 13,2,0); New_Line;
     Put(Population_A + (Population_A * Growth_A/100.0),15,2,0); New_Line;
     Put(Growth_2, 17,2,0); New_Line;
     Put(Population_B + (Population_B * Growth_B/100.0),19,2,0);
     end loop;
end loop;
end Population;

您的问题确实是使用基于范围的 for 循环。 还有其他形式。

我可能会去寻找类似的东西

--  read in the data
--  check that there is actually a solution
--  (B’s population not already greater than A’s)

Year := -- value read from data, e.g. 1976
loop
   Year := Year + 1;
   Population_Of_A := -- calculate it
   Population_Of_B := -- calculate it
   exit when Population_Of_B > Population_Of_A;
end loop;

您需要对要解决的问题有一个更完整的概念。

该问题假设每个国家的人口增长率不变。 虽然这个假设简化了问题,但它远非现实。

A 国或 B 国都可以从较小的初始人口开始。 如果从人口较少的国家开始的人口增长率也最低,那么较小的国家在人口上永远不会超过较大的国家。 您的计划将如何处理任一国家最初可能拥有更多人口的可能性?

下面的程序处理其中的一些问题,但不是全部。 也许你可以通过学习下面的程序来了解如何处理所有问题。

with Ada.Text_Io; use Ada.Text_IO;
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Main is
   Year : Positive;

   type Country (Id : Character) is record
      Population : Float;
      Rate       : Float;
      Increase   : Float;
   end record;

   type Country_Access is access all Country;

   Country_A : aliased Country('A');
   Country_B : Aliased Country('B');
   Smaller : Country_Access;
   Larger  : Country_Access;

   procedure Display(Yr : Positive; Cnt_A : Country; Cnt_B : Country) is
   begin
      Put(Item => Yr, Width => 4);
      Put(Item => Cnt_A.Increase, Aft => 2, Fore => 8, Exp => 0);
      Put(Item => Cnt_A.Population, Aft => 2, Fore => 8, Exp => 0);
      Put(Item => Cnt_B.Increase, Aft => 2, Fore => 8, Exp => 0);
      Put(Item => Cnt_B.Population, Aft => 2, Fore => 8, Exp => 0);
      New_Line;
   end Display;

begin
   Put("Enter start year: ");
   Get(Year);
   Put("Enter country A's population (in million): ");
   Get(Country_A.Population);
   Put("Enter country A's population increase (in %): ");
   get(Country_A.Rate);
   Country_A.Rate := (Country_A.Rate / 100.0);
   Put("Enter country B's population (in million): ");
   Get(Country_B.Population);
   Put("Enter country B's population increase (in %): ");
   Get(Country_B.Rate);
   Country_B.Rate := (Country_B.Rate / 100.0);
   if Country_A.Population < Country_B.Population then
      Smaller := Country_A'Access;
      Larger := Country_B'Access;
   else
      Smaller := Country_B'Access;
      Larger := Country_A'Access;
   end if;

   Put_Line("Year Increase A Population A Increase B Population B");
   Put(Item => Year, Width => 4);
      Put(" ----------");
      Put(Item => Country_A.Population, Aft => 2, Fore => 8, Exp => 0);
      Put(" ----------");
      Put(Item => Country_B.Population, Aft => 2, Fore => 8, Exp => 0);
   New_Line;
   while Smaller.Population <= Larger.Population loop
      Year := Year + 1;
      Country_A.Increase := Country_A.Population * Country_A.Rate;
      Country_A.Population := Country_A.Population + Country_A.Increase;
      Country_B.Increase := Country_B.Population * Country_B.Rate;
      Country_B.Population := Country_B.Population + Country_B.Increase;
      Display(Yr    => Year,
              Cnt_A => Country_A,
              Cnt_B => Country_B);
   end loop;
   Put_Line("In" & Year'Image & " country " & Smaller.Id &
              " bypassed country " &
              Larger.Id & " in population.");
end Main;

编辑:以下是不使用访问类型的上述程序的一个版本。

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

procedure No_Access is
   Year : Positive;

   type Country is record
      Population : Float;
      Rate       : Float;
      Increase   : Float;
   end record;

   Country_A : Country;
   Country_B : Country;

   procedure Increase
     (Yr : in out Positive; A : in out Country; B : in out Country)
   is
   begin
      Yr           := Yr + 1;
      A.Increase   := A.Population * A.Rate;
      A.Population := A.Population + A.Increase;
      B.Increase   := B.Population * B.Rate;
      B.Population := B.Population + B.Increase;

      Put (Item => Yr, Width => 4);
      Put (Item => A.Increase, Aft => 2, Fore => 8, Exp => 0);
      Put (Item => A.Population, Aft => 2, Fore => 8, Exp => 0);
      Put (Item => B.Increase, Aft => 2, Fore => 8, Exp => 0);
      Put (Item => B.Population, Aft => 2, Fore => 8, Exp => 0);
      New_Line;
   end Increase;

begin
   Put ("Enter start year: ");
   Get (Year);
   Put ("Enter country A's population (in million): ");
   Get (Country_A.Population);
   Put ("Enter country A's population increase (in %): ");
   Get (Country_A.Rate);
   Country_A.Rate := (Country_A.Rate / 100.0);
   Put ("Enter country B's population (in million): ");
   Get (Country_B.Population);
   Put ("Enter country B's population increase (in %): ");
   Get (Country_B.Rate);
   Country_B.Rate := (Country_B.Rate / 100.0);
   Put_Line ("Year Increase A Population A Increase B Population B");
   Put (Item => Year, Width => 4);
   Put (" ----------");
   Put (Item => Country_A.Population, Aft => 2, Fore => 8, Exp => 0);
   Put (" ----------");
   Put (Item => Country_B.Population, Aft => 2, Fore => 8, Exp => 0);
   New_Line;
   if Country_A.Population < Country_B.Population then
      while Country_A.Population <= Country_B.Population loop
         Increase (Year, Country_A, Country_B);
      end loop;
      Put_Line
        ("In" & Year'Image & " country A bypassed country B in population.");
   else
      while Country_B.Population <= Country_A.Population loop
         Increase (Year, Country_A, Country_B);
      end loop;
      Put_Line
        ("In" & Year'Image & " country B bypassed country A in population.");
   end if;

end No_Access;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM