鱼C论坛

 找回密码
 立即注册
查看: 322|回复: 16

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

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

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

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

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

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

话不多说,秀代码 :
#include <bits/stdc++.h>
using namespace std;
stack<long long> s;
stack<char> sc;
int sum, ss, a, b, j;
char p[300], hz[300];
int main() {
        cin >> p;
        for (int i = 0; i < strlen(p); i++){
                if (p[i] >= '0' && p[i] <= '9'){
                        hz[j++] = p[i];
                        if ((p[i + 1] < '0' || p[i + 1] > '9')) hz[j++] = '.';
                }else{
                        if (sc.empty()) sc.push(p[i]);
                        else if (p[i] == ')'){
                                while (sc.top() != '('){
                                        hz[j++] = sc.top();
                                        sc.pop();
                                }
                                sc.pop();
                        }else if (((p[i] == '*' || p[i] == '/') && (sc.top() != '*' && sc.top() != '/' && sc.top() != '^')) || p[i] == '(' || (p[i] == '^' && sc.top() != '^')) sc.push(p[i]);
                        else{
                                if (p[i] == '+' || p[i] == '-'){
                                        while (!sc.empty()){
                                                if (sc.top() == '(') break;
                                                hz[j++] = sc.top();
                                                sc.pop();
                                        }
                                        sc.push(p[i]);
                                }else if(p[i] == '*' || p[i] == '/'){
                                        while (!sc.empty()){
                                                if (sc.top() == '(' || sc.top() == '+' || sc.top() == '-') break;
                                                hz[j++] = sc.top();
                                                sc.pop();
                                        }
                                        sc.push(p[i]);
                                }else{
                                        hz[j++] = sc.top();
                                        sc.push(p[i]);
                                        sc.pop();
                                }
                        }
                }
        }
        while (!sc.empty()){
                hz[j++] = sc.top();
                sc.pop();
        }
        for (int i = 0; i < j; i++){
                if (hz[i] == '.'){
                        sum = 0;
                        for (int j = ss; j < i; j++) sum = sum * 10 + hz[j] - '0';
                        ss = i + 1;
                        s.push(sum);
                }else if (hz[i] < '0' || hz[i] > '9'){
                        b = s.top();
                        s.pop();
                        a = s.top();
                        s.pop();
                        if (hz[i] == '+') s.push(a + b);
                        if (hz[i] == '-') s.push(a - b);
                        if (hz[i] == '*') s.push(a * b);
                        if (hz[i] == '/') s.push(a / b);
                        if (hz[i] == '^') s.push(pow(a, b));
                        ss++;
                }
        }
        cout << s.top();
        return 0;
}
@liuhongrun2022 @陶远航 @歌者文明清理员 @zhangjinxuan @Twilight6
PS:太久没@了, 都不知道谁还在....

评分

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

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

using namespace std;

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

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

    for (size_t i = 0; i < p.length(); i++) { // 遍历输入的每一个字符
        // 这里进行判断
        if (isdigit(p[i])) { // 判断是不是数字
            hz = '.';
            // 继续向后读取完整的数字(这里可以扩展支持多位数)
            while (i < p.length() && isdigit(p[i])) {
                hz = hz * 10 + (p[i] - '0'); // 计算完整数字
                i++;
            }
            s.push(hz); // 将完整数字压入栈
            i--; // 由于外部for循环也在递增i,这里减去1以调整
        } else {
            // 处理运算符和括号的逻辑
            if (sc.empty() || p[i] == '(') {
                sc.push(p[i]);
            } else if (p[i] == ')') {
                while (sc.top() != '(') {
                    hz = sc.top();
                    sc.pop();
                    // 处理运算符
                    b = s.top(); s.pop();
                    a = s.top(); s.pop();
                    if (hz == '+') s.push(a + b);
                    else if (hz == '-') s.push(a - b);
                    else if (hz == '*') s.push(a * b);
                    else if (hz == '/') s.push(a / b);
                    else if (hz == '^') s.push(pow(a, b));
                }
                sc.pop(); // 去掉 '('
            } else {
                // 处理运算符优先级
                while (!sc.empty() && precedence(sc.top()) >= precedence(p[i])) {
                    hz = sc.top();
                    sc.pop();
                    // 同样处理运算
                    b = s.top(); s.pop();
                    a = s.top(); s.pop();
                    if (hz == '+') s.push(a + b);
                    else if (hz == '-') s.push(a - b);
                    else if (hz == '*') s.push(a * b);
                    else if (hz == '/') s.push(a / b);
                    else if (hz == '^') s.push(pow(a, b));
                }
                sc.push(p[i]); // 压入当前运算符
            }
        }
    }

    // 最后如果栈不空,依次处理剩余的运算符
    while (!sc.empty()) {
        hz = sc.top();
        sc.pop();
        b = s.top(); s.pop();
        a = s.top(); s.pop();
        if (hz == '+') s.push(a + b);
        else if (hz == '-') s.push(a - b);
        else if (hz == '*') s.push(a * b);
        else if (hz == '/') s.push(a / b);
        else if (hz == '^') s.push(pow(a, b));
    }

    cout << "结果为: " << s.top() << endl; // 输出最终结果
    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

但是我只能看懂一部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-2 10:27:23 | 显示全部楼层
python计算器,我也来秀一秀
print(eval(input())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

*,70%居然没中?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

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

虽然我看不懂C++,但是在括号处理方面好像比我的更好诶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是用栈.但是我优先级部分写的极其糟糕...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 14:32:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

老了,看着代码发怵.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-15 11:46:01 | 显示全部楼层
111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

牛,膜拜大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

鱼币栈好久没写了,都快看不懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有可能是因为我写得也比较乱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 06:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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