用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++语言编写一个求两个数的和的程序。

程序:

#include<iostream>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型的数据。

程序代码如下:

#include<iostream>#include<cstring>#include<algorithm>//STL(标准模板库)中的算法库 提供了通用的函数供程序员直接调用  //如:遍历(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;}

以上就是高精度加法运算。在之后的学习中我们将继续讲解高精度减法、高精度乘法、高精度除法运算。







【C++】高精度加法


欢迎加入知识星球:球球小课堂 获取arduino相关程序源代码

(球球自己经营的知识星球,会不定时地分享其学习成果)

【C++】高精度加法


【C++】高精度加法


关注视频号:杨老师编程小课堂,欣赏更多arduino小作品






以上是关于用c++语言编写四则运算计算器的主要内容,如果未能解决你的问题,请参考以下文章

用简单的c语言编写四则运算题

c++链表类模板问题(不要用c语言,用c++)

用C++编写一个小型复数计算器

C++高精度加法

用C语言编写一个计算器程序,实现加,减,乘,除,求平方根(正数),倒数等功能.

C语言问题,利用堆栈实现四则运算,谢谢高手帮我编写出来