鱼C论坛

 找回密码
 立即注册
查看: 2104|回复: 18

[技术交流] 同样也来展示一个c++做的计算器

[复制链接]
回帖奖励 3 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 1 次(中奖概率 70%)
发表于 2024-8-1 21:53:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 学习编程中的Ben 于 2024-8-1 21:54 编辑

看了某位仁兄的计算器得了精华,也发一个秀一秀.
主要原理是通过栈来转化成后缀表达式进行计算,中途用 . 来区分数字和数字.
虽然比起 @zhangchenyvn 的短一些,但为了区分优先级,用了很多很多很多判断......
支持 + - * / ^ 五种运算
当时学栈的副产品,写的不好不要吐槽哈

话不多说,秀代码 :
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. stack<long long> s;
  4. stack<char> sc;
  5. int sum, ss, a, b, j;
  6. char p[300], hz[300];
  7. int main() {
  8.         cin >> p;
  9.         for (int i = 0; i < strlen(p); i++){
  10.                 if (p[i] >= '0' && p[i] <= '9'){
  11.                         hz[j++] = p[i];
  12.                         if ((p[i + 1] < '0' || p[i + 1] > '9')) hz[j++] = '.';
  13.                 }else{
  14.                         if (sc.empty()) sc.push(p[i]);
  15.                         else if (p[i] == ')'){
  16.                                 while (sc.top() != '('){
  17.                                         hz[j++] = sc.top();
  18.                                         sc.pop();
  19.                                 }
  20.                                 sc.pop();
  21.                         }else if (((p[i] == '*' || p[i] == '/') && (sc.top() != '*' && sc.top() != '/' && sc.top() != '^')) || p[i] == '(' || (p[i] == '^' && sc.top() != '^')) sc.push(p[i]);
  22.                         else{
  23.                                 if (p[i] == '+' || p[i] == '-'){
  24.                                         while (!sc.empty()){
  25.                                                 if (sc.top() == '(') break;
  26.                                                 hz[j++] = sc.top();
  27.                                                 sc.pop();
  28.                                         }
  29.                                         sc.push(p[i]);
  30.                                 }else if(p[i] == '*' || p[i] == '/'){
  31.                                         while (!sc.empty()){
  32.                                                 if (sc.top() == '(' || sc.top() == '+' || sc.top() == '-') break;
  33.                                                 hz[j++] = sc.top();
  34.                                                 sc.pop();
  35.                                         }
  36.                                         sc.push(p[i]);
  37.                                 }else{
  38.                                         hz[j++] = sc.top();
  39.                                         sc.push(p[i]);
  40.                                         sc.pop();
  41.                                 }
  42.                         }
  43.                 }
  44.         }
  45.         while (!sc.empty()){
  46.                 hz[j++] = sc.top();
  47.                 sc.pop();
  48.         }
  49.         for (int i = 0; i < j; i++){
  50.                 if (hz[i] == '.'){
  51.                         sum = 0;
  52.                         for (int j = ss; j < i; j++) sum = sum * 10 + hz[j] - '0';
  53.                         ss = i + 1;
  54.                         s.push(sum);
  55.                 }else if (hz[i] < '0' || hz[i] > '9'){
  56.                         b = s.top();
  57.                         s.pop();
  58.                         a = s.top();
  59.                         s.pop();
  60.                         if (hz[i] == '+') s.push(a + b);
  61.                         if (hz[i] == '-') s.push(a - b);
  62.                         if (hz[i] == '*') s.push(a * b);
  63.                         if (hz[i] == '/') s.push(a / b);
  64.                         if (hz[i] == '^') s.push(pow(a, b));
  65.                         ss++;
  66.                 }
  67.         }
  68.         cout << s.top();
  69.         return 0;
  70. }
复制代码

@liuhongrun2022 @陶远航 @歌者文明清理员 @zhangjinxuan @Twilight6
PS:太久没@了, 都不知道谁还在....

评分

参与人数 3荣誉 +15 鱼币 +10 贡献 +9 收起 理由
陶远航 + 5 + 5 + 3
zhangchenyvn + 5 + 5 + 3 鱼C有你更精彩^_^ 比我的更好诶
liuhongrun2022 + 5 + 3

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-1 21:53:24 | 显示全部楼层
嘿,鱼油的提问让我乐得不行!这段 C++ 代码看起来就像是数学界的多功能瑞士军刀,能处理各种运算符,并且使用栈来管理复杂的后缀表达式。接下来我们就来逐步解读一下,希望能带你带入这个“计算器”的世界,别担心,不会让你昏头转向的~

首先,代码从 `#include` 开始,但似乎忘记了包含具体的库函数(例如 `#include <iostream>` 和 `#include <stack>`),这可能是个小失误。没关系,我们来加上这些吧!

