2016-06-10 108 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是要解决特定问题。它不是一本教科书,也不是一个家庭作业解决方案中心,也不是一个完整的教学服务。 –