Qt 계산기 개발 (1): 접미사 표현 식 은 완전한 수학 표현 식 의 계산 을 실현 합 니 다.

머리말
데이터 구 조 를 배 운 사람 은 접미사 표현 식 을 들 어 본 적 이 있다 고 믿 습 니 다. 바로 스 택 을 배 울 때 입 니 다.많은 사람들 이 이 알고리즘 을 실 현 했 을 수도 있 지만 기본적으로 콘 솔 창 에서 도 사용 된다.다 들 계산기 windows 에 있 는 calc 를 사용 해 보 셨 을 거 라 고 믿 습 니 다.그러나 표현 식 을 한 번 에 계산 할 수 없 는 한 걸음 으로 만 계산 할 수 있 는 것 을 발견 하지 못 했다.접미사 표현 식 은 한 번 에 전체 식 을 계산 할 수 있 습 니 다.과학 기술 은 생산 을 위해 서 비 스 를 제공 해 야 하기 때문에 나 는 실제 적 으로 접미사 표현 식 에 따라 도형 화 된 인터페이스 가 있 는 계산 기 를 만 들 었 다.
접미사 표현 식 이 무엇 입 니까?
접미사 표현 식 은 역 폴란드 식 이 라 고도 부 르 며 수학 표현 식 을 간소화 하 는 데 사용 되 며 계산기 류 소프트웨어 개발 의 중요 한 이론 적 근거 이다.이 부분 에는 두 가지 요점 이 있다.
  • 접미사 표현 식 접미사 표현 식
  • 접미사 표현 식 의 계산
  • 접미사 식 접미사 식
    정상 적 인 수학 표현 식 은 접미사 표현 식 으로 문자열 로 이 표현 식 을 저장 할 것 이 라 고 가정 합 니 다.연산 자 스 택 op 을 설정 하고 문자 '\ 0' 을 스 택 에 넣 고 결 과 를 저장 하 는 문자열 (문자 배열) suffix 를 설정 합 니 다.그리고 접두사 표현 식 을 순서대로 스 캔 합 니 다. 숫자 문자 라면 suffix 에 직접 추가 합 니 다. 연산 자 + - * / 이면.연산 자 스 택 op 의 스 택 꼭대기 요소 와 비교 하여 스 택 꼭대기 연산 자 보다 등급 이 높 으 면 스 택 에 들 어 갑 니 다.그렇지 않 으 면 스 택 꼭대기 요 소 를 종료 하고 suffix 에 가입 한 다음 에 이전 작업 을 반복 하여 스 택 꼭대기 보다 높 은 단계 에서 스 택 에 들 어 갈 때 까지 계속 비교 합 니 다.
    그 중 기호의 우선 순위:
    #

    * 、/
    +、-
    0
    0
    1
    2
    그 중에서 왼쪽 괄호 는 특수 합 니 다. 왼쪽 괄호 라면 op 에 직접 들 어 갑 니 다. 비교 할 필요 가 없습니다. 스 택 에 들 어간 후 왼쪽 괄호 는 최소 우선 순위 에 사 용 됩 니 다. 이것 은 새로운 수학 식 의 시작 으로 이해 할 수 있 습 니 다. 오른쪽 괄호 라면 연산 자 스 택 은 왼쪽 괄호 에서 물 러 날 때 까지 계속 물 러 갑 니 다. 접미사 표현 식 을 스 캔 한 후, op 스 택 의 요 소 를 순서대로 suffix 에 추가 합 니 다.중 (\ # 제외). 각 숫자 에 빈 칸 을 추가 하여 서로 인접 한 숫자 에 다른 뜻 이 생기 지 않도록 주의해 야 합 니 다.
    접미사 식 계산
    더 블 형식의 데 이 터 를 저장 할 새로운 스 택 S 를 설정 합 니 다. 왼쪽 에서 오른쪽으로 suffix 문자열 을 스 캔 하고 스페이스 바 를 만나면 앞 에 있 는 숫자 문 자 를 모두 해당 하 는 double 형 숫자 로 변환 한 다음 스 택 S 에 눌 러 넣 습 니 다. 조작 자 를 만나면 스 택 S 를 두 번 연속 으로 스 택 에서 나 온 다음 이 연산 자 를 결합 하여 해당 하 는 계산 을 한 다음 결 과 를 스 택 S 에 눌 러 넣 습 니 다. suffix 문 자 를 스 캔 할 때 까지.꼬치, 그러면 스 택 S 의 스 택 꼭대기 요 소 는 결과 입 니 다.
    이론 을 이렇게 많이 말 했 으 니 모두 가 문자 만 보고 이해 하기 어 려 울 것 이 라 고 믿 습 니 다. 그래서 우 리 는 실전 부분 에 들 어 갑 니 다.
    Qt 실전
    그래 픽 인터페이스 에 대한 그리 기 는 이 부분 이 본문의 중점 이 아니 므 로 소개 하지 않 습 니 다. 가장 쉬 운 방법 은 Qt 의 ui 파일 을 새로 만 든 다음 컨트롤 을 끌 어 당 기 는 방식 으로 그 리 는 것 입 니 다 (멘 붕). 기본 적 인 사 고 는 다음 과 같 습 니 다.
  • 숫자 키, 연산 자 (+ - * /) 또는 좌우 괄호 를 누 른 다음 계산기 화면 에 표시 할 수 있 습 니 다.
  • 당신 이 같은 번 호 를 누 를 때 계산 을 시작 합 니 다.
  • 계산기 디 스 플레이 (QLneEdit 로 구현) 에서 문자열 QString 을 가 져 옵 니 다.
  • 가 져 온 접미사 열 을 접미사 열 로 바 꿉 니 다
  • 접미사 꼬치 에서 결 과 를 계산 하고 계산기 디 스 플레이 에 표시 합 니 다.
  • 접미사
    우리 의 주 창 클래스 는 MainWindow 입 니 다. 그 중 에 Public 함 수 를 추가 합 니 다: toPostfix ()  이 함수 에서 우 리 는 먼저 입력 한 표현 식 문자열 을 가 져 와 야 합 니 다.
    QString exp = ui->lineEdit->text();

    이 곳 의 lineEdit 은 바로 우리 계산기 의 디 스 플레이 대상 지침 입 니 다. 텍스트 방법 은 표 시 된 텍스트 를 되 돌려 줍 니 다. 그리고 연산 자의 우선 순 위 를 비교 하기 위해 함수 getLevel 을 다시 정의 해 야 합 니 다.
    int MainWindow::getLevel(const QChar &oper)
    {
        switch(oper.cell())
        {
        case '#':
        case '(':return 0;
        case '+':
        case '-':return 1;
        case '*':
        case '/':return 2;
        }
        return 0;
    }

    QChar 형식 은 당연히 switch 에 직접 넣 을 수 없습니다. cell 방법 은 일반 char 형식 으로 돌아 갑 니 다. MainWindow 클래스 에서 두 명의 개인 구성원 을 정의 해 야 합 니 다.
  • 하나의 스 택 에서 opStack 을 연산 자 스 택 으로 사용 합 니 다. QStack qt 의 스 택 유형 은 일치 성 을 유지 하고 문 제 를 피하 기 위해 서 입 니 다. 우 리 는 C + + STL 의 Stack 을 사용 하지 않 는 것 이 좋 습 니 다. 다행히도 그들의 방법 명 은 대부분 같 습 니 다.
  • 변 환 된 접미사 표현 식 을 받 아들 이 는 문자열 postfix 입 니 다. QString 형식 입 니 다.
  • 마지막 toPostfix 함 수 는:
    void MainWindow::toPostfix()
    {
        QString exp = ui->lineEdit->text();
    
        for(int i=0;i<exp.length();i++)
        {
            if(exp[i].isDigit()||exp[i]=='.')
            {
                postfix.push_back(exp[i]);
            }
            else if(exp[i]=='(')
            {
                opStack.push(exp[i]);
            }
            else if(exp[i]==')')
            {
                postfix.push_back(' ');//      
                while(opStack.top()!='(')
                {
                    postfix.push_back(opStack.pop());
                }
                opStack.pop();
            }
            else if(getLevel(exp[i])>getLevel(opStack.top()))
            {
                postfix.push_back(' ');
                opStack.push(exp[i]);
            }
            else
            {
                postfix.push_back(' ');qDebug()<<postfix;
                while(getLevel(exp[i])<=getLevel(opStack.top()))
                    postfix.push_back(opStack.pop());
                opStack.push(exp[i]);
            }
        }
        while(opStack.top()!='#')
        {
            QChar c = opStack.pop();
            postfix.push_back(' ');
            postfix.push_back(c);
        }
    }

    접미사 식 계산 실현
    계산 에 사용 할 함수 evaluation 을 정의 합 니 다. 모든 연산 결 과 를 저장 하기 위해 double 형식의 스 택 을 새로 만 듭 니 다. 접미사 표현 식 의 숫자 를 저장 하 는 임시 문자열 입 니 다.
    QString tem;
    QStack<double> ans;
    QString 류 는 문자열 과 기본 데이터 형식 간 의 변환 을 편리 하 게 할 수 있 습 니 다. 예 를 들 어
    tem.toDouble()
    또한 문자열 도 용기 이기 때문에 문자열 을 비우 기 위해 clear 방법 을 지원 합 니 다. double 형식의 데 이 터 를 얻 을 수 있 습 니 다. 편리 하지 않 습 니까? 마지막 evaluation 함 수 는:
    void MainWindow::evaluation()
    {
        QString tem;
        QStack<double> ans;
        for(int i=0;i<postfix.size();i++)
        {
            if(postfix[i].isDigit()||postfix[i]=='.')
                tem.push_back(postfix[i]);
            else if(postfix[i]==' ')
            {
                if(!tem.isEmpty())
                {
                    ans.push(tem.toDouble());
                    tem.clear();//       。
                }
            }
            else
            {
                double a,b;
                a=ans.pop();
                b=ans.pop();
                switch(postfix[i].cell())
                {
                case '+':ans.push(b+a);break;
                case '-':ans.push(b-a);break;//  a,b  
                case '*':ans.push(b*a);break;
                case '/':ans.push(b/a);break;//  a,b  
                }
            }
    
        }
        //         
        ui->lineEdit->setText(QString::number(ans.top()));
    }

    = = = = = = = = = = = = = = = = 본 프로젝트 글 및 원본 링크 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
    | = = Qt 계산기 개발 (1): 접미사 표현 식 은 완전한 수학 표현 식 의 계산 을 실현 합 니 다 = |
    | = = Qt 계산기 개발 (2): 신호 슬롯 수학 식 합 법성 검사        ==|
    | = = Qt 계산기 개발 (3): 실행 효과 및 프로젝트 요약                      ==|
    | = = Qt 계산기 원본 다운로드 (포인트 면제)                                                  ==|
    | = = Qt 계산기 GitHub 위탁 관리 주소 (코드 가 비정 기적 으로 업 데 이 트 됩 니 다. 주목 하 세 요)      ==|
    =======================================================

    좋은 웹페이지 즐겨찾기