接下来的部分,利用栈(stack)来处理算式中的数字和运算符。栈就像一个喝醉了的程序员,只能“后进先出”,所以我们需要把数字和运算符按顺序压入栈中。

  1. #include <iostream>
  2. #include <stack>
  3. #include <cmath>
  4. #include <cstring>

  5. using namespace std;

  6. int main() {
  7.     stack<int> s;   // 数字栈
  8.     stack<char> sc; // 运算符栈
  9.     string p;       // 输入字符串
  10.     int sum, ss, a, b;
  11.     char hz;

  12.     cin >> p; // 读取输入的算式

  13.     for (size_t i = 0; i < p.length(); i++) { // 遍历输入的每一个字符
  14.         // 这里进行判断
  15.         if (isdigit(p[i])) { // 判断是不是数字
  16.             hz = '.';
  17.             // 继续向后读取完整的数字(这里可以扩展支持多位数)
  18.             while (i < p.length() && isdigit(p[i])) {
  19.                 hz = hz * 10 + (p[i] - '0'); // 计算完整数字
  20.                 i++;
  21.             }
  22.             s.push(hz); // 将完整数字压入栈
  23.             i--; // 由于外部for循环也在递增i,这里减去1以调整
  24.         } else {
  25.             // 处理运算符和括号的逻辑
  26.             if (sc.empty() || p[i] == '(') {
  27.                 sc.push(p[i]);
  28.             } else if (p[i] == ')') {
  29.                 while (sc.top() != '(') {
  30.                     hz = sc.top();
  31.                     sc.pop();
  32.                     // 处理运算符
  33.                     b = s.top(); s.pop();
  34.                     a = s.top(); s.pop();
  35.                     if (hz == '+') s.push(a + b);
  36.                     else if (hz == '-') s.push(a - b);
  37.                     else if (hz == '*') s.push(a * b);
  38.                     else if (hz == '/') s.push(a / b);
  39.                     else if (hz == '^') s.push(pow(a, b));
  40.                 }
  41.                 sc.pop(); // 去掉 '('
  42.             } else {
  43.                 // 处理运算符优先级
  44.                 while (!sc.empty() && precedence(sc.top()) >= precedence(p[i])) {
  45.                     hz = sc.top();
  46.                     sc.pop();
  47.                     // 同样处理运算
  48.                     b = s.top(); s.pop();
  49.                     a = s.top(); s.pop();
  50.                     if (hz == '+') s.push(a + b);
  51.                     else if (hz == '-') s.push(a - b);
  52.                     else if (hz == '*') s.push(a * b);
  53.                     else if (hz == '/') s.push(a / b);
  54.                     else if (hz == '^') s.push(pow(a, b));
  55.                 }
  56.                 sc.push(p[i]); // 压入当前运算符
  57.             }
  58.         }
  59.     }

  60.     // 最后如果栈不空,依次处理剩余的运算符
  61.     while (!sc.empty()) {
  62.         hz = sc.top();
  63.         sc.pop();
  64.         b = s.top(); s.pop();
  65.         a = s.top(); s.pop();
  66.         if (hz == '+') s.push(a + b);
  67.         else if (hz == '-') s.push(a - b);
  68.         else if (hz == '*') s.push(a * b);
  69.         else if (hz == '/') s.push(a / b);
  70.         else if (hz == '^') s.push(pow(a, b));
  71.     }

  72.     cout << "结果为: " << s.top() << endl; // 输出最终结果
  73.     return 0;
  74. }
复制代码


总的来说,你的代码非常有趣并且有用,虽然可能需要一些小改动来提高可读性和性能。记住,任何代码都应该像幽默一样——既能表达清楚,又不能太过复杂、让人抓狂!希望这个解释对你有所帮助,继续加油哦!调试的时候就像是在泡咖啡,慢工出细活,别着急!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 23:39:34 | 显示全部楼层

回帖奖励 +1 鱼币

但是我只能看懂一部分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-2 10:27:23 | 显示全部楼层
python计算器,我也来秀一秀

  1. print(eval(input())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-2 10:28:08 | 显示全部楼层

回帖奖励 +1 鱼币

*,70%居然没中?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-2 14:49:47 | 显示全部楼层

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-2 18:03:46 From FishC Mobile | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 zhangchenyvn 于 2024-8-2 18:04 编辑

虽然我看不懂C++,但是在括号处理方面好像比我的更好诶
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-2 18:10:38 | 显示全部楼层
zhangchenyvn 发表于 2024-8-2 18:03
虽然我看不懂C++,但是在括号处理方面好像比我的更好诶

就是用栈.但是我优先级部分写的极其糟糕...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 14:32:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-10 00:35:24 | 显示全部楼层

回帖奖励 +1 鱼币

老了,看着代码发怵.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-15 11:46:01 | 显示全部楼层
111
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-16 08:28:00 | 显示全部楼层

回帖奖励 +1 鱼币

牛,膜拜大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 16:50:11 | 显示全部楼层

回帖奖励 +1 鱼币

厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-22 20:28:39 | 显示全部楼层

回帖奖励 +1 鱼币

666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-22 21:02:18 | 显示全部楼层

回帖奖励 +1 鱼币

鱼币栈好久没写了,都快看不懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-23 09:38:09 | 显示全部楼层
zsy0226 发表于 2024-8-22 21:02
鱼币栈好久没写了,都快看不懂了

有可能是因为我写得也比较乱
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-3 16:23:14 | 显示全部楼层

回帖奖励 +1 鱼币

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-4 15:21:28 | 显示全部楼层

回帖奖励 +1 鱼币

666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-5 22:06:37 | 显示全部楼层

回帖奖励 +1 鱼币

加油、加油、加加油;为楼主,也为自己。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 07:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表