用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= '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= '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

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

整体代码

#include 
#include 
#include 
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= '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= '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> 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= '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= '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

你可能感兴趣的:(简易计算器)