입력받은 연산자와 피연산자는 배열에 들어있습니다.
연산자는 +, * 밖에 없습니다.
예) 1+2*3+4+5*6*7 이런식으로 입력이 들어왔을때
덧셈을 먼저 하고 곱셈을 나중에 하게 하려면 어떤 방법으로 프로그래밍 해야 할까요?
그럼, 곱셈을 먼저하고 덧셈을 나중에 하도록 하실 수는 있는 건가요?
Orion Project : http://orionids.org
둘다 구현하는 방법을 알고 싶습니다.
손으로 계산하는것 만큼 간단하지 않네요.
아니면 yacc 류의 파서 생성 프로그램이나 파서 관련 라이브러리들을 뒤져 보면 표준적인 예제로 아마 나와 있을 겁니다.
임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
네이버 검색해도 수많이 나올겁니다. 계산기 C++ <- 이정도로만 해도 수없이 나오네요. 하나 받아서 분석해 보세요~ 후위 표기식 등을 이해하시면 구현이 가능해 집니다.
위의 알고리즘 없이 파이썬으로 풀면 .. reduce(lambda x, y: x*y, map(lambda x: eval(x), '1+2*3+4+5*6*7'.split('*'))) 이렇게 가능하겠네요.
*를 기호로 쓴게 아니라 split 기준으로 쓰시다니 ㅋㅋㅋ
:) ------------------------------------------------------ 팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??
------------------------------------------------------ 팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??
The C++ Programming Language책 6단원에 보면 간단한 command-line 계산기 예제가 있습니다. 역시 권위있는 책은 다르더군요=_=; --- “내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)
--- “내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)
간단하게 2차원 배열을 쓰면 어떨까요..
1 + 2는 [0][x] 3 + 4 + 5 [1][x] ...
*을 만날때마다 행을 하난씩 증가하는겁니다. 각각의 낱개 배열을 먼저 더하고 최종적으로 곱하기를 수행하면되겠지요..
곱셈은 반대로하면되겠네요~ 곱셈을 만날때마다 열을 늘리고 덧셈을 만나면 행을 늘리는 식으로^^
간단하게... 배열에 이것들을 모두 넣습니다.
1 + 2 * 3 + 4 + 5 * 6 * 7
+를 찾아서, 근처 요소를 더한 값으로 치환하고 근처 요소를 없앱니다.
3 * 3 + 4 + 5 * 6 * 7
계속 반복합니다.
3 * 7 + 5 * 6 * 7
3 * 12 * 6 * 7
+가 남지 않으면 *를 찾아서 똑같은 일을 합니다. ... 중위 표기법 parsing에는 이만한 방법이 없던데요? 이 방법에서는 괄호를 찾으면 재귀 호출합니다.
Real programmers /* don't */ comment their code. If it was hard to write, it should be /* hard to */ read.
*를 먼저 처리, 그다음 +....
난독증이라... 죄송합니다;
바이너리 트리를 이용합니다.
parent에는 연산자가,(여기서는 *이나 +가 되겠습니다) left와 right에는 그 연산자 기준으로 왼쪽 식과 오른쪽 식이 들어갑니다.
이를 잘 이용하면 한 번의 루프 만에 우선순위가 알려져 있는 연산자가 들어간 모든식을 계산할 수 있습니다. ---------------- agidari.wordpress.com
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
그럼, 곱셈을
그럼, 곱셈을 먼저하고 덧셈을 나중에 하도록 하실 수는 있는 건가요?
Orion Project : http://orionids.org
사실 그것도 궁금합니다.
둘다 구현하는 방법을 알고 싶습니다.
손으로 계산하는것 만큼 간단하지 않네요.
오토마타나 컴파일러 관련 과목 교과서에 잘 나와 있습니다
아니면 yacc 류의 파서 생성 프로그램이나 파서 관련 라이브러리들을 뒤져 보면 표준적인 예제로 아마 나와 있을 겁니다.
임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
알고리즘 책에 보통 나오죠.
네이버 검색해도 수많이 나올겁니다.
계산기 C++ <- 이정도로만 해도 수없이 나오네요.
하나 받아서 분석해 보세요~
후위 표기식 등을 이해하시면 구현이 가능해 집니다.
위의 알고리즘 없이 파이썬으로 풀면 ..
reduce(lambda x, y: x*y, map(lambda x: eval(x), '1+2*3+4+5*6*7'.split('*')))
이렇게 가능하겠네요.
아 이거 재미있네요 ㅋㅋ
*를 기호로 쓴게 아니라 split 기준으로 쓰시다니 ㅋㅋㅋ
:)
------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??
------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??
The C++ Programming Language책 6단원에 다루고 있는 내용입니다.
The C++ Programming Language책 6단원에 보면 간단한 command-line 계산기 예제가 있습니다. 역시 권위있는 책은 다르더군요=_=;
---
“내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)
---
“내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)
자료구조가 배열이라면...
간단하게 2차원 배열을 쓰면 어떨까요..
1 + 2는 [0][x]
3 + 4 + 5 [1][x]
...
*을 만날때마다 행을 하난씩 증가하는겁니다.
각각의 낱개 배열을 먼저 더하고 최종적으로 곱하기를 수행하면되겠지요..
곱셈은 반대로하면되겠네요~
곱셈을 만날때마다 열을 늘리고 덧셈을 만나면 행을 늘리는 식으로^^
간단하게... 배열에
간단하게...
배열에 이것들을 모두 넣습니다.
1 + 2 * 3 + 4 + 5 * 6 * 7
+를 찾아서, 근처 요소를 더한 값으로 치환하고 근처 요소를 없앱니다.
3 * 3 + 4 + 5 * 6 * 7
계속 반복합니다.
3 * 7 + 5 * 6 * 7
3 * 12 * 6 * 7
+가 남지 않으면 *를 찾아서 똑같은 일을 합니다.
... 중위 표기법 parsing에는 이만한 방법이 없던데요?
이 방법에서는 괄호를 찾으면 재귀 호출합니다.
한말글 프로그래밍 언어 "열정" http://me-lang.wo.tc
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
거꾸로 아닌가요
*를 먼저 처리, 그다음 +....
아... 덧셈이 먼저군요
난독증이라... 죄송합니다;
...
바이너리 트리를 이용합니다.
parent에는 연산자가,(여기서는 *이나 +가 되겠습니다)
left와 right에는 그 연산자 기준으로 왼쪽 식과 오른쪽 식이 들어갑니다.
이를 잘 이용하면 한 번의 루프 만에 우선순위가 알려져 있는 연산자가 들어간 모든식을 계산할 수 있습니다.
----------------
agidari.wordpress.com
댓글 달기