C語言也能寫一個高級-函數型計算器
.
函數計算器是電子計算器的一種,可進行乘方、開方、指數、對數、三角函數、統計等方面的運算,又稱科學型計算器。僅供參考:
/*---------------------------------------
函數型計算器(VC++6.0,Win32 Console)
功能:
目前提供了10多個常用數學函數:
正弦sin
餘弦cos
正切tan
開平方sqrt
反正弦arcsin
反餘弦arccos
反正切arctan
常用對數lg
自然對數ln
e指數exp
乘冪函數^
向上取整ceil
向下取整floor
四捨五入取整round
想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙
用法:
如果要求2的32次冪,可以打入2^32
如果要求30度角的正切可鍵入tan(Pi/6)
注意不能打入:tan(30)
如果要求1.23弧度的正弦,有幾種方法都有效:
sin(1.23)
如果驗證正餘弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 或sin1.23^2+cos1.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
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
constcharTab=0x9;
constintDIGIT=1;
constintMAXLEN=16384;
chars[MAXLEN],*endss;
intpcs=15;
doubleround(doubledVal, shortiPlaces) {//iPlaces>=0
chars[30];
doubledRetval;
sprintf(s,"%.*lf",iPlaces,dVal);
sscanf(s,"%lf",&dRetval);
return(dRetval);
}
doublefun(doublex,charop[],int*iop) {
while(op[*iop-1]
switch(op[*iop-1]) {
case7: x=sin(x); (*iop)--;break;
case8: x=cos(x); (*iop)--;break;
case9: x=tan(x); (*iop)--;break;
case10: x=sqrt(x); (*iop)--;break;
case11: x=asin(x); (*iop)--;break;
case12: x=acos(x); (*iop)--;break;
case13: x=atan(x); (*iop)--;break;
case14: x=log10(x); (*iop)--;break;
case15: x=log(x); (*iop)--;break;
case16: x=exp(x); (*iop)--;break;
case17: x=ceil(x); (*iop)--;break;
case18: x=floor(x); (*iop)--;break;
case19: x=round(x,0);(*iop)--;break;
}
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]=; //數字棧
charop[10]={'+'}; //運算符棧
charc,*rexp,*pp,*pf;
intist=1,iop=1,last,i;
if(!deep) {
pp=pf=expr;
do{
c = *pp++;
if(c!=' '&& c!=Tab)
*pf++ = c;
} while(c!='');
}
pp=expr;
if((c=*pp)=='-'||c=='+') {
op[0] = c;
pp++;
}
last = !DIGIT;
while((c=*pp)!='') {
if(c=='(') {//左圓括弧
deep++;
ST[ist++]=calc(++pp,addr);
deep--;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp = *addr;
last = DIGIT;
if(*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是:當右圓括弧的右惻為左圓括弧或函數名字時,默認其為乘法
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
gotooperate ;
}
}
elseif(c==')') {//右圓括弧
pp++;
break;
} elseif(isalpha(c)) {
if(!strnicmp(pp,"Pi",2)) {
if(last==DIGIT) {
cout
}
ST[ist++]=3.14159265358979323846264338328;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp += 2;
last = DIGIT;
if(!strnicmp(pp,"Pi",2)) {
cout
}
if(*pp=='(') {
cout
}
} else{
for(i=0; (pf=fname[i])!=NULL; i++)
if(!strnicmp(pp,pf,strlen(pf))) break;
if(pf!=NULL) {
op[iop++] = 07+i;
pp += strlen(pf);
} else{
cout
}
}
} elseif(c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {
charcc;
if(last != DIGIT) {
cout
}
pp++;
if(c=='+'||c=='-') {
do{
cc = op[--iop];
--ist;
switch(cc) {
case'+': ST[ist-1] += ST[ist];break;
case'%': ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;
case'^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
} while(iop);
op[iop++] = c;
} elseif(c=='*'||c=='/'||c=='%') {
operate: cc = op[iop-1];
if(cc=='+'||cc=='-') {
op[iop++] = c;
} else{
--ist;
op[iop-1] = c;
switch(cc) {
case'*': ST[ist-1] *= ST[ist];break;
case'%': ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;
case'^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
} else{
cc = op[iop-1];
if(cc=='^') {
cout
}
op[iop++] = c;
}
last = !DIGIT;
} else{
if(last == DIGIT) {
cout
}
ST[ist++]=strtod(pp,&rexp);
ST[ist-1]=fun(ST[ist-1],op,&iop);
if(pp == rexp) {
cout
}
pp = rexp;
last = DIGIT;
if(*pp == '('||isalpha(*pp)) {
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
gotooperate ;
}
}
}
*addr=pp;
if(iop>=ist) {
cout
}
while(iop) {
--ist;
switch(op[--iop]) {
case'+': ST[ist-1] += ST[ist];break;
case'%': ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;
case'^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
returnST[0];
}
intmain(intargc,char**argv) {
inta;
if(argc
if(GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代碼頁
cout
while(1) {
cout
gets(s);
if(s[0]==0) break;//
cout
cout
}
} elseif(argc==2 && 0==strcmp(argv[1],"/?")) {
if(GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代碼頁
cout
} else{
strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;
if(argc>2) {
for(a=2;a
if(1==sscanf(argv[a],".%d",&pcs) && 0
printf("%.*lf",pcs,calc(s,&endss));
} else{
strncat(s,argv[a],MAXLEN-1);
printf("%.15lg",calc(s,&endss));
}
} else{
printf("%.15lg",calc(s,&endss));
}
}
return0;
}
希望能對大家有所幫助,也期待大家指出問題;
想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙
.
點擊展開全文
※一分鐘學會C語言結構體,媽媽再也不用擔心我學習
※0基礎怎麼才能成為C語言C加加程序員
※了解這些C語言中的預處理命令,讓你在平常的工作中效率翻倍!
※C語言編程之遞歸求階乘
TAG:C加加 |
※微軟計算器新功能 不光能計算還能畫函數圖形
※E02 不用計算器的計算
※不到1M的良心之作!連微積分都能算的計算器APP
※人工智慧時代,「高級計算器」MATLAB變了……
※好用的小米計算器iOS版
※計算器可以拿來打飛碟?CASIO復刻射擊遊戲計算器
※「Aging.AI」演算法——人類壽命的「計算器」
※這款CPU性能比不過計算器卻飛出太陽系,工作41年還要干7年
※PS教程/寫實的計算器
※卡西歐 FX-991EX 科學計算器體驗:專業計算,功能強大!
※開源腦洞多 你的Windows 10計算器要能做代數題了?
※微軟終於修復了Windows計算器中存在10年之久的計算錯誤問題
※這套尺子可以秒算大數乘除法,再也不怕考試不能用計算器啦 | 科學DIY
※iPhone計算器不簡單,盤點神奇功能
※卡西歐Casio再次推出復刻版「遊戲計算器」SL-880
※這款CPU性能比不過計算器卻飛出太陽系,勤懇工作41年還要再干7年
※為什麼手機上計算器和撥號盤的數字排序不一樣?
※Python入門篇-利用注釋和main函數用法做一個計算器程序
※計算器思維,生來就會算計的星座
※國產「復古造型」計算器體驗,機械軸設計成最大亮點