杭电1237--简单计算器 (getchar() + 栈)

本文介绍了一个简单的计算器程序,能够处理包含加、减、乘、除的非负整数表达式,并通过栈来存储和处理数据,最终计算出表达式的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 14590    Accepted Submission(s): 4957


Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 

 

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 

 

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

 

Sample Input
1 + 2 
4 + 2 * 5 - 7 / 11 
0

 

 

 

Sample Output
3.00 
13.36

 

 

 

Source
 
//getchar(); 较难理解;定义一个栈;存储处理后的数据;最后把栈中所有元素相加;
 
#include <stdio.h>
#include<stack>
using namespace std;
int main()
{
    double m,n; char ch;
    while(~scanf("%lf",&m))
    {
        if(getchar() == '\n' && m == 0 )   //位置固定;
        break ;
        stack <double> s;
        s.push(m) ;
        scanf("%c",&ch);          //执行一次; 
        while(~scanf("%lf",&m))
        {
            if(ch == '*')
            {
                n=s.top() ;
                n*=m ;
                s.pop() ;
                s.push(n) ;
            }
            
            if( ch == '/')
            {
                n=s.top() ;
                n/=m ;
                s.pop() ;
                s.push(n) ; 
            }
            
            if(ch == '+')
            s.push(m) ;
            
            if(ch == '-')
            s.push(-m) ;
            if(getchar() == '\n')
            break;
            //ch=getchar();     //gethchar() ; 相当于输入一个人字符;
            scanf("%c",&ch); 
        }
        double total =0;
        while(!s.empty())
        {
            total+=s.top() ;
            s.pop() ;
        } 
        printf("%.2lf\n",total);    
    }    
    return 0;
}

 

 
 

转载于:https://www.cnblogs.com/soTired/p/4612278.html

### C++ 实现正整数 A 加 B 示例代码 以下是基于站内引用的内容以及标准的编程实践所提供的解决方案。此方案适用于处理两个正整数相加的问题。 ```cpp #include <iostream> using namespace std; int main() { int a = 0, b = 0; char ch; bool flag = false; // 标志位用于区分第一个数字和第二个数字 while ((ch = getchar()) != '\n') { if (!flag) { if (isdigit(ch) && a != -1) { a = a * 10 + (ch - '0'); } else if (ch == ' ') { flag = true; } else { a = -1; // 如果遇到非法字符,则设置a为-1表示错误 } } else { if (isdigit(ch) && b != -1) { b = b * 10 + (ch - '0'); } else { b = -1; // 如果遇到非法字符,则设置b为-1表示错误 } } } if (a >= 0 && b >= 0) { cout << a + b << endl; } else { cout << "Error: Invalid input." << endl; } return 0; } ``` 上述代码实现了读取输入并计算两个正整数之和的功能。通过 `getchar()` 函数逐字符读取输入,利用标志变量 `flag` 来判断当前解析的是第一个还是第二个数字[^2]。如果输入合法,则输出两数之和;否则提示输入有误。 #### 关键点说明 - **输入合法性校验**:程序会检测输入中的每一个字符是否为有效数字或空格。一旦发现非法字符,立即停止解析并将对应数值设为 `-1` 表示错误。 - **多条件分支逻辑**:通过布尔变量 `flag` 控制何时切换到解析第二个数字的状态。 - **错误处理机制**:当任意一个数字因非法字符而失效时,最终输出错误消息而非执行不合理的运算。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值