2016-06-10 4 views
0

어떻게하면 다음과 같은 문제를 해결할 수 있습니까? 그것은 에펠의 계산기입니다.에펠 프로그래밍 연습

입력은 명령 행 매개 변수를 통해 이루어집니다.

피연산자는 용어 "a x^b Y^c"를 나타내는 정수 "a b c"로 구성됩니다. 다항식의 삼중 항은 다음 샘플에서와 같이 문자 '#'로 구분됩니다.

입력 문자열 "1 2 0 # -2"로 표현 된 폴리 노미 널 (x^2 - 2xy + y^2) 1 1 1 0 2 "

실행주기

$의 POLI

>> 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

지원해야하는 연산은 다음과 같습니다. +, -, * : 스택에 두 개 이상의 요소가 포함되어있는 경우 스택 상단에있는 두 개를 모두 가져 와서 중가 방식으로 작업을 수행합니다. op1 opr op2. 또한 eval (작업 '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 개의 속성 a, bc을 갖는 클래스 TERM으로 나타낼 수 있습니다. 그들은 생성 절차에 설정됩니다

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

    그럼 당신은 또한 다른 작업을 구현할 수 있습니다

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

    용어들이 x와 y에 대해 같은 힘을 가지고 있는지 비교해야 용어 설명 :

    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

  4. :

    • 새로운 요소를 넣어 요소를 제거하지 않습니다 itemremove (item 호출의 순서를, 단지 현재의 반환)
+0

어떻게 적용 할 작업 (추가, 하위 등)의 결과로 새 다항식을 생성하는 루프를 구현할 수 있습니까? –

+0

@VinicioStevenFloresHernndez, 다시 질문이 너무 광범위합니다. 공유 할 코드가 있고 예상대로 작동하지 않는 것에 대해 토론하거나 더 구체적인 질문을하는 것이 더 좋습니다. 현재의 질문/답변조차도 SO 문제 해결에 대한 SO 커뮤니티 정책을 훨씬 뛰어 넘습니다. SO는 특정 문제를 해결하기위한 것이기 때문에 교과서가 아니라 숙제 솔루션 센터가 아니며 본격적인 교육 서비스가 아닙니다. –