用C++编写计算器

思路

用字符串来进行输入,经判断将其符号部分与数字部分分离,运用多种函数,最后进行运算。

代码

乘方部分

long long Poww(long long a,long long b)
{
	long long ans=1;long long base=a;
	while(b!=0)
	{
		if(b&1)ans*=base;
		base*=base;
		b>>=1;
	}
	return ans;
}

阶乘部分

long long f(int n){
	long long sum;
	if(n==1)return 1;
	if(n>1)return n*f(n-1);
} 

几个基本函数

double cal(double s, double e, string str);

double getVal(double &s, double e, string str)
{
	if (str[s] == '('||str[s] == '['||str[s] == '{')
	{
		double news, newe, i;
		i = 1;
		news = s + 1;
		while (i)
		{
			s++;
			if (s == e)
				break;
			if (str[s] == '('||str[s] == '['||str[s] == '{')
				i++;
			else if (str[s] == ')'||str[s] == ']'||str[s] == '}')
				i--;
		}
		newe = s - 1;
		s++;
		return cal(news, newe, str);
	}
	double val;
	if(str[s]=='s')
	{
		s=s+3;
		val=sin(getVal(s,e,str));
	}
	if(str[s]=='c')
	{
		s=s+3;
		val=cos(getVal(s,e,str));
	}
	if(str[s]=='t')
	{
		s=s+3;
		val=tan(getVal(s,e,str));
	}
	if(str[s]=='a')
	{
		s++;
		if(str[s]=='s')
		{
			s=s+3;
			val=sin(getVal(s,e,str));
		}
		if(str[s]=='c')
		{
			s=s+3;
			val=cos(getVal(s,e,str));
		}
		if(str[s]=='t')
		{
			s=s+3;
			val=tan(getVal(s,e,str));
		}
	}
	if(str[s]>='0'&&str[s]<='9')
	{
		val = str[s++] - '0';
		while (s<e && str[s] >= '0'&&str[s] <= '9')
		{
			val *= 10;
			val += str[s++] - '0';
		}
		if(str[s]=='!'){
			val=f(val);
			s++;
		} 
		if(str[s]=='.')
		{
			s=s+1;
			double val2=str[s++] - '0';
			while (s<e && str[s] >= '0'&&str[s] <= '9')
			{
				val2 *= 10;
				val2 += str[s++] - '0';
			}
			while(val2>=1)
			{
				val2/=10;
			}
			val=val+val2;
		}
	}
	return val;
}


double getVal1(double &s, double e, string str)
{
	double val;
	val = getVal(s, e, str);
	while (1)
	{
		if (s < e&&str[s] == '*') val*=getVal(++s,e,str);
		else if (s<e && str[s] == '/')val /= getVal(++s, e, str);
		else if (s<e && str[s] == '^')val=Poww(val,getVal(++s,e,str));
		else return val;
	}
}

double cal(double s, double e, string str)
{
	double sum = 0;
	if (str[s] != '-')
		sum = getVal1(s, e, str);
	while (s < e)
	{
		if (str[s] == '+')
		{
			sum += getVal1(++s, e, str);
		}
		if (str[s] == '-')
		{
			sum -= getVal1(++s, e, str);
		}
	}
	return sum;
}

通过getVal1函数来实现乘除法的优先运算。
运用指针实现s的连用。

整体代码

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

long long Poww(long long a,long long b)
{
	long long ans=1;long long base=a;
	while(b!=0)
	{
		if(b&1)ans*=base;
		base*=base;
		b>>=1;
	}
	return ans;
}

long long f(int n){
	long long sum;
	if(n==1)return 1;
	if(n>1)return n*f(n-1);
} 

double cal(double s, double e, string str);

