九度oj 题目1019:简单计算器 【ZJU2006考研机试题5】

2024-05-05 02:18

本文主要是介绍九度oj 题目1019:简单计算器 【ZJU2006考研机试题5】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目1019:简单计算器

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:3287

解决:1211

题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
来源:
2006年浙江大学计算机及软件工程研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7743-1-1.html
本题方法编写计算器做到升级版,跳过任意多个前中后的空格~~

写百行以上的程序,更好的锻炼自己的代码能力~  任重而道远啊~~

/*  1.符号栈为空 或优先级高于栈顶 则进 符号栈。是高于啊!!!2.当while操作符出栈运算完后,当前运算符优先级高于栈顶了,故要运算符需入栈。。别漏了。。。。
*/	
#include<stdio.h>
#include<stack>
using namespace std;
stack<double> num;
stack<int> op;
char r[210];
int pri[5][5]=
{1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,0
};
bool isDigit(char c)
{if(c>='0'&&c<='9')return true;elsereturn false;
}
bool isOperator(char d)
{if(d=='+'||d=='-')return true;else if(d=='*'||d=='/')return true;elsereturn false;
}
int str2Op(char e)
{if(e=='+') return 1;if(e=='-') return 2;if(e=='*') return 3;if(e=='/') return 4;return NULL;
}
void getCh(bool &tmpO,int &tmpN,int &tmpId)  //要么 获得一个操作数 要么 获得一个操作符
{if(tmpId==0&&op.empty()==true){//第一个必然为数字,此处只是为了方便运算而加额外字符tmpO=true;tmpN=0; return;}if(r[tmpId]==0){tmpO=true;tmpN=0; return;}while(true){  //是为了跳过空格if(r[tmpId]==' '){tmpId++;continue;}else if(isOperator(r[tmpId])){  //获得一个操作符tmpO=true;tmpN=str2Op(r[tmpId]);tmpId++;break;}else{tmpN=0;while(isDigit(r[tmpId])){   //获得一个操作数tmpO=false;tmpN=tmpN*10+r[tmpId]-'0'; tmpId++;				}
//			printf("当前数字是:%d ",tmpN);
//			printf("\n");break;}}}
int main()
{//freopen("G:\\in.txt","r",stdin);while(gets(r)){          //每次读一行,直到文件尾。if(r[0]=='0'&&r[1]==0) break;  //gets()遇到换行就截止,换行对应存的是0 ;while(!num.empty()) num.pop();while(!op.empty()) op.pop();int id=0;			  //标记当前读到的位置。bool isOp;		 //作为引用,以在函数中修改int ch;             //作为引用,以在函数中修改while(true){getCh(isOp,ch,id); //获取当前id开始的一个操作数 OR 一个操作符,跳过空格。if(isOp==false){  //若为数字直接进数字栈num.push((double)ch);
//				printf("当前数字是:%.2lf ",num.top());
//				printf("\n");}else if(op.empty()==true||pri[ch][op.top()]==1){ //符号栈为空 或优先级高于栈顶 则进 符号栈op.push(ch);
//				printf("当前数字是:%d ",op.top());
//				printf("\n");}else{while(pri[ch][op.top()]==0){
//					printf("当前数字是:%d ",op.top());
//					printf("\n");double tmp1=num.top();num.pop();double tmp2=num.top();num.pop();int nowOp=op.top();op.pop();double nowNum;if(nowOp==1)nowNum=tmp2+tmp1;if(nowOp==2)nowNum=tmp2-tmp1;if(nowOp==3)nowNum=tmp2*tmp1;if(nowOp==4)nowNum=tmp2/tmp1;num.push(nowNum); //运算完后把该步运算结果入数字栈。}op.push(ch); //上个while运算完后当前运算符优先级高于栈顶了,故要运算符入栈。。。。。别漏了。。。。}if(op.size()==2&&op.top()==0) break;  //该循环跳出的条件。}printf("%.2lf\n",num.top());}return 0;
}





这篇关于九度oj 题目1019:简单计算器 【ZJU2006考研机试题5】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960607

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [