用c++语言编写四则运算计算器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c++语言编写四则运算计算器相关的知识,希望对你有一定的参考价值。
用类做,包含析构函数,构造函数,代码简单,不发代码不给分
#include <iostream>#include <cstdlib>
#include <cctype>
#include <cstring>
using namespace std;
enum types DELIMITER = 1, VARIABLE, NUMBER;
class parser
char *exp_ptr; // points to the expression
char token[80]; // holds current token
char tok_type; // holds token's type
void eval_exp2(double &result);
void eval_exp3(double &result);
void eval_exp4(double &result);
void eval_exp5(double &result);
void eval_exp6(double &result);
void atom(double &result);
void get_token();
void serror(int error);
int isdelim(char c);
public:
parser();
double eval_exp(char *exp);
;
// parser constructor
parser::parser()
exp_ptr = NULL;
// Parser entry point.
double parser::eval_exp(char *exp)
double result;
exp_ptr = exp;
get_token();
if(!*token)
serror(2); // no expression present
return 0.0;
eval_exp2(result);
if(*token) serror(0); // last token must be null
return result;
// Add or subtract two terms.
void parser::eval_exp2(double &result)
register char op;
double temp;
eval_exp3(result);
while((op = *token) == '+' || op == '-')
get_token();
eval_exp3(temp);
switch(op)
case '-':
result = result - temp;
break;
case '+':
result = result + temp;
break;
// Multiply or divide two factors.
void parser::eval_exp3(double &result)
register char op;
double temp;
eval_exp4(result);
while((op = *token) == '*' || op == '/' || op == '%')
get_token();
eval_exp4(temp);
switch(op)
case '*':
result = result * temp;
break;
case '/':
result = result / temp;
break;
case '%':
result = (int) result % (int) temp;
break;
// Process an exponent
void parser::eval_exp4(double &result)
double temp, ex;
register int t;
eval_exp5(result);
if(*token== '^')
get_token();
eval_exp4(temp);
ex = result;
if(temp==0.0)
result = 1.0;
return;
for(t=(int)temp-1; t>0; --t) result = result * (double)ex;
// Evaluate a unary + or -.
void parser::eval_exp5(double &result)
register char op;
op = 0;
if((tok_type == DELIMITER) && *token=='+' || *token == '-')
op = *token;
get_token();
eval_exp6(result);
if(op=='-') result = -result;
// Process a parenthesized expression.
void parser::eval_exp6(double &result)
if((*token == '('))
get_token();
eval_exp2(result);
if(*token != ')')
serror(1);
get_token();
else atom(result);
// Get the value of a number.
void parser::atom(double &result)
switch(tok_type)
case NUMBER:
result = atof(token);
get_token();
return;
default:
serror(0);
// Display a syntax error.
void parser::serror(int error)
static char *e[]=
"Syntax Error",
"Unbalanced Parentheses",
"No expression Present"
;
cout << e[error] << endl;
// Obtain the next token.
void parser::get_token()
register char *temp;
tok_type = 0;
temp = token;
*temp = '\0';
if(!*exp_ptr) return; // at end of expression
while(isspace(*exp_ptr)) ++exp_ptr; // skip over white space
if(strchr("+-*/%^=()", *exp_ptr))
tok_type = DELIMITER;
// advance to next char
*temp++ = *exp_ptr++;
else if(isalpha(*exp_ptr))
while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
tok_type = VARIABLE;
else if(isdigit(*exp_ptr))
while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
tok_type = NUMBER;
*temp = '\0';
// Return true if c is a delimiter.
int parser::isdelim(char c)
if(strchr(" +-/*%^=()", c) || c==9 || c=='\r' || c==0)
return 1;
return 0;
int main()
char expstr[80];
cout << "Enter a period to stop.\n";
parser ob; // instantiate a parser
for(;;)
cout << "Enter expression: ";
cin.getline(expstr, 79);
if(*expstr=='.') break;
cout << "Answer is: " << ob.eval_exp(expstr) << "\n\n";
;
return 0;
下的别人的~~~~~都参考下 上面的俩位大叔教教也没坏处。。。如果会做也就不上这里了
参考资料:某网站
参考技术A 我前段时间刚做了一个,呵呵。绝对原创,不过代码太多了,还有用了堆栈,并且分了几个文件。不过功能还是蛮强大的。给出表达式,只要里面没有空格,就可以判断表达式是否合法,合法就返回结果。代码太多,看这:http://hi.baidu.com/cdysxy1987/blog/item/feb62597a037bb027af4806e.html
如果不知道怎么弄的话,给个邮箱,我把工程发给你。 参考技术B 那也不对,有思路和不做是二码事,这里的分能做什么事?有分很了不起吗?好像别人该他的似的,给思路甚至给代码的口气不是这样的. 参考技术C 1,2楼的起码给出点思路啊!不给代码可以,要给给思路才好做啊,楼上说的好,会做的也不来这里了 参考技术D 楼上说得有道理,探讨问题还是可以,现在的孩子们怎么都这么懒。
C++高精度加法
我们知道,计算机有一个显著的特点就是运算速度快,运算精度高。尤其是在处理比较大的数据时,计算机的优势就更加明显。截止到2019年12月15日,中国最快的计算机是“天河一号”。那么计算机是如何进行运算的呢?
例:用C++语言编写一个求两个数的和的程序。
程序:
using namespace std;
int main(){
int a,b;
cin>>a>>b;//输入a,b两数
cout<<a+b;//输出a,b的和
return 0;
}
求两个数的和,用C++语言很容易编写。C++中现有的整数数据类型有int和long long型,我们知道int型整数最大能到10的9次方,也就是10位数,而long long型整数最大能到10的19次方,也就是20位数。那么问题来了,如果a、b的位数比较多呢?比如:a、b两数是100位的整数或者1000位的整数,这时它们的和如何计算呢?这就是我们今天要说的高精度加法。
例:现有两个10000位的正整数,要求将它们加起来输出。
分析:
(1)高精度加法,所用到的算法很简单,其实就是我们小学所学的加法“竖式”计算。将两个加数的对应数位对齐,也就是说个位对个位、十位对十位、百位对百位,对应的数位进行加法操作,有进位的要进位。
(2)高精度加法要将两个加数按对应的位数一位一位地处理,所以在实践中,将两个加数分别用两个数组进行存储,问题就会变得简单。
(3)之前我们已经说过,C++中最大的整数是long long型,最大位数是20位。所以对于10000位的正整数,我们输入的数据类型应该是一个字符串,也就是string型的数据。
程序代码如下:
//如:遍历(for_each)、查找(find)、二分查找(binary_search、lower_bound、upper_bound)
// 去除重复(unique)、填充(fill)、前一个排列(pre_permutation)、下一个排列(next_permutation)、排序(sort)等
using namespace std;
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
void Read(int *A,int &Len){//int *A 定义一个整型的变量指针 ,可看作一个整数型的数组
string s;
cin>>s;
Len=s.length();
for(int i=0;i<Len;i++){
A[i]=s[i]-48;//A[i]=s[i]-'0';将字符转换成对应的数字
}
reverse(A,A+Len);//对A[0]…A[Len-1]进行翻转 ,逆序
} //输入函数,将输入的字符串转换成对应的数字组成的数组,并将数组逆序,即个位放到第一位,方便计算
int main(){
Read(A,Len_A);//输入第一个加数
Read(B,Len_B);//输入第二个加数
Len_Ans=max(Len_A,Len_B);// 两数和的位数取这两个加数中位数多的那个数的值
memset(C,0,sizeof(C));//初始化控制进位的数组C ,初始值均为0,当发生进位时,对应的数位的值变成1
for(int i=0;i<=Len_Ans;i++){//因为可能有进位,所以要运算到比数组的元素个数加1
Ans[i]=A[i]+B[i]+C[i];//加上前一位的进位值
if(Ans[i]>=10) {
C[i+1]=(Ans[i])/10;//处理进位 也可直接用 C[i+1]=1;
Ans[i]%=10;//进位之后原数位上的数 也可用 Ans[i]-=10;
}
}
if(Ans[Len_Ans]>0) Len_Ans++;//最后一次如果有进位,则位数加1 ,两个10000位的数相加,和有可能是10001位
//while(Ans[Len_Ans]>0) Len_Ans++;
for(int i=Len_Ans-1;i>=0;i--){
cout<<Ans[i];
}//将得到的数组逆序输出就是我们求的和 也可先将数组翻转,然后正序输出
return 0;
}
以上就是高精度加法运算。在之后的学习中我们将继续讲解高精度减法、高精度乘法、高精度除法运算。
欢迎加入知识星球:球球小课堂 获取arduino相关程序源代码
(球球自己经营的知识星球,会不定时地分享其学习成果)
关注视频号:杨老师编程小课堂,欣赏更多arduino小作品
以上是关于用c++语言编写四则运算计算器的主要内容,如果未能解决你的问题,请参考以下文章