double getVal(double &s, double e, string str)
{
	if (str[s] == '('||str[s] == '['||str[s] == '{')
	{
		double news, newe, i;
		i = 1;
		news = s + 1;
		while (i)
		{
			s++;
			if (s == e)
				break;
			if (str[s] == '('||str[s] == '['||str[s] == '{')
				i++;
			else if (str[s] == ')'||str[s] == ']'||str[s] == '}')
				i--;
		}
		newe = s - 1;
		s++;
		return cal(news, newe, str);
	}
	double val;
	if(str[s]=='s')
	{
		s=s+3;
		val=sin(getVal(s,e,str));
	}
	if(str[s]=='c')
	{
		s=s+3;
		val=cos(getVal(s,e,str));
	}
	if(str[s]=='t')
	{
		s=s+3;
		val=tan(getVal(s,e,str));
	}
	if(str[s]=='a')
	{
		s++;
		if(str[s]=='s')
		{
			s=s+3;
			val=sin(getVal(s,e,str));
		}
		if(str[s]=='c')
		{
			s=s+3;
			val=cos(getVal(s,e,str));
		}
		if(str[s]=='t')
		{
			s=s+3;
			val=tan(getVal(s,e,str));
		}
	}
	if(str[s]>='0'&&str[s]<='9')
	{
		val = str[s++] - '0';
		while (s<e && str[s] >= '0'&&str[s] <= '9')
		{
			val *= 10;
			val += str[s++] - '0';
		}
		if(str[s]=='!'){
			val=f(val);
			s++;
		} 
		if(str[s]=='.')
		{
			s=s+1;
			double val2=str[s++] - '0';
			while (s<e && str[s] >= '0'&&str[s] <= '9')
			{
				val2 *= 10;
				val2 += str[s++] - '0';
			}
			while(val2>=1)
			{
				val2/=10;
			}
			val=val+val2;
		}
	}
	return val;
}


double getVal1(double &s, double e, string str)
{
	double val;
	val = getVal(s, e, str);
	while (1)
	{
		if (s < e&&str[s] == '*') val*=getVal(++s,e,str);
		else if (s<e && str[s] == '/')val /= getVal(++s, e, str);
		else if (s<e && str[s] == '^')val=Poww(val,getVal(++s,e,str));
		else return val;
	}
}

double cal(double s, double e, string str)
{
	double sum = 0;
	if (str[s] != '-')
		sum = getVal1(s, e, str);
	while (s < e)
	{
		if (str[s] == '+')
		{
			sum += getVal1(++s, e, str);
		}
		if (str[s] == '-')
		{
			sum -= getVal1(++s, e, str);
		}
	}
	return sum;
}


int main()
{
	
	string x;
	while (cin >> x)
		cout << cal(0, x.length(),x) << endl;
}

这便是一个可以进行简单加减乘除(可带括号),能算阶乘与乘方,三角函数的简易计算器

写于2019/4/1:
这是我第一篇博客,访问量惊人的高,不过我个人认为我这篇博客写得并不好,最近有重新写一篇的想法,看过的盆友们可以留下意见,评论or私信

if(str[s]>='0'&&str[s]<='9')
	{
		val = str[s++] - '0';
		while (s<e && str[s] >= '0'&&str[s] <= '9')
		{
			val *= 10;
			val += str[s++] - '0';
		}
		if(str[s]=='!'){
			val=f(val);
			s++;
		} 
		if(str[s]=='.')
		{
			s=s+1;
			double val2=str[s++] - '0';
			while (s<e && str[s] >= '0'&&str[s] <= '9')
			{
				val2 *= 10;
				val2 += str[s++] - '0';
			}
			while(val2>=1)
			{
				val2/=10;
			}
			val=val+val2;
		}
	}

评论有人问到这个部分代码的解释,回复评论比较麻烦,直接写这里了
这部分其实是一个数字的读取,val是个double型的变量,当判断到str[s]为数字时,进入下一步判断,val = str[s++] - ‘0’表示的是将字符型的数字转换成数值,同时s++进入下一个字符(比如str[s]=‘2’,它在ASC表上的是50,减去’0’,也就是48,得到的就是数值2了),接着是一个while循环,意思是读取整个数字,比如str是"123",先是val=1,然后val乘10再加2等于12,再乘10加3等于123。后面的!判断是是否进行阶乘,’.'判断是判断这个数是不是存在小数位,具体过程和前面类似。

这个月之内会完整地解释一遍代码,并且附上使用说明及其demo

  • 20
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值