當前位置:
首頁 > 知識 > C語言也能寫一個高級-函數型計算器

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加加 的精彩文章:

一分鐘學會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函數用法做一個計算器程序
計算器思維,生來就會算計的星座
國產「復古造型」計算器體驗,機械軸設計成最大亮點