C++實(shí)現(xiàn)計(jì)算器功能
本文實(shí)例為大家分享了C++實(shí)現(xiàn)計(jì)算器功能的具體代碼,供大家參考,具體內(nèi)容如下
說明:
前面簡單嘗試過計(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; }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- c++編寫簡單的計(jì)算器程序
- 簡單實(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)簡單計(jì)算器
- C++實(shí)現(xiàn)四則混合運(yùn)算計(jì)算器
- C++實(shí)現(xiàn)簡單計(jì)算器功能
- C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器
- 基于C++實(shí)現(xiàn)簡單日期計(jì)算器
相關(guān)文章
Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫請(qǐng)求
這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫請(qǐng)求的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03通過先序遍歷和中序遍歷后的序列還原二叉樹(實(shí)現(xiàn)方法)
下面小編就為大家?guī)硪黄ㄟ^先序遍歷和中序遍歷后的序列還原二叉樹(實(shí)現(xiàn)方法)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06c++ 一個(gè)二進(jìn)制串轉(zhuǎn)化為整數(shù)的解決方法
以下是將一個(gè)二進(jìn)制串轉(zhuǎn)化為整數(shù)的實(shí)例。需要的朋友參考下2013-05-05C++運(yùn)算符重載實(shí)例代碼詳解(調(diào)試環(huán)境 Visual Studio 2019)
這篇文章主要介紹了C++運(yùn)算符重載實(shí)例(調(diào)試環(huán)境 Visual Studio 2019),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03