這門課使用Ada語言耿戚,感覺國內(nèi)的相關(guān)資料比較少阿趁,所以我會一邊上傳代碼一邊講解語法。
下面這段代碼是用來實現(xiàn)兩個算式脖阵,讓他們同時運行,即2個程序并行呜呐。
with Ada.Text_IO; use Ada.Text_IO;
procedure means is
type number is digits 5; --表示該type的精確度為五位小數(shù)
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;
-- 這個是主程序的運行內(nèi)容蘑辑,即這段代碼有3個task
begin
null;
end means;
語法:
3個keyword :Last搜立, Range,F(xiàn)irst啄踊。
Last:對于scalar subtype ,它表示該數(shù)范圍內(nèi)的最后一個值址晕。
對于一個數(shù)組顿锰,它表示該數(shù)組的最后一個index的值。
Frist:同上硼控,都是第一個值。
Range:對于scalar subtype 匙隔,它表示有效值的范圍熏版。
對于一個數(shù)組捍掺,它表示index的范圍再膳。
T'Range == T'First .. T'Last
這里有一個主程序,大多數(shù)情況下不瓶,它都沒有內(nèi)容胳喷,但是他一定是最后一個結(jié)束的程序夭织,因為一旦他結(jié)束了,整個程序也就結(jié)束了尊惰。
下面這段代碼是實現(xiàn)一個隊列,個人感覺原理都差不多题禀,故編寫起來還算簡單
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的時候迈嘹,個人感覺有些問題全庸,沒有按照隊列判滿的常規(guī)進(jìn)行。(部分代碼老師給的壶笼,所以不能改)
下面這段代碼在Queue的基礎(chǔ)上改成了一個可以被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;
然后在調(diào)用這個package的時候?qū)ζ渲剌d坤候。
package Queue_Pack_Character is new Queue_Pack_Private (Element => Character, Stack_Size => 20);
use Queue_Pack_Character;
notice:有if 就必須要有else