C++實(shí)現(xiàn)計(jì)算器功能
本文實(shí)例為大家分享了C++實(shí)現(xiàn)計(jì)算器功能的具體代碼,供大家參考,具體內(nèi)容如下
說明:
前面簡(jiǎn)單嘗試過計(jì)算器,只能支持加減乘除,這次完善了計(jì)算器的功能:
支持帶括號(hào)的表達(dá)式;
支持±*/ (加減乘除)基本運(yùn)算;
支持^(指數(shù))運(yùn)算;
支持取負(fù)號(hào)運(yùn)算(-num);
支持階乘!。
輸入格式及結(jié)果:
括號(hào)和基本運(yùn)算:

指數(shù)運(yùn)算:

取負(fù)和混合運(yùn)算:

階乘:

代碼:
//支持帶括號(hào)的表達(dá)式,支持+-*/、^(指數(shù))、取負(fù)、!(階乘)
#include <iostream>
#include <stack>
#include <math.h>
using namespace std;
double inStack(); ? //核心函數(shù),將操作符有序的入棧計(jì)算, 最后返回結(jié)果
void calculate(stack<char>& Ope, stack<double>& Num); ?//用來計(jì)算加減乘除, 結(jié)果放在數(shù)字棧頂
void factorial(stack<double>& Num); ? //用來計(jì)算階乘
int priority(char ope_); ? //用來計(jì)算操作符的優(yōu)先級(jí)
int main() {
?? ?double result; ? //最后的結(jié)果
?? ?cout << "請(qǐng)輸入:\n";
?? ?result = inStack(); ? //將緩沖區(qū)的操作符和數(shù)字壓入棧?
?? ?cout << "結(jié)果是:\n" << result;
?? ?return 0;
}
double inStack() {
?? ?stack<char> Ope;
?? ?stack<double> Num;
?? ?char ope_;
?? ?double num_;
?? ?while (1) {
?? ??? ?if (cin.peek() >= '0' && cin.peek() <= '9') { ?//判斷下一個(gè)是否是數(shù)字
?? ??? ??? ?cin >> num_;
?? ??? ??? ?Num.push(num_); ? //數(shù)字直接入棧
?? ??? ?}
?? ??? ?else {
?? ??? ??? ?cin >> ope_;
?? ??? ??? ?if (ope_ == '=') {
?? ??? ??? ??? ?while (!Ope.empty()) calculate(Ope, Num); //如果符號(hào)棧不空,就一直計(jì)算
?? ??? ??? ??? ?return Num.top(); ?//如果是等號(hào)且符號(hào)棧頂為空,就返回?cái)?shù)字棧頂元素
?? ??? ??? ?}
?? ??? ??? ?else if (ope_ == '!') factorial(Num); ?//如果是!就階乘
?? ??? ??? ?else if (ope_ == '(' ||Ope.empty()) Ope.push(ope_); ? ?//如果符號(hào)是左括號(hào)或符號(hào)棧為空直接壓入
?? ??? ??? ?else if (ope_ == ')') { ?//如果是右括號(hào)
?? ??? ??? ??? ?while (Ope.top() != '(') calculate(Ope, Num); //一直計(jì)算完括號(hào)里的
?? ??? ??? ??? ?Ope.pop(); ?//左括號(hào)出棧
?? ??? ??? ?}
?? ??? ??? ?else if (priority(Ope.top()) >= priority(ope_)) { ?//如果棧頂符號(hào)的優(yōu)先級(jí)大于等于當(dāng)前
?? ??? ??? ??? ?calculate(Ope, Num); ? //計(jì)算結(jié)果壓入數(shù)字棧,取出當(dāng)前棧頂
?? ??? ??? ??? ?Ope.push(ope_); ?//壓入當(dāng)前符號(hào)
?? ??? ??? ?}
?? ??? ??? ?else Ope.push(ope_); ?//否則就壓入符號(hào)棧
?? ??? ?}
?? ?}
}
void calculate(stack<char>& Ope, stack<double>& Num) {
?? ?double a, b;
?? ?if (Ope.top() == '-') {
?? ??? ?a = Num.top(); Num.pop();
?? ??? ?Ope.pop(); ? //取出負(fù)號(hào)
?? ??? ?Num.push(-a); ?//壓入負(fù)值
?? ??? ?if (!Num.empty()) {
?? ??? ??? ?if(Ope.empty() || Ope.top() != '(')
?? ??? ??? ??? ?Ope.push('+'); ?//如果前面還有數(shù)字,就壓入+,即變成加負(fù)值
?? ??? ?}
?? ?}
?? ?else {
?? ??? ?a = Num.top(); Num.pop();
?? ??? ?b = Num.top(); Num.pop();
?? ??? ?if (Ope.top() == '+') Num.push(b + a);
?? ??? ?else if (Ope.top() == '*') Num.push(b * a);
?? ??? ?else if (Ope.top() == '/') Num.push(b / a);
?? ??? ?else if (Ope.top() == '^') Num.push(pow(b, a));
?? ??? ?Ope.pop();
?? ?}
}
void factorial(stack<double>& Num) {
?? ?int a = static_cast<int>(Num.top());
?? ?int result=1;
?? ?for (int i = 1; i <= a; i++) result *= i;
?? ?Num.push(static_cast<double>(result));
}
int priority(char ope_) {
?? ?if (ope_ == '(') return 0;
?? ?else if (ope_ == '+' || ope_ == '-') return 1;
?? ?else if (ope_ == '*' || ope_ == '/') return 2;
?? ?else if (ope_ == '^') return 3;
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- c++編寫簡(jiǎn)單的計(jì)算器程序
- 簡(jiǎn)單實(shí)現(xiàn)C++復(fù)數(shù)計(jì)算器
- C/C++實(shí)現(xiàn)日期計(jì)算器的示例代碼
- C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序
- C/C++經(jīng)典實(shí)例之模擬計(jì)算器示例代碼
- C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
- C++實(shí)現(xiàn)四則混合運(yùn)算計(jì)算器
- C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器
- 基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)哈希表詳解
C++標(biāo)準(zhǔn)庫(kù)中使用的unordered_map底層實(shí)現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關(guān)于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下2022-07-07
CreateCompatibleDC()函數(shù)案例詳解
這篇文章主要介紹了CreateCompatibleDC()函數(shù)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C語言詳解實(shí)現(xiàn)猜數(shù)字游戲步驟
猜數(shù)字是興起于英國(guó)的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來實(shí)現(xiàn)這個(gè)游戲案例2022-07-07
簡(jiǎn)單談?wù)凜++ 頭文件系列之(bitset)
我們要使用bitset,首先需要包含頭文件bitset。和vector對(duì)象不一樣的是bitset類型對(duì)象的區(qū)別僅在其長(zhǎng)度而不在其類型。在定義bitset的時(shí)候,要明確bitset包含了多少位,須在尖括號(hào)內(nèi)給出它的長(zhǎng)度值。長(zhǎng)度值必須定義為整形字面值常量或是已用常量值初始化的整型的const對(duì)象2017-02-02

