代码(Ada) 1. Hello, concurrent word

这门课使用Ada语言,感觉国内的相关资料比较少,所以我会一边上传代码一边讲解语法。

下面这段代码是用来实现两个算式,让他们同时运行,即2个程序并行。

with Ada.Text_IO; use Ada.Text_IO;
procedure means is
   type number is digits 5;  --表示该type的精确度为五位小数 
   type numbers is array (Positive range <>) of number;
   Test_numbers : constant numbers := (10.0, 20.0, 40.0, 30.0);
   n : constant number := 6.0;
   task Arithmetic_Mean;  --声明并运行一个task 
   task Harmonic_Mean; -- 声明并运行一个task

  -- 以下是一个task的body
   task body Arithmetic_Mean is
      A_Mean : number := 0.0;

   begin
      for i in Test_numbers'Range loop
         A_Mean := A_Mean + Test_numbers (i);
      end loop;
      A_Mean := A_Mean / n;
      Put ("Arithmetic_Mean : ");
      Put (number'Image (A_Mean));
      New_Line;
   end Arithmetic_Mean;

   -- 以下是一个task的body
   task body Harmonic_Mean is
      H_Mean : number := 0.0;
   begin
      for i in Test_numbers'Range loop
         H_Mean := 1.0 / (H_Mean + (1.0 / Test_numbers (i)));
      end loop;
      H_Mean := H_Mean * n;
      Put ("Arithmetic_Mean : ");
      Put (number'Image (H_Mean));
      New_Line;
   end Harmonic_Mean;

-- 这个是主程序的运行内容,即这段代码有3个task
begin
   null;
end means;

语法:
3个keyword :Last, Range,First。
Last:对于scalar subtype ,它表示该数范围内的最后一个值。
对于一个数组,它表示该数组的最后一个index的值。
Frist:同上,都是第一个值。
Range:对于scalar subtype ,它表示有效值的范围。
对于一个数组,它表示index的范围。
T'Range == T'First .. T'Last

这里有一个主程序,大多数情况下,它都没有内容,但是他一定是最后一个结束的程序,因为一旦他结束了,整个程序也就结束了。


下面这段代码是实现一个队列,个人感觉原理都差不多,故编写起来还算简单

package body Queue_Pack_Private is

   procedure Enqueue (Item : Element; Queue : in out Queue_Type) is

   begin
      if Is_Full (Queue) then
         raise Queue_overflow;
      end if;

      Queue.Elements (Queue.Free) := Item;
      Queue.Free     := Queue.Free + 1;
      Queue.Is_Empty := False;
   end Enqueue;

   procedure Dequeue (Item : out Element; Queue : in out Queue_Type) is
   begin
      if Is_Empty (Queue) then
         raise Queue_underflow;
      end if;

      Item := Queue.Elements (Queue.Top);
      Queue.Top := Queue.Top - 1;

      if Is_Empty (Queue) then
         Queue.Is_Empty := True;
      end if;
   end Dequeue;

   function Is_Full (Queue : Queue_Type) return Boolean is
     (not Queue.Is_Empty and then Queue.Top = Queue.Free);

   function Is_Empty (Queue : Queue_Type) return Boolean is
     (Queue.Top = Queue.Free);

end Queue_Pack_Private;

在这个队列判断full or empty的时候,个人感觉有些问题,没有按照队列判满的常规进行。(部分代码老师给的,所以不能改)


下面这段代码在Queue的基础上改成了一个可以被overload的stack。

generic
   type Element is private;
   Stack_Size : Positive := 10;

package Queue_Pack_Private is

   type Queue_Type is limited private;

   procedure Enqueue (Item :     Element; Queue : in out Queue_Type);
   procedure Dequeue (Item : out Element; Queue : in out Queue_Type);

   function Is_Empty (Queue : Queue_Type) return Boolean;
   function Is_Full  (Queue : Queue_Type) return Boolean;

   Queue_overflow, Queue_underflow : exception;

private
   type Marker is new Integer range 1 .. Stack_Size; -- attention
   type List is array (Marker) of Element;
   type Queue_Type is record
      Top, Free : Marker  := Marker'First;
      Is_Empty  : Boolean := True;
      Elements  : List;
   end record;
end Queue_Pack_Private;

with Queue_Pack_Private;
with Ada.Text_IO;        use Ada.Text_IO;

procedure Queue_Test_Private is
   package Queue_Pack_Character is new Queue_Pack_Private (Element => Character, Stack_Size => 20);
   use Queue_Pack_Character;

   Stack : Queue_Type;
   Current_Item : Character;

begin
   Enqueue (Item => 'x', Queue => Stack);

   Enqueue (Item => 'y', Queue => Stack);

   Enqueue (Item => 'z', Queue => Stack);

   Dequeue (Current_Item, Stack);

   Put_Line ("Current_Item:" & Current_Item);

   Put_Line ("Stack is" & (if Is_Empty (Stack) then "" else " not") & " empty on exit");

exception
   when Queue_underflow => Put ("Queue underflow");
   when Queue_overflow  => Put ("Queue overflow");
end Queue_Test_Private;

上面的代码主要是说明了重载的使用方法。先在package的声明中定义它为一个可以overload的package,

generic
   type Element is private;
   Stack_Size : Positive := 10;

然后在调用这个package的时候对其重载。

package Queue_Pack_Character is new Queue_Pack_Private (Element => Character, Stack_Size => 20);
   use Queue_Pack_Character;

notice:有if 就必须要有else

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容