




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+程序設(shè)計(jì)課程設(shè)計(jì)說明書實(shí)數(shù)型科學(xué)計(jì)算器專業(yè): _班級(jí): _姓名: _學(xué)號(hào): _時(shí)間: _17目錄一、課程設(shè)計(jì)任務(wù)描述1(一)設(shè)計(jì)題目1(二)設(shè)計(jì)要求1二、計(jì)算器中所用的符號(hào)及其含義1三、程序中的運(yùn)算特色2(一)四則運(yùn)算2(二)冪運(yùn)算2(三)!階乘2(四)三角函數(shù)計(jì)算2(五)計(jì)算以10為底的對(duì)數(shù)2(六)對(duì)于e和pi的計(jì)算2(七)括號(hào)使用及算式結(jié)束要求2四、流程圖3五、程序部分功能實(shí)現(xiàn)截圖4六、程序源代碼5七、課程設(shè)計(jì)的評(píng)價(jià)、收獲與建議19八、參考文獻(xiàn)20一、課程設(shè)計(jì)任務(wù)描述(一)設(shè)計(jì)題目實(shí)數(shù)型科學(xué)計(jì)算器(二)設(shè)計(jì)要求1、開發(fā)平臺(tái): BC+ 3.1、VC+ 6.0或Borland C+ 6.0
2、。2、對(duì)設(shè)計(jì)內(nèi)容的要求 源文件要采用多文件的工程結(jié)構(gòu);在源程序中必須使用類,輸入輸出要符合C+語(yǔ)言的特性; 功能必須完善,程序代碼要有相應(yīng)的注釋; 代碼要有一定的間隙與排版,界面應(yīng)美觀。3、對(duì)設(shè)計(jì)說明書的要求 設(shè)計(jì)過程、流程圖及源代碼; 對(duì)本次設(shè)計(jì)的評(píng)價(jià)、此次設(shè)計(jì)的收獲與建議。4、說明書為打印件5、源文件要采用多文件的工程結(jié)構(gòu);在源程序中必須使用類,輸入輸出要符合C+語(yǔ)言的新特性。二、計(jì)算器中所用的符號(hào)及其含義輸入的算式中負(fù)號(hào)要用下劃線(_)代替,注意與減號(hào)區(qū)別。簡(jiǎn)單的四則運(yùn)算按常規(guī)輸入即可。對(duì)于階乘:(1+3)!表示4的階乘。pi代表圓周率,即3.1415926536,本計(jì)算器利用弧度進(jìn)行三
3、角函數(shù)計(jì)算。計(jì)算以e(2.718281828)為底的自然對(duì)數(shù)請(qǐng)輸入ln,如lne4=4,注意指數(shù)的輸入要規(guī)范,計(jì)算算式的對(duì)數(shù)要在對(duì)數(shù)符號(hào)后面把算式括起來,計(jì)算以其他數(shù)為底的對(duì)數(shù)可利用對(duì)數(shù)換底公式。對(duì)于括號(hào),本計(jì)算器的括號(hào)只有小括號(hào)();不接受中括號(hào) 和大括號(hào) ,且算式一定要以等號(hào)(=)結(jié)束。表1 符號(hào)及其含義符號(hào)含 義+加-減*乘/除冪!階乘pi圓周率sin正弦函數(shù)cos余弦函數(shù)tan正切函數(shù)log對(duì)角函數(shù)三、程序中的運(yùn)算特色輸入算式時(shí),請(qǐng)按照下列規(guī)則輸入:(一)四則運(yùn)算+加 -減 *乘 /除按常規(guī)輸入,負(fù)號(hào)用下劃線(_)代替,注意將其與減號(hào)區(qū)別;可用括號(hào)()界定優(yōu)先級(jí)。(二)冪運(yùn)算乘方輸入x
4、y(x的y次方)如236就是23的6次方;開方也這樣輸入如81(1/4)或者810.25表示81開4次方。(三)!階乘6!表示1*2*3*4*5*6,(1+3)!表示4的階乘,結(jié)果是24;1+3!表示1再加上3做階乘的結(jié)果,是7。(四)三角函數(shù)計(jì)算pi代表圓周率,即3.1415926536,本計(jì)算器利用弧度進(jìn)行三角函數(shù)計(jì)算;計(jì)算正弦請(qǐng)輸入sin,余弦輸入cos,正切輸入tan;sin(pi/2)就是二分之弧度對(duì)應(yīng)的正弦值(注意一定要打括號(hào))其他依此類推。(五)計(jì)算以10為底的對(duì)數(shù)結(jié)束i5Y請(qǐng)輸入log,如log1000=3,計(jì)算以e(2.718281828)為底的自然對(duì)數(shù)請(qǐng)輸入ln,如lne4
5、=4,注意指數(shù)的輸入要規(guī)范,如lne4=4,但是(lne)4=1,計(jì)算算式的對(duì)數(shù)要在對(duì)數(shù)符號(hào)后面把算式括起來,如ln(3+6*9),計(jì)算以其他數(shù)為底的對(duì)數(shù)可利用對(duì)數(shù)換底公式,如以2為底,16的對(duì)數(shù)可輸入ln16/ln2或者log16/log2結(jié)果都是4。(六)對(duì)于e和pi的計(jì)算可直接通過輸入e和pi進(jìn)行數(shù)值計(jì)算。(七)括號(hào)使用及算式結(jié)束要求本計(jì)算器的括號(hào)只有小括號(hào)();不接受中括號(hào) 和大括號(hào) ,且算式一定要以等號(hào)(=)結(jié)束。開始四、流程圖輸入需要的功能輸入2輸入0輸入1退出程序計(jì)算算式使用說明按任意鍵回到主界面輸入算式輸出結(jié)果結(jié)束圖3 例2-6程序流程圖五、程序部分功能實(shí)現(xiàn)截圖圖1 歡迎界面圖
6、2 使用說明界面圖3 計(jì)算界面六、程序源代碼/main.cpp#include<iostream>#include<cmath>#include<string>#include<iomanip>#include"1.h"using namespace std;int main() menu();return 0;/1.h#include<iostream>#include<cmath>#include<string>#include<iomanip>using namespace
7、 std;void menu();/位于calculate函數(shù)后面的菜單函數(shù)聲明void guide();/位于主函數(shù)后面的指導(dǎo)函數(shù)的聲明double D_Operate(double x,char op,double y) /雙目運(yùn)算符的運(yùn)算定義 double a;/計(jì)算結(jié)果 switch(op) case'+': a=x+y;break; case'-': a=x-y;break; case'*': a=x*y;break; case'/': a=x/y;break; case'': a=pow(x,y);br
8、eak;/冪運(yùn)算包括乘方和開方 /因?yàn)槎际抢胐ouble進(jìn)行運(yùn)算,因此不定義取模運(yùn)算 return a;double S_Operate(char op,double x) /前綴單目運(yùn)算符的運(yùn)算定義 double a;/計(jì)算結(jié)果 switch(op) case's': a=sin(x);break; case'c': a=cos(x);break; case't': a=tan(x);break; case'l': a=log10(x);break;/以10為底的對(duì)數(shù) case'n': a=log(x);bre
9、ak;/以e(2.718281828)為底的對(duì)數(shù) case'_': a=-x;break;/取負(fù)用下劃線代替負(fù)號(hào),定義為一元運(yùn)算 return a;char Precede(char op1,char op2) /判斷符號(hào)的優(yōu)先級(jí),op1在返回的結(jié)果符的左邊,op2在右邊/用于判定運(yùn)算符的優(yōu)先級(jí),以決定是把運(yùn)算符壓棧,還是把棧內(nèi)的運(yùn)算符彈出來進(jìn)行計(jì)算 if (op1='+'|op1='-')&&(op2='+'|op2='-'|op2=')'|op2='=')| (o
10、p1='*'|op1='/')&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='=') |(op1=''&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2=
11、39;t'|op2='_'|op2='l'|op2='n') |(op1='_'|op1='s'|op1='c'|op1='t'|op1='l'|op1='n')&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2=
12、't'|op2='_'|op2='l'|op2='n') return '>'/上述情況下棧頂運(yùn)算符優(yōu)先級(jí)高于待定運(yùn)算符,需彈棧 if (op1='('&&op2=')')|(op1='='&&op2='=') return '=' else return '<'int illegal_char(string s,int i)/非法輸入字符判定函數(shù) int j=0; while
13、(j<i) if (sj>='0'&&sj<='9') j+; else if (sj='+'|sj='-'|sj='*'|sj='/'|sj='.'|sj='('|sj=')'|sj=''|sj='!'|sj='e'|sj='_') j+; else if (sj='p'&&sj+1='i')|(sj=
14、39;l'&&sj+1='n') j+=2; else if (sj='s'&&sj+1='i'&&sj+2='n')|(sj='c'&&sj+1='o'&&sj+2='s')|(sj='t'&&sj+1='a'&&sj+2='n')|(sj='l'&&sj+1='o'&
15、amp;&sj+2='g') j+=3; /以上都是標(biāo)準(zhǔn)的數(shù)字字符和運(yùn)算符,如若存在其他形式的字符,則是非法輸入 else cout<<"程序終止,存在非法的字符輸入!"<<endl; return 0; return 1;/沒有非法字符返回1,否則返回0int match(string s)/棧結(jié)構(gòu)的括號(hào)匹配檢測(cè)函數(shù)int i=0,top=0;char stack50;while(si!='0')if (si='(')stacktop=si;top+;/push左括號(hào)壓入棧內(nèi)if (si=
16、39;)')if (stacktop-1='(')int a=i+1;stacktop-1=NULL;top-;/把與右括號(hào)匹配的左括號(hào)彈掉elsecout<<"括號(hào)輸入有誤"<<endl;return 0;/多了右括號(hào),括號(hào)失陪,返回非法/pop'('i+;if (top!=0)cout<<"括號(hào)輸入有誤"<<endl;return 0;/多了左括號(hào),括號(hào)失陪,返回非法return 1;/返回合法class NUMstack/運(yùn)算數(shù)棧public:double nu
17、m1000;int top;void start()/初始化棧清空棧頂指針置底for(int i=0;i<1000;i+)numi=0;top=0;void push(char a)/因?yàn)橛卸辔粩?shù)的運(yùn)算,因此不能一壓棧就提升棧頂指針numtop=numtop*10+(a-'0');/把字符轉(zhuǎn)成數(shù)因?yàn)槊看稳霔V耙?0,所以初始化要清0 double pop()top-;double number=numtop;numtop=0;return number;/彈棧函數(shù),彈掉棧頂元素,棧頂歸0,top指針下降double getTop()/取棧頂元素,但不必彈棧return
18、 numtop-1;void lift()/提升top指針的函數(shù)top+;class OPERstack/運(yùn)算符棧public:char oper1000;int top;void start()/初始化函數(shù)棧清空棧底放一"="用于判定算式結(jié)束 oper0='='for(int i=1;i<1000;i+) operi=NULL;top=1;/棧頂指針置于棧底的上一位 void push(char a) opertop=a;top+;/與數(shù)字棧不同一壓棧就可以提升指針 char pop() top-;char op=opertop;opertop=NU
19、LL;return op;/彈出計(jì)算符,用于計(jì)算 char getTop() return opertop-1;/取棧頂符號(hào),但不彈棧,可用于判定優(yōu)先級(jí) ; void calculate(string equation)/算式計(jì)算函數(shù)(關(guān)鍵函數(shù))NUMstack number;/定義運(yùn)算數(shù)棧變量numberOPERstack oper;/定義運(yùn)算符棧變量opernumber.start();oper.start();/把兩個(gè)棧初始化int i=0,len=0,k;char p,sig;double yuan1,yuan2;while(equationi!='0')len+;i+
20、;/計(jì)算等式長(zhǎng)度lenif(equationlen-1!='=')cout<<"輸入有誤沒有輸入終止符號(hào)-等號(hào)"=""<<endl;return;/檢測(cè)有沒有結(jié)束符等號(hào)"="int le;le=illegal_char(equation,len-1);if (le=0)return;/有非法字符,不進(jìn)行后續(xù)計(jì)算le=match(equation);if (le=0)return;/括號(hào)匹配非法,不進(jìn)行后續(xù)計(jì)算for(i=0;i<len;i+)/初步確定合法后開始計(jì)算算式if (equati
21、oni='!')/階乘是后綴單目運(yùn)算符單獨(dú)進(jìn)行計(jì)算yuan1=number.pop();/彈出棧頂元素做階乘if (yuan1=0)number.numnumber.top=0;/0的階乘為0,壓結(jié)果入棧number.lift();elsenumber.numnumber.top=1;for(k=1;k<=yuan1;k+)/階乘循環(huán)number.numnumber.top=k*number.numnumber.top;number.lift();/結(jié)果入站else if (equationi>='0'&&equationi<=
22、'9')number.push(equationi);/壓數(shù)字字符入棧if (equationi+1<'0'|equationi+1>'9')&&equationi+1!='.')number.lift();/當(dāng)整個(gè)多位運(yùn)算數(shù)讀取完畢后,運(yùn)算數(shù)棧棧頂指針才能提升 else if (equationi='p') number.numnumber.top=3.1415926536;/pi值即,圓周率,要壓入數(shù)字棧number.lift();i+;/pi是兩個(gè)字符所以要移動(dòng)掃描算式的指針往后跳
23、一個(gè) else if (equationi='e') number.numnumber.top=2.718281828459;/e,自然對(duì)數(shù)底數(shù),壓入運(yùn)算數(shù)棧number.lift(); else if (equationi='.')/小數(shù)壓棧代碼 int x=1;while(equationi+x>='0'&&equationi+x<='9')number.numnumber.top+=(equationi+x-'0')/pow(10,x);/第x位小數(shù)入棧x+;x-;number.l
24、ift();i=i+x; else if (equationi='(') oper.push(equationi);/左括號(hào)無條件壓棧 else/數(shù)階乘左括號(hào)判斷完畢后其他運(yùn)算符的分類討論 if(oper.top=1)/運(yùn)算符棧為空運(yùn)算符可以無條件入棧if(equationi='l'&&equationi+1='o')oper.push('l');else if(equationi='l'&&equationi+1='n')oper.push('n')
25、;/因?yàn)閘og和ln都是小寫字母l開頭,所以要分情況討論 elseoper.push(equationi); else/運(yùn)算符棧不為空則要進(jìn)行優(yōu)先級(jí)判斷 char temp1=oper.getTop();/取出棧頂符號(hào) char temp2;/待入棧符號(hào) if (equationi='l'&&equationi+1='o')temp2='l' else if (equationi='l'&&equationi+1='n')temp2='n'/log與ln的再次討論 e
26、lsetemp2=equationi;p=Precede(temp1,temp2); if (p='<')oper.push(temp2);/棧頂符優(yōu)先級(jí)較低現(xiàn)在待定的運(yùn)算符就可以入棧了 if (p='>'|p='=') char rep=p;/當(dāng)棧頂符優(yōu)先級(jí)不低于待入棧的符號(hào),則運(yùn)算符棧不停地彈棧 /進(jìn)行運(yùn)算直到低于待入棧符號(hào)為止,rep用于記錄比較結(jié)果,要多次進(jìn)行判斷 while(rep='>'|p='=')&&(oper.top-1>0) sig=oper.pop();
27、 yuan1=number.pop(); yuan2=number.getTop();/靠前的一個(gè)運(yùn)算數(shù)只要取得不要彈出來 if(sig='/'&&yuan1=0)/yuan1是雙目運(yùn)算符后面的第二運(yùn)算元 cout<<"計(jì)算時(shí)出錯(cuò)!出現(xiàn)了除數(shù)為0的情況!"<<endl; return; if(sig=''&&yuan2<0&&yuan1>0&&yuan1<1&&(static_cast <int>(1/yuan
28、1)%2=0)/對(duì)負(fù)數(shù)開偶次根號(hào)的限制 cout<<"計(jì)算時(shí)出錯(cuò)!出現(xiàn)了負(fù)數(shù)開偶次根號(hào)的情況!"<<endl; return; if (sig='_'|sig='s'|sig='c'|sig='t'|sig='l'|sig='n')/若為前綴單目運(yùn)算符 double tt;tt=S_Operate(sig,yuan1);number.numnumber.top=tt;/運(yùn)算結(jié)果壓回原來yuan1在棧內(nèi)的位置number.lift();/提升指針temp1=
29、oper.getTop();rep=Precede(temp1,temp2);/再判優(yōu)先級(jí) else number.num(number.top)-1=D_Operate(yuan2,sig,yuan1);temp1=oper.getTop();rep=Precede(temp1,temp2);/雙目運(yùn)算符的計(jì)算 if(equationi=')')/如果棧外符是右括號(hào)要把與之匹配的左括號(hào)彈出棧外oper.pop(); else if(equationi='l'&&equationi+1='o')oper.push('l
30、39;);/代表log的l else if(equationi='l')&&(equationi+1='n')oper.push('n');/代表ln的n elseoper.push(equationi); if(equationi='s'|equationi='c'|equationi='t'|(equationi='l'&&equationi+1='o')i=i+2; if(equationi='l'&&am
31、p;equationi+1='n')i+; /對(duì)于不止一個(gè)字符的運(yùn)算符,sin,log,ln等等,要移動(dòng)掃描算式的指針,往后跳一個(gè)或兩個(gè) if(number.num0=ceil(number.num0)cout<<equation<<number.num0<<endl; elsecout<<equation<<fixed<<setprecision(8)<<number.num0<<endl;/輸出結(jié)果控制精度8位小數(shù) /調(diào)試時(shí)檢查運(yùn)算結(jié)束后站內(nèi)情況的代碼段void menu()/菜
32、單函數(shù)cout<<"實(shí)數(shù)型科學(xué)算式計(jì)算器"<<endl;cout<<endl;cout<<"歡迎使用o(_)o !"<<endl;cout<<"請(qǐng)選擇你需要的功能:(0,1或者2)"<<endl;cout<<"-"<<endl;cout<<"1.使用說明"<<endl;cout<<"2.計(jì)算算式"<<endl;cout&l
33、t;<"0.退出程序"<<endl;cout<<"-"<<endl;cout<<"你的選擇是:"int choice;cin>>choice;switch(choice)case 0:return;case 1:guide();break;case 2:system("cls");char go_on='y'string equation;while(go_on='y')cout<<endl<<
34、endl<<"請(qǐng)輸入算式,以=(等號(hào))結(jié)束:"<<endl;cin>>equation;calculate(equation);cout<<"繼續(xù)使用嗎?是請(qǐng)輸入y 否則輸入n:"cin>>go_on;/可以循環(huán)進(jìn)行算式計(jì)算system("cls");menu(); void guide()/輸入規(guī)則介紹說明書system("cls");cout<<"使用說明:"<<endl;cout<<"
35、輸入算式時(shí),請(qǐng)按照下列規(guī)則輸入:"<<endl;cout<<"1.四則運(yùn)算+加 -減 *乘 /除按常規(guī)輸入,負(fù)號(hào)用下劃線(_)代替,注意將其與減號(hào)區(qū)別;可用括號(hào)()界定優(yōu)先級(jí)"<<endl;cout<<"2.冪:冪運(yùn)算如下乘方輸入xy(x的y次方)如236就是23的6次方;開方也這樣輸入如81(1/4)或者810.25表示81開4次方"<<endl;cout<<"3.!階乘:6!表示1*2*3*4*5*6;(1+3)!表示4的階乘,結(jié)果是24;1+3!表示1再加上3做階乘的結(jié)果,是7"<<endl;cout<<"4.pi代表圓周率,即3.1415926536,本計(jì)算器利用弧度進(jìn)行三角函數(shù)計(jì)算;計(jì)算正弦請(qǐng)輸入sin,余弦 輸入cos,正切輸入tan;sin(pi/2)就是二分之弧度對(duì)應(yīng)的正弦值(注意一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度教育培訓(xùn)檔口租賃合同
- T-ZJCX 0046-2024 簾子線直捻機(jī)
- 二零二五年度公車私用行為規(guī)范與責(zé)任追究協(xié)議
- 二零二五年度全新碼頭租賃協(xié)議及倉(cāng)儲(chǔ)服務(wù)合作協(xié)議
- 2025年度果園租賃與農(nóng)業(yè)科技研發(fā)合同
- 二零二五年度廣告代理合同解除與權(quán)益調(diào)整協(xié)議
- 2025年度高科技企業(yè)計(jì)件工資勞動(dòng)合同
- 2025年度智能合同履約跟蹤與風(fēng)險(xiǎn)控制管理辦法
- 2025年度消防設(shè)施定期維護(hù)與消防通道清理合同
- 二零二五年度美發(fā)店員工勞動(dòng)健康保險(xiǎn)與意外傷害合同
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)附答案
- 2025屆高考英語(yǔ)二輪復(fù)習(xí)備考策略課件
- 《高鐵乘務(wù)安全管理與應(yīng)急處置(第3版)》全套教學(xué)課件
- 歷年湖北省公務(wù)員筆試真題2024
- 2.2 說話要算數(shù) 第二課時(shí) 課件2024-2025學(xué)年四年級(jí)下冊(cè)道德與法治 統(tǒng)編版
- 《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)
- 潔凈室空調(diào)凈化系統(tǒng)驗(yàn)證方案(通過BSI和華光審核)
- 2024年電力交易員(中級(jí)工)職業(yè)鑒定理論考試題庫(kù)-下(多選、判斷題)
- 數(shù)學(xué)物理方程(很好的學(xué)習(xí)教材)PPT課件
- 電力建設(shè)工程質(zhì)量監(jiān)督檢查大綱新版
- GB-T-15894-2008-化學(xué)試劑-石油醚
評(píng)論
0/150
提交評(píng)論