Qt 계산기 간단한듯 복잡하네요 고수형들 봐주세요 ㅠㅠ

bigdaddy2001의 이미지

QStringList strListPlus = strBuf.split("+");
        double numsP[256] = {0x00, };
        double numsM[256] = {0x00, };
        double result = 0;
        int countP = 0;
        int countM = 0;
 
        for(int n=0; n<strListPlus.count(); n++)
        {
            QString temp1 = strListPlus.at(n);
            QStringList strListMinus = temp1.split("-");
 
            countP = 0;
            for(int nn=0; nn<strListMinus.count(); nn++)
            {
                QString temp2 = strListMinus.at(nn);
                numsP[countP++] = temp2.toDouble();
            }
 
            if(countP == 0)
            {
                numsM[countM] = temp1.toDouble();
            }
            else
            {
                for(int nn=0; nn<countP; nn++)
                {
                    if(nn == 0)
                    {
                        numsM[countM] = numsP[nn];
                    }
                    else
                    {
                        numsM[countM] -= numsP[nn];
                    }
                }
            }
 
            countM++;
        }
 
        for(int n=0; n<countM; n++)
        {
            result += numsM[n];
        }
 
        strBuf.sprintf("%.2f", result);
 
    }

숫자 입력 부분은 문제가 없구요 여기서 4칙연산 다하려니까 ㅠ_ㅠ ..

+ - 는되요.... 또 따로 * / 도 아주조금만바꾸면되는데 4칙연삭 다하려니까 멘붕... ㅠㅠ

( ) 괄호가 없다치구 7*8+6/8-3 요론거 하기가 힘드네요 .. 멘붕이왓어.. ㅠㅠ

도와주세용~ ㅋ

chadr의 이미지

멘붕이 왔어? 토닥토닥 그러면서 배우는거야 걱정하지마.

형이 왔으니 해결할수 있을거야.

형이 어떻게 하는지 힌트줄게.

계산기 구현은 스택이라는걸 이용해봐. 우리가 사용하는 계산식은 연산자가 피연산자들의 가운데 오는 중위 표기법이라는걸 써.

우리가 어렸을때부터 중위표기법을 써오고 그걸로 배워와서 익숙하지?

그런데 생각해봐. 중위표기법은 정말 계산하는데 복잡해.

연산자 우선순위는 그렇다 쳐도 가운데 괄호가 있으면 괄호부터 찾아들어가서 해야하잖아?

그런데 중위표기법이라는거 말고 전위표기법 후위표기법이라는게 있어.

그걸 이용해봐. 그러면 신세계가 열릴거야.

이때 전위 또는 후위 표기법이라는 것을 이용해서 계산을 할때 스택이라는걸 이용하면 무지 쉽게 할수 있어.

일단 전위, 중위, 후위 표기법들에 대해서 공부를 해보고 어차피 계산기 프로그램에 사람들한테 전위, 후위 표기법으로
수식을 입력하라고 하면 화낼거야. 따라서 사람들이 입력한 중위 표기법을 전위 또는 후위 표기법으로 바꾸는 방법을 공부해봐.

그리고나서 전위, 후위 표기법으로 바꾼걸 실제 계산할 때 스택이라는 것을 어떻게 이용하는지와 스택이 뭔지에 대해서 공부해봐.

그렇게 하면 풀릴거야.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

snotice의 이미지

가장 멋지고 적절한 답글을 본 것 같습니다. ㅎㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.