2017-11-25 11 views
2

에 문제가 발생했습니다. 내 코드에 규칙이 적용됩니다. 배열이 2 개 있습니다. 행렬의 배열 (최대 100 개의 행렬)과 연산의 배열 (최대 99 개의 연산). 연산은 행렬의 더하기, 빼기 및 곱하기 (+ - *로 표시)입니다.수학 연산의 연산 순서에 대한 알고리즘

내 행렬은 구조체이지만 그저 세부 사항입니다. 나는 그들에 관한 모든 것을 위해 일하는 기능을 가지고있다.

또한 작업을 실행하는 기능이 있습니다.

struct Matrix compute(struct Matrix mat1, struct Matrix mat2, char op) 

이 기능에는 스위치가있어 작동을 결정하고 올바른 것을 실행합니다.

내가 개선해야하는 코드는이 코드입니다. 순간

// counter = number of matrices in the array 
// therefore there's also counter-1 operations 

struct Matrix temp = compute(matrices[0], matrices[1], operations[0]); 
for(int j = 1; j < counter; ++j) 
{ 
    temp = compute(temp, matrices[j+1], operations[j]); 
} 
get_matrix(temp); //outputs the matrix to stdout 

이 코드 (입력이 정확하고 동작이 실행될 수있는 가정하여) 승산을 포함하지 않는 행렬과 연산 정확하게 모든 시퀀스를 평가한다.

무엇이 필요합니까? 나는 올바른 방향으로 엉덩이를 걷어차 야합니다.

+0

피연산자가 행렬 인 표현식에 연산 순서를 적용 할 방법이 필요하다는 말입니까? 그리고 현재 그것은 곱셈에 실패합니다. 피연산자가 숫자 인 경우 '1 + 2 + 4 * 0'은'0 '으로 평가됩니다. – Miket25

+0

@ Miket25 그래, 그게 내가 말하는거야. 또한 명백하게이 코드 부분 (행렬은 동적으로 할당 됨)에 메모리 누수가 있습니다. Im이 표시된 코드 아래에서 임시 행렬을 단지 2 행만큼 자유롭게 만듭니다. 하지만 나중에 해결할 수있는 문제입니다. – Welsy

+0

연구 건물 ** 추상 구문 트리 **. 이 트리 내의 노드는 행렬 및 피연산자가됩니다. 그런 다음이 트리를 반복적으로 evaulate하면 ​​작업 순서가 정해집니다. 나는 ** 재귀 파싱 **을 추천한다. 그것은 배우기 쉽습니다. 재귀 적 파생 구문 분석을 통해 연산 계산기의 순서에 대해 온라인으로 좋은 예제를 온라인으로 작성하고이를이 문제에 적용 할 수 있습니다. – Miket25

답변

2

한 가지 간단한 접근법은 행렬 시퀀스를 한 번 살펴보고 곱셈 만 실행하는 것입니다. 곱셈이 적용된 후 행렬로 구성된 새로운 시퀀스를 만듭니다. 예를 들어, 초기 시퀀스는 다음과 같이 보일 것이다 곱셈을 처리 한 후이

|A| * |B| + |C| * |D| * |E| - |F| + |G| * |H| 

순서 같은 경우 :

|A*B| + |C*D*E| - |F| + |G*H| 

이 문제에 당신을 데려 순서에서 모든 곱셈을 제거 할 것이다 당신을 이미 해결 방법을 알고 있습니다.

참고 : 코드는 off-by-one 오류가 있습니다 jcounter, matrices[j+1] 참조 matrices[] 배열의 끝에 과거의 요소 중 하나 같을 때.

루프 내에서 j+1 < counter을 확인하여이 문제를 해결할 수 있습니다. 또 다른 접근법은 바운드를 벗어나는 초기 동작을 수행하는 대신 을 temp으로 복사하는 것입니다. 이 방법을 사용하면 j을 0에서 시작하여 코드가 단일 행렬의 "축퇴"경우에도 작동하는지 확인할 수 있습니다.

+0

감사합니다. 첫 번째 메모리 솔루션이 트릭을 만들었으므로 더 이상 메모리 누수가 없으므로 원래의 문제 만 남아 있습니다 - 작업 순서 : – Welsy

+0

- 그건 영리한 생각입니다. 어떻게 생각하지 않았습니까? 위에서 제안한 솔루션을 연구하기 전에 먼저이를 구현하려고합니다. – Welsy

+0

@Welsy 괄호가있는 경우 추상 구문 트리가 필요합니다. 귀하의 사례가 매우 간단하므로, 단순한 다중 우선 솔루션이 효과적입니다. – dasblinkenlight