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 파일 을 새로 만 든 다음 컨트롤 을 끌 어 당 기 는 방식 으로 그 리 는 것 입 니 다 (멘 붕). 기본 적 인 사 고 는 다음 과 같 습 니 다.
우리 의 주 창 클래스 는 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 클래스 에서 두 명의 개인 구성원 을 정의 해 야 합 니 다.
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 위탁 관리 주소 (코드 가 비정 기적 으로 업 데 이 트 됩 니 다. 주목 하 세 요) ==|
=======================================================
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.