2016-06-10 111 views
0

您將如何解決以下問題,它是一個埃菲爾計算器:埃菲爾編程練習

輸入是通過命令行參數。

這些操作數由整數「a b c」的三元組組成,它們表示術語「a x^b Y^c」。多項式的三元組用下面的例子中的字符'#'分隔:

我們有多項式(x^2 - 2xy + y^2)用輸入字符串「1 2 0#-2 1 1#1 0 2「

執行週期

$波利

>> 1 2 0 # -2 1 1 # 1 0 2 

>> 1 2 1 # 1 2 0 # 2 1 1 # -1 0 2 

>> + 

1 2 1 + 2 2 0 

>> e 4 3 

80 0 0 
+0

你能更具體一點,你面對什麼具體問題?你有什麼設計/課程/功能?應該支持哪些操作?爲什麼輸入使用'#'符號連接三元組,但輸出使用'+'?示例最後一部分的含義是什麼?在哪裏提供字符而不是數字?我會建議用更具體的問題或更具體的問題來替換問題,這些問題會顯示您進行鍛鍊的努力以及您不知道如何去做的事情。 –

+0

應支持的操作如下:+, - ,*:如果堆棧至少包含2個元素,則將它們都置於堆棧頂部並以中綴方式執行操作:op1 opr op2。還需要能夠通過以下方式評估(操作'e'):e v1 v2。 –

+0

關於使用#符號連接三元組但輸出使用+的原因,這是因爲實際上+不是輸出,而是指示程序將兩個操作數添加到堆棧頂部的操作,所以不是指定值沿着這個操作,我們首先將它們插入到堆棧中,然後在其頂部執行操作。 –

回答

0

的問題是過於寬泛進行詳細的解答,並有解決的任務太多的辦法。因此,我的回答只是一種使用基類的方法。

有你的問題幾個部分,它們是由一個下面列出的解決方案之一的提示:

  1. 解析輸入。輸入進來單獨的行,所以你可以做

    s: STRING 
    ... 
    io.read_line 
    s := io.last_string 
    s.adjust -- Remove leading and trailing whitespace 
    

    的線有不同的口味。他們可以通過第一個字符來區分

    if s ~ "+" then 
        process_addition (s) 
    elseif ... -- Similarly for substraction and multiplication. 
    elseif s ~ "e" then 
        process_eval (s) 
    elseif s.is_empty then 
         -- Empty line can indicate end of input 
         -- or something else, your logic here. 
    else 
         -- This must be a sequence of coefficients. 
        process_polinomial (s) 
    end 
    

    以上所有內容都應該包含在循環中。

    最複雜的部分是關於係數,所以我會在這裏提到它。首先,他們需要分割成塊3點的整數:

    blocks := s.split ('#') 
    

    然後每塊需要被分成係數:

    across blocks as b loop 
        coefficients := b.item.split (' ') 
        if coefficients.count /= 3 then 
          -- Report error. 
        else 
         coefficients [1].adjust 
         a := coefficients [1].to_integer 
         ... -- Similarly for b and c. 
        end 
    end 
    
  2. 代表多項式。單個術語可以由具有3個屬性的類TERM表示a,bc。他們將創建過程中設置:

    class TERM create make 
    feature {NONE} -- Initialization 
        make (a_value, b_value, c_value: INTEGER) 
         do 
          a := a_value 
          ... 
         end 
        ... 
    end 
    

    條款需要進行比較,看它們是否具有相同的功率x和y:

    same_power (other: TERM): BOOLEAN 
        do 
         Result := b = other.b and c = other.c 
        end 
    

    然後你就可以實現除等操作關於條款:

    add (other: TERM): TERM 
        require 
         same_power: same_power (other) 
        do 
         create Result.make (a + other.a, b, c) 
        end 
    

    多項式是一系列術語。你可以使用ARRAYED_LIST [TERM]。然後根據術語上的操作定義多項式的運算,但需要注意確保所有項的均爲多項式被考慮在內。

  3. 存儲值。該計算器有一個多項式堆棧。然後它可以從用戶輸入中添加一個新的多項式,取兩個產生一個新的多項式,評估堆棧頂部的一個。爲此,您可以使用STACK [TERM]和具體實現ARRAYED_STACK [TERM]來創建堆棧實例。你所需要的操作是:

    • 提出了新的元素:put
    • 採取從堆棧頂部元件:來電來itemremoveitem序列不刪除元素,只是返回當前的一個)
+0

我怎樣才能實現一個循環來生成一個新的應用於操作(add,sub等)的多項式? –

+0

@VinicioStevenFloresHernndez,這個問題又是太寬泛了。如果你有一些代碼可以分享和討論什麼不按預期工作,或者可以提出更具體的問題,那更好。即使是當前的問題/答案,也遠遠超出SO社區政策關於好問題的原因,因爲SO是要解決特定問題。它不是一本教科書,也不是一個家庭作業解決方案中心,也不是一個完整的教學服務。 –