大家好,我是讯享网,大家多多关注。
。
函数计算器是一种电子计算器,可以进行幂、根、指数、对数、三角函数、统计等运算。它也被称为科学计算器。仅供参考:
/* –
函数计算器(VC++6.0,Win32控制台)
功能:
目前,提供了10多个常用的数学函数:
(1)原罪
余弦余弦
⑵正切Tan
⑵方形sqrt
5]反正弦
[6]反余弦反余弦
⑵反正切反正切
常用对数lg
⑼自然对数ln
⑽ e指数指数
⑾动力功能
⑿向上舍入上限
[13]圆形地板向下。
[13]舍入和舍入舍入
用法:
如果你要求2的32次方,你可以输入2 32 :
tan(π/6)型:
注意不要进入:谭(30)<回车& gt
如果需要1.23弧度的正弦值,有几种方法是有效的:
罪(1.23)& lt;输入& gt
sin 1.23 & lt输入& gt
sin1.23 & lt输入& gt
如果验证了正弦和余弦的平方和公式,sin(1.23)2+cos(1.23)2 < Enter & gt;或者sin 1.23 2+cos 1.23 2 ;
另外,两个函数表达式连在一起,自动理解为乘法如:sin1.23cos0.77+cos1.23sin0.77等价于sin(1.23)* cos(0.77)+cos(1.23)* sin(0.77)。
当然,你也可以用sin(1.23+0.77),即sin2,根据三角变换来验证。
这个计算器充分考虑了运算符的优先级,所以如:2+3 * 4 2实际上等价于:2+(3*(4*4))
此外,如果函数名前面有数字,它将自动被视为乘法。
同样,如果一个数的右边是左括号,则自动认为该数和括号之间有一个隐含的乘法符号。
例如,3sin1.2 2+5cos2.1 2相当于3*sin2(1.2)+5*cos2(2.1)。
再比如:4(3-2(sqrt5-1)+ln2)+lg5相当于4*(3-2*(√5 -1)+loge(2))+log10(5)
此外,该计算器提供了Pi在输入字母时不区分大小写,使用方便。
– */
# include & ltiostream & gt
# include & ltiomanip & gt
# include & ltcstdlib & gt
# include & ltcstring & gt
# include & ltcctype & gt
# include & ltcmath & gt
# include & ltstdio.h & gt
# include & ltstring.h & gt
# include & ltwindows.h & gt
usingnamespacestd
constcharTab = 0x9
constit digit = 1;
constintMAXLEN = 16384
chars[MAXLEN],* endss
intpcs = 15
doubleround(doubledVal,short iPlaces){//iPlaces & gt;=0
chars[30];
doubledRetval
sprintf(s,”%。*lf”,iPlaces,dVal);
sscanf(s,” %lf “,& ampdret val);
返回(dret val);
}
doublefun(doublex,charop[],int*iop) {
while(op[* IOP-1]& lt;32) //这行代码使得调用嵌套函数时不需要加括号,比如arc sin(sin(1.234))。只需键入arcsin sin1.234 < Enter & gt
开关(op[*iop-1]) {
case 7:x = sin(x);(* IOP)-;打破;
情况8:x = cos(x);(* IOP)-;打破;
情况9:x = tan(x);(* IOP)-;打破;
案例10:x = sqrt(x);(* IOP)-;打破;
案例11:x = asin(x);(* IOP)-;打破;
案例12:x = acos(x);(* IOP)-;打破;
案例13:x = atan(x);(* IOP)-;打破;
案例14:x = log10(x);(* IOP)-;打破;
案例15:x = log(x);(* IOP)-;打破;
案例16:x = exp(x);(* IOP)-;打破;
案例17:x = ceil(x);(* IOP)-;打破;
案例18:x =楼层(x);(* IOP)-;打破;
case19: x=round(x,0);(* IOP)-;打破;
}
returnx
}
doublecalc(char*expr,char**addr) {
staticintdeep//递归深度
staticchar*fname[]={“sin “,” cos “,” tan “,” sqrt “,” arcsin “,” arccos “,” arctan “,” lg “,” ln “,” exp “,” ceil “,” floor “,” round “,NULL };
doubleST[10]= { 0.0 };//数字堆栈
charop[10]= { ‘+’ };//运算符堆栈
charc、*rexp、*pp、* pf
intist=1,iop=1,last,I;
如果(!深度){
pp = pf = expr
做{
c = * pp++;
如果(c!=“”& amp;& ampc!=制表符)
* pf++ = c;
} while(c!='[94]’);
}
pp = expr
if((c=*pp)==’-‘||c==’+’) {
op[0]= c;
pp++;
}
last =!数字;
while((c=*pp)!='[102]’) {
If(c=='(‘) {//左括号
deep++的;
ST[ist++] = calc(+PP,addr);
深-;
乐趣(ST[ist-1],op,ampIOP);
pp = * addr
last =数字;
if(* PP = = ‘(‘ | | isalpha(* PP)& amp;& ampSTIICMP (PP,” PI “,2)){//目的是:当右括号右端为左括号或函数名时,默认为乘法。
op[iop++]= ‘ * ‘;
last =!数字;
c = op[-IOP];
gotooperate
}
}
Elseif(c==’)’) {//右括号
pp++;
打破;
} elseif(isalpha(c)) {
如果(!strnicmp(pp,” Pi “,2)) {
if(last==DIGIT) {
cout & lt& lt“π相遇于左)”< & ltendl出口(1);
}
ST[ist++]= 3.14159265358979323846264338328;
乐趣(ST[ist-1],op,ampIOP);
PP+= 2;
last =数字;
如果(!strnicmp(pp,” Pi “,2)) {
cout & lt& lt“两个π相连”
}
if(*pp=='(‘) {
cout & lt& lt“π相遇(”
}
}否则{
for(I = 0;(pf=fname[i])!= NULLi++)
如果(!strnicmp(pp,pf,strlen(pf)))破位;
如果(pf!=NULL) {
op[iop++]= 07+I;
PP+= strlen(pf);
}否则{
cout & lt& lt”不熟悉的函数名”
}
}
} elseif(c==’+’||c==’-‘||c==’*’||c==’/’||c==’%’||c==’^’){
charcc
如果(最后!=数字){
cout & lt& lt“操作员卡住”
}
pp++;
if(c==’+’||c==’-‘) {
做{
cc = op[-IOP];
-ist;
开关(cc) {
case ‘+’:ST[ist-1]+= ST[ist];打破;
case ‘-‘:ST[ist-1]-= ST[ist];打破;
case ‘ * ‘:ST[ist-1]* = ST[ist];打破;
case ‘/’:ST[ist-1]/= ST[ist];打破;
case ‘ % ‘:ST[ist-1]= fmod(ST[ist-1],ST[ist]);打破;
case’^’: ST[ist-1]= pow(ST[ist-1],ST[ist]);打破;
}
} while(IOP);
op[iop++]= c;
} else if(c = = ‘ * ‘ | | c = = ‘/’ | | c = = ‘ % ‘){
operate:cc = op[IOP-1];
if(cc==’+’||cc==’-‘) {
op[iop++]= c;
}否则{
-ist;
op[IOP-1]= c;
开关(cc) {
case ‘ * ‘:ST[ist-1]* = ST[ist];打破;
case ‘/’:ST[ist-1]/= ST[ist];打破;
case ‘ % ‘:ST[ist-1]= fmod(ST[ist-1],ST[ist]);打破;
case’^’: ST[ist-1]= pow(ST[ist-1],ST[ist]);打破;
}
}
}否则{
cc = op[IOP-1];
if(cc==’^’) {
cout & lt& lt“电源符号一起使用”
}
op[iop++]= c;
}
last =!数字;
}否则{
if(last == DIGIT) {
cout & lt& lt“两个数字粘在一起”
}
ST[ist++]=strtod(pp,& amprexp);
乐趣(ST[ist-1],op,ampIOP);
if(pp == rexp) {
cout & lt& lt”非法字符”
}
pp = rexp
last =数字;
if(*pp == ‘(‘||isalpha(*pp)) {
op[iop++]= ‘ * ‘;
last =!数字;
c = op[-IOP];
gotooperate
}
}
}
* addr = pp
如果(iop & gt=ist) {
cout & lt& lt”表达式错误”
}
while(iop) {
-ist;
开关(op[ – iop]) {
case ‘+’:ST[ist-1]+= ST[ist];打破;
case ‘-‘:ST[ist-1]-= ST[ist];打破;
case ‘ * ‘:ST[ist-1]* = ST[ist];打破;
case ‘/’:ST[ist-1]/= ST[ist];打破;
case ‘ % ‘:ST[ist-1]= fmod(ST[ist-1],ST[ist]);打破;
case’^’: ST[ist-1]= pow(ST[ist-1],ST[ist]);打破;
}
}
returnST[0];
}
intmain(intargc,char**argv) {
inta
if(argc & lt;2) {
if(GetConsoleOutputCP()!=936)系统(” chcp 936 >NUL”);//中文代码页
cout & lt& lt”计算函数表达式的值.”& lt& ltendl & lt& lt” support(),+,-,*,/,%,pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,LG,ln,exp,ceil,floor,round ” < & ltendl
while(1) {
cout & lt& lt请输入表达式:“;
获取;
if(s[0]= = 0)break;//
cout & lt& lts & lt& lt”=”;
cout & lt& ltsetprecision(15)& lt计算(s,& ampendss)& lt;& ltendl
}
} else if(argc = = 2 & amp;& amp0==strcmp(argv[1],”/?”)) {
if(GetConsoleOutputCP()!=936)系统(” chcp 936 >NUL”);//中文代码页
cout & lt& lt”计算由≥1个命令行参数给定的函数表达式的值。最后一个参数是. 0 ~ .15,表示保留计算结果中的小数位0 ~ 15 ” < & lt;endl & lt& lt” support(),+,-,*,/,%,pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,LG,ln,exp,ceil,floor,round ” < & ltendl
}否则{
strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]= 0;
if(argc & gt;2) {
for(a = 2;a & ltargc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空网格区间的参数连接到s。
if(1==sscanf(argv[a],”。%d “,& amppcs)和amp& amp0 & ltpcs & amp& amppcs & lt=15) {//最后一个参数是. 0 ~ .15,表示计算结果的小数位数是0 ~ 15。
printf(“%。*lf\n “,pcs,calc(s,& ampendss));
}否则{
strncat(s,argv[a],MAXLEN-1);
printf(“%.15lg\n “,calc(s,& ampendss));
}
}否则{
printf(“%.15lg\n “,calc(s,& ampendss));
}
}
return0
}
希望能帮到你,也期待你指出问题。
如果你对此感兴趣,可以加入群:233026065。大家一起学习交流吧。
还有很多学习资料,书籍,视频,免费课等等。……
。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/40207.html