用字符串来进行输入,经判断将其符号部分与数字部分分离,运用多种函数,最后进行运算。
乘方部分
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