2016-10-21 2 views
0

C#에서 배열로 간단한 계산기를 만들려고합니다. 첫째로 나는 두 개의 정수와 한 개의 연산자 만 사용하여 만들었고 잘 작동했다. 이제는 사용자가 원하는만큼 표현을 할 수 있도록하기 위해 노력하고 있습니다. 예를 들어 단 하나의 연산자와 두 개의 정수 만 포함하는 단순한 9 + 8 대신 7 * 7 + 1/50을 사용할 수 있습니다. 문제는 여러 개의 숫자와 연산자로 긴 표현식을 입력 할 때마다 첫 번째 연산자로 처음 2 개의 숫자 만 계산한다는 것입니다. 이 문제에 대한 좋은 해결책은 무엇입니까? 미리 감사드립니다.C#에서 배열로 간단한 계산기 만들기

static void Main() 
    { 
     while (true) 
     { 
      Console.WriteLine("Write an expression with two numbers and an operator with space in-between, for example, 4 + 2"); 
      string expression; 
      string[] array; 
      string[] array1; 
      expression = Console.ReadLine(); 
      array = expression.Split(); 
      array1 = Calculation(array); 
      Console.WriteLine("Press ENTER to write a new expression."); 
      Console.ReadLine(); 
      Console.Clear(); 
     } 

    } 
    static string[] Calculation(string[] arr) 
    { 
     double numLeft= 0.0; 
     double numRight = 0.0; 
     string sign = ""; 
     double result = 0.0; 
     int index = 1; 

     while (true) 
     { 
      numLeft = Convert.ToDouble(arr[0]); 
      sign = Convert.ToString(arr[index]); 
      numRight = Convert.ToDouble(arr[index + 1]); 
      index = index + 2; 
      if (sign == "+") 
      { 
       Console.Clear(); 
       Console.WriteLine(); 
       result= result + numLeft; 
      } 
      else if (sign == "-") 
      { 
       Console.Clear(); 
       result = result + numLeft; 
       numLeft = 0 - numRight; 
      } 
      else if (sign == "*") 
      { 
       Console.Clear(); 
       numLeft = numLeft * numRight; 
      } 
      else if (sign == "/") 
      { 
       Console.Clear(); 
       numLeft = numLeft/numRight; 
      } 
      else 
      { 
       break; 
      } 
      result = result + numLeft; 
      Console.WriteLine("Answer: {0}", result); 
      return arr; 
     } 
     return arr; 
    } 
+0

어떻게 다른 우선 순위 연산자를 처리합니까? '/'와'*'는'+'와'-'보다 우선 순위가 높습니다. 복잡한 표현을 구현하는 것은 그리 쉬운 일이 아니며 따라서 SO에 관한 한 가지 질문에 너무 광범위합니다. – HimBromBeere

+0

@HimBromBeere 솔직히 말해서 나는 그것에 대해 실제로 생각해 보지 못했지만이 시점에서 나는 그것에 대한 해결책을 찾지 못했다. –

답변

2

"while true"의 끝에 배열을 반환하므로 첫 번째 2 만 계산됩니다.

또한 올바르지 않습니다. 예 : 2 + 3 * 4 = 14, 계산기가 계산하지 않는 20이 아닙니다.

0

어때?

작업 문자열을 조각으로 나눠서 목록을 채 웁니다.

7 * 7 + 1/50 => [7] [*] [7] [+] [1] [/] [50]

그럼 목록을 이동 * 및/동작들을 해결 . 연산자 중 하나가 발생하면 연산자 요소, 그 전에있는 요소 및 그 이후의 요소를 제거하고 결과와 바꾸십시오. 목록 길이가 변경된다는 점에 유의하십시오.

제 반복 => [49] [+] [1] [/] [50] 번째 반복 => [49] + [0.02]

이어서 +와 동일한 작업을 수행 - 연산자 첫 번째 반복 => [49.02]

목록에 하나의 요소 만 남았을 때 그 결과입니다. 간단한 계산을 위해

+0

배열을 사용하는 경우 배열 크기가 변경되지 않기 때문에 정확히 수행 할 수 없습니다. 하지만 그 외에는. – Noctis

+0

@Noctis 네 말이 맞아, 나는 읽기 쉽도록이 [] [] []처럼 썼다. 그는 List <> 또는 뭔가 (또는 매번 nea 배열을 빌드 할 수 있습니다.) – Lidaranis

+0

새로운 배열을 짓는 것은 낭비가 될 것입니다 (아마 손에 문제는 중요하지 않지만, 습관 :). 주위에 많은 옵션이 있습니다. 그는 그것이 작동하지 않는 이유를 물었고, 나는 그에게 이유를주었습니다 :) – Noctis

0

가 그물에 방법이 존재합니다

public static int Compute(string operation) 
{ 
    return new DataTable().Compute("7 * 7 + 1/50", null); 
} 

출처 : C# Math calculator

당신이 정말이 구현하려면 내가 재귀 이진 트리 알고리즘을 제안했다.

의사 코드 : 장소에 1. 분할 들어오는 문자열 *이 수학 연산 기호이며,이 트리를 이진 트리 2.에 설정하고 더 큰 우선 순위를 (이 작업을 해결 + 앞에 오는) 3. 재귀는 두 개의 자식 리프 값을 반환해야하며, 주 프로그램에 하나의 값만 나타날 때까지 계속됩니다.