当前位置: 首页 > news >正文

C++实现计算器功能

本文实例为大家分享了C++实现计算器功能的具体代码,供大家参考,具体内容如下

说明:

前面简单尝试过计算器,只能支持加减乘除,这次完善了计算器的功能:
支持带括号的表达式;
支持±*/ (加减乘除)基本运算;
支持^(指数)运算;
支持取负号运算(-num);
支持阶乘!。

输入格式及结果:

括号和基本运算:

指数运算:

取负和混合运算:

阶乘:

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

//支持带括号的表达式,支持+-*/、^(指数)、取负、!(阶乘)

#include <iostream>

#include <stack>

#include <math.h>

usingnamespacestd;

doubleinStack();//核心函数,将操作符有序的入栈计算, 最后返回结果

voidcalculate(stack<char>& Ope, stack<double>& Num);//用来计算加减乘除, 结果放在数字栈顶

voidfactorial(stack<double>& Num);//用来计算阶乘

intpriority(charope_);//用来计算操作符的优先级

intmain() {

doubleresult;//最后的结果

cout <<"请输入:\n";

result = inStack();//将缓冲区的操作符和数字压入栈

cout <<"结果是:\n"<< result;

return0;

}

doubleinStack() {

stack<char> Ope;

stack<double> Num;

charope_;

doublenum_;

while(1) {

if(cin.peek() >='0'&& cin.peek() <='9') {//判断下一个是否是数字

cin >> num_;

Num.push(num_);//数字直接入栈

}

else{

cin >> ope_;

if(ope_ =='=') {

while(!Ope.empty()) calculate(Ope, Num);//如果符号栈不空,就一直计算

returnNum.top();//如果是等号且符号栈顶为空,就返回数字栈顶元素

}

elseif(ope_ =='!') factorial(Num);//如果是!就阶乘

elseif(ope_ =='('||Ope.empty()) Ope.push(ope_);//如果符号是左括号或符号栈为空直接压入

elseif(ope_ ==')') {//如果是右括号

while(Ope.top() !='(') calculate(Ope, Num);//一直计算完括号里的

Ope.pop();//左括号出栈

}

elseif(priority(Ope.top()) >= priority(ope_)) {//如果栈顶符号的优先级大于等于当前

calculate(Ope, Num);//计算结果压入数字栈,取出当前栈顶

Ope.push(ope_);//压入当前符号

}

elseOpe.push(ope_);//否则就压入符号栈

}

}

}

voidcalculate(stack<char>& Ope, stack<double>& Num) {

doublea, b;

if(Ope.top() =='-') {

a = Num.top(); Num.pop();

Ope.pop();//取出负号

Num.push(-a);//压入负值

if(!Num.empty()) {

if(Ope.empty() || Ope.top() !='(')

Ope.push('+');//如果前面还有数字,就压入+,即变成加负值

}

}

else{

a = Num.top(); Num.pop();

b = Num.top(); Num.pop();

if(Ope.top() =='+') Num.push(b + a);

elseif(Ope.top() =='*') Num.push(b * a);

elseif(Ope.top() =='/') Num.push(b / a);

elseif(Ope.top() =='^') Num.push(pow(b, a));

Ope.pop();

}

}

voidfactorial(stack<double>& Num) {

inta =static_cast<int>(Num.top());

intresult=1;

for(inti = 1; i <= a; i++) result *= i;

Num.push(static_cast<double>(result));

}

intpriority(charope_) {

if(ope_ =='(')return0;

elseif(ope_ =='+'|| ope_ =='-')return1;

elseif(ope_ =='*'|| ope_ =='/')return2;

elseif(ope_ =='^')return3;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,

http://www.jsqmd.com/news/712174/

相关文章:

  • LACIN网络架构:完全互连网络的创新实现与优化
  • X平台算法解析:掌握黄金法则提升内容触及率与互动率
  • SAP ABAP实战:用BAPI ME_INFORECORD_MAINTAIN批量维护采购信息记录(含价格等级完整代码)
  • 收藏!全国首所网安本科高校2026招生!小白_程序员入行必看
  • 2026年水玻璃厂家专业度判定指南:水玻璃厂家哪家口碑好/水玻璃厂家哪家大/水玻璃厂家哪家实力大/水玻璃厂家哪家实力强/选择指南 - 优质品牌商家
  • Kafka集群管理新选择:深度体验Kafka-UI,对比CMAK/Offset Explorer谁更香?
  • DynamicVerse框架:4D动态场景重建与语义理解技术解析
  • 生产系统里维护 SAP Gateway System Alias 的正确打开方式
  • Flux Tasks API 的集成与使用指南
  • 参数传递规则问题-类型匹配
  • Smol轻量级模型:高效神经网络架构设计与应用
  • bool值不等于0都是true
  • 链表中倒数第k个结点-C++
  • 别再为CWRU轴承数据发愁了!一个Python函数搞定数据读取与划分(附完整代码)
  • ARM GICv3虚拟中断控制器与ICV_HPPIR1_EL1寄存器详解
  • 多项式优化框架设计与Julia实现实践
  • 解锁macOS视频预览新境界:QuickLookVideo全面解析与实战指南
  • Leetcode刷题总结-3.二叉树篇
  • 实战:在华为Atlas 300i Pro上部署YOLOv5模型进行目标检测(MindSpore+CANN)
  • 终极Django REST Framework数据分析指南:API使用统计与业务洞察实战
  • RPG Maker Decrypter技术深度解析:三版本加密算法实现与架构设计
  • 视觉因果发现:ToCT方法与CauSight模型解析
  • GAN判别器增强技术与对抗训练优化策略
  • Arm Cortex-X925错误记录寄存器架构与RAS技术解析
  • Shark007 Advanced Codecs
  • 安吉办公椅生产厂家有哪些?2026办公网椅生产厂/人体工学椅/安吉办公椅源头工厂调研-商用座椅领军好物精选 - 栗子测评
  • mousemaster:用键盘驱动鼠标,提升效率与缓解RSI的终极方案
  • 别再只用MaxPooling了!用PyTorch手把手实现小波池化层,提升图像分类的抗噪能力
  • 园林绿化公司哪家好?2026浙江苗木绿化/小区绿化苗木/园林绿化公司实力分析-园林苗木服务领军机构优选推荐 - 栗子测评
  • G-Helper终极指南:免费掌控华硕笔记本的完整解决方案