2015-04-24 53 views
1

我目前正在通過John English'「Ada 95:面向對象編程的工藝」。我在task 5.1Ada:如何定義一個隨機常量?

編寫一個程序來玩簡單的猜謎遊戲。定義一個整數類型,其取值範圍爲1到1000,並將一個祕密值聲明爲這種類型的常量,然後爲用戶提供十次猜測其值的機會。

我寫的(爲存根)現在

procedure je_5_1 is 
    type guess_value is new Integer range 1..1000; 
    secret : guess_value; 
    package random_guess_value is new Ada.Numerics.Discrete_Random(guess_value); 
    Gen : random_guess_value.Generator; 
begin 
    random_guess_value.Reset(Gen); 
    secret := random_guess_value.Random(Gen); 
end je_5_1; 

這顯然沒有實現的要求declare a secret value as a constant。但由於必須先撥打Reset(Gen)才能將隨機生成的值分配給secret,因此我無法在begin之前將變量secret定義爲常量。

是否仍可以將secret定義爲隨機常數?

回答

2

使用「聲明」打開新的範圍。例如:

with Ada.Text_IO; use Ada.Text_IO; 

procedure Example is 

    package Integer_Text_IO is new Integer_IO (Integer); 
    use Integer_Text_IO; 

    A : Integer; 

begin 

    Get(A); 

    declare 
     C : constant Integer := A; 
    begin 
     Put(C); 
    end; 

end Example; 

我認爲,文中說的是,當你寫你的代碼,你應該選擇的祕密值並將其插入「硬編碼」到源。

+0

是的,工作!但是,不(完整)練習明確表示要使用RNG。我只是截斷了文字,專注於我的主要問題。謝謝! – alex

2

exercise後來建議您「修改程序,以便每次程序運行時隨機選擇要猜測的值」。這要求在之前Generator被初始化祕密值被建立。一種方法是將祕密值封裝在Abstract State Machine中,圖示爲here。在下面的示例中,Generator的實例是Reset,並且用於在包詳述時執行的語句序列中初始化Secret,如here和圖示here所述。

package Game_Model is 
    subtype Guess_Value is Integer range 1 .. 1000; 
    function Check(value : Guess_Value) return Boolean; 
end Game_Model; 

package body Game_Model is 
    package Guess_Generator is new Ada.Numerics.Discrete_Random(Guess_Value); 
    G: Guess_Generator.Generator; 
    Secret : Guess_Value; 

    function Check(Value : Guess_Value) return Boolean is 
    begin 
     return Value = Secret; 
    end; 

begin 
    Guess_Generator.Reset(G); 
    Secret := Guess_Generator.Random(G); 
end Game_Model; 

給出一個猜測Value,你可以在你的程序所需Check它。

Value : Game_Model.Guess_Value; 
… 
Ada.Text_IO.Put_Line(Boolean'Image(Game_Model.Check(Value))); 
2

您可能會在主過程的聲明部分內創建另一個過程,它會返回隨機數。

procedure je_5_1 is 
    type guess_value is new Integer range 1..1000; 

    function get_random return guess_value 
    is 
    package random_guess_value is new Ada.Numerics.Discrete_Random(guess_value); 
    Gen : random_guess_value.Generator; 
    begin 
    random_guess_value.Reset(Gen); 
    return random_guess_value.Random(Gen); 
    end get_random; 

    secret : constant guess_value := get_random; 
begin 
    --do your 10 chance loop 
end je_5_1;