C課程設計復數(shù)計算器_第1頁
C課程設計復數(shù)計算器_第2頁
C課程設計復數(shù)計算器_第3頁
C課程設計復數(shù)計算器_第4頁
C課程設計復數(shù)計算器_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

年4月19日C課程設計復數(shù)計算器文檔僅供參考C++課程設計實驗報告姓名學號班級合作者學號班級任課教師時間教師指定題目復數(shù)計算器評定難易級別A級實驗報告成績

復數(shù)計算器程序功能設計程序功能的總體結構復數(shù)計算器的程序總體功能可設計成如圖1所示,能夠看出,復數(shù)計算器的各種功能都用菜單選項列出,用戶能夠根據(jù)需要選擇相應的菜單項,從而執(zhí)行不同的子程序以完成相應的功能。2.課程設計要求一開始運行程序,要有詳細的菜單選項界面,用戶不選擇退出就能夠重復運算。能夠進行多個操作數(shù)的復數(shù)運算,輸入0+0*i時為止。編寫能夠對輸入的復數(shù)求模的成員函數(shù)。編寫具有測試功能的函數(shù),即計算機能夠自動出題,并要求用戶計算,同時計算機判斷用戶計算的對錯并打分,要求十題為一個單元,每題一個運算符,運算符包括+,-,*三種,參與加減運算實部虛部為一位數(shù)。重載輸入輸出運算符,對復數(shù)的輸入既可采用實部虛部分開提示輸入,也可直接輸入諸如a+i*b或a+ib這種形式,對復數(shù)的輸出要考慮實部虛部的正負號,經(jīng)過判斷給出的輸出結果。

開始開始輸出菜單及提示信息輸出菜單及提示信息輸入選擇輸入選擇是否做加法是否做加法N是否做減法N是否做減法Y是否進行測試N是否進行測試加法子程序Add()Y加法子程序Add()......……減法子程序Y減法子程序測試子程序測試子程序是否退出是否退出NY結束結束程序設計思想1)類的封裝程序中將復數(shù)形式的數(shù)據(jù)定義成一個復數(shù)類CComplex,重載了加法及減法等運算符,使函數(shù)的加減等運算像一般數(shù)據(jù)一樣方便.每個運算符重載都用一個函數(shù)去實現(xiàn)。參考類的定義如下:classCComplex{private: doubleReal,Image;public: CComplex(doublereal=0,doubleimage=0)//構造函數(shù) {Real=real;Image=image;} friendistream&operator>>(istream&is,CComplex&com);//重載輸入 friendostream&operator<<(ostream&os,CComplex&com);//重載輸出 CComplexoperator+(CComplex&com);CComplexoperator-(CComplex&com);//減法重載 CComplexoperator*(CComplex&com);//乘法重載 CComplexoperator/(CComplex&com);//除法重載intoperator==(CComplex&com);intoperator!=(CComplex&com);intoperator>(CComplex&com); intoperator<(CComplex&com); floatModule(void);//復數(shù)求模};(2)設計的任務要求1在實際應用中,輸入復數(shù)可能為a+bi,a,bi,-a,-bi,+i.–i.I等形式。重載輸入運算符應該能識別這樣形式多樣的復數(shù)。因此在重載輸入函數(shù)時要綜合考慮上述各種輸入形式??尚械奶幚矸绞绞牵涸谥剌d輸入函數(shù)中,設計用(3)設計的任務要求2在程序中設計一個復數(shù)運算的測試函數(shù)Test(),其功能是讓計算機隨機出10道運算題,用戶給出答案,同時計算機實時判斷對錯并能夠打分。這個函數(shù)的關鍵是讓計算機隨機產(chǎn)生復數(shù)對象和運算符,計算機內(nèi)部有一個隨機數(shù)發(fā)生器,能夠產(chǎn)生一個固定順序的整型隨機數(shù)序列,調(diào)用語句為“inta=rand();”這時,a就是該隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù)。由于產(chǎn)生的隨機書數(shù)在整數(shù)范圍內(nèi),為測試方便,按程序設計要求,產(chǎn)生的隨機復數(shù)對象實部和虛部在100以內(nèi),運算符只有加減兩種。因此,需要對產(chǎn)生的隨機數(shù)進行進一步的處理,用隨機數(shù)模除以除以100,產(chǎn)生出100以內(nèi)的隨機整數(shù);同樣,用隨機數(shù)模除以3,能夠產(chǎn)生出0、1、3三個隨機數(shù)據(jù),定義0為加法,1為減法,2為乘法,這樣就能夠產(chǎn)生出隨機的復數(shù)對象的加減乘運算了。能夠參見圖2測試子程序Test()結構框圖。

設置循環(huán)次數(shù)為10設置循環(huán)次數(shù)為10用兩個隨機數(shù)初始復數(shù)對象3用兩個隨機數(shù)初始復數(shù)對象3產(chǎn)生8個100以內(nèi)的隨機數(shù)隨機數(shù)最后兩個隨機數(shù)初始復數(shù)對象4最后兩個隨機數(shù)初始復數(shù)對象4前兩個隨機數(shù)初始復數(shù)對象1用戶輸入結果兩對象相乘后兩個隨機數(shù)用戶輸入結果兩對象相乘后兩個隨機數(shù)初始復數(shù)對象2結果是否正確產(chǎn)生2以內(nèi)的隨機數(shù)opN結果是否正確產(chǎn)生2以內(nèi)的隨機數(shù)opY總分加10Op為0總分加10Op為0兩對象相減兩對象相加兩對象相減兩對象相加用戶輸入結果用戶輸入結果用戶輸入結果用戶輸入結果結果是否正確結果是否正確結果是否正確結果是否正確NN輸出出錯信息輸出出錯信息輸出出錯信息YY輸出出錯信息輸出出錯信息輸出出錯信息總分加10總分加10總分加10總分加10輸出總分輸出總分結束結束(4)設計的任務要求3在程序中重載了>>運算符,其功能是讓用戶能夠直接輸入a+bi,a+b*i兩種形式的復數(shù),其結構框圖如圖3所示。以字符串的形式接受復數(shù)對象以字符串的形式接受復數(shù)對象求字符串長度求字符串長度初試化當前數(shù)值n=0,字符變量sign=1字符串是否存在非法字符字符串是否存在非法字符Y輸出錯誤信息,函數(shù)返回輸出錯誤信息,函數(shù)返回是否判別完字符串中所有字符N是否判別完字符串中所有字符Y最后一個字符不是最后一個字符不是‘i’且n!=0當前字符為+、-號,同時n!=0N當前字符為+、-號,同時n!=0復數(shù)對象只有實部,前面取出的數(shù)值賦給實部復數(shù)對象只有實部,前面取出的數(shù)值賦給實部N前面取出的數(shù)值賦給實部,n=0N前面取出的數(shù)值賦給實部,n=0結束當前字符是否是結束當前字符是否是‘+’N Sign=1,k++Sign=1,k++當前字符是否是當前字符是否是‘-’NSign=-1,k++Sign=-1,k++當前字符是否是為‘i’當前字符是否是為‘i’‘i‘i’是否是最后一個字符NYYN輸出錯誤信息,函數(shù)返回當前字符是否是數(shù)字字符NN輸出錯誤信息,函數(shù)返回當前字符是否是數(shù)字字符N將字符轉變?yōu)閿?shù)值N將字符轉變?yōu)閿?shù)值NY程序界面開始界面運行結果界面4.程序源代碼及詳細注解:#include<iostream.h>#include<math.h>#include<stdlib.h>#include<string.h>#defineZ1e-6classCComplex{private: doubleReal,Image;public: CComplex(doublereal=0,doubleimage=0)//構造函數(shù) {Real=real;Image=image;} friendistream&operator>>(istream&is,CComplex&com);//重載輸入 friendostream&operator<<(ostream&os,CComplex&com);//重載輸出 CComplexoperator+(CComplex&com);CComplexoperator-(CComplex&com);//減法重載 CComplexoperator*(CComplex&com);//乘法重載 CComplexoperator/(CComplex&com);//除法重載intoperator==(CComplex&com);intoperator!=(CComplex&com);intoperator>(CComplex&com); intoperator<(CComplex&com); floatModule(void);//復數(shù)求模 };CComplexCComplex::operator+(CComplex&com)//加法重載{ CComplext;//定義類對象 t.Real=Real+com.Real;//實部相加 t.Image=Image+com.Image;//虛部相加 returnt;}CComplexCComplex::operator-(CComplex&com)//減法重載{ CComplext;//定義類對象 t.Real=Real-com.Real;//實部相減 t.Image=Image-com.Image;//虛部相減 returnt;}CComplexCComplex::operator*(CComplex&com)//乘法重載{ CComplext;//定義類對象 t.Real=Real*com.Real-com.Image*Image;//乘法實部 t.Image=Real*com.Image+Image*com.Real;//乘法虛部 returnt;}CComplexCComplex::operator/(CComplex&com)//除法重載{ CComplext;//定義類對象 t.Real=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image);//除法實部 t.Image=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image);//除法虛部 returnt;}/*intCComplex::operator!=(CComplex&com)//重載“!=”運算符,分別判斷復數(shù)的實部與虛部{ if(*this==com) return0; else return1;}*/intCComplex::operator>(CComplex&com)//重載“>”運算符,比較復數(shù)的模{ if(Module()>com.Module()) return1;//大于,則返回1 else return0;}intCComplex::operator<(CComplex&com)//重載“<”運算符,比較復數(shù)的模{ if(Module()<com.Module()) return1;//小于,則返回1 else return0;}floatCComplex::Module(){ floatt; t=sqrt(Real*Real+Image*Image); returnt;// cin.get();// cin.get();}intCComplex::operator==(CComplex&com)//重載“==”運算符,分別判斷兩個復數(shù)對象的實部與虛部{ if(Real==com.Real&&Image==com.Image) return1;//實部與虛部分別相等返回1 elsereturn0;}voidAdd(){CComplexa1,a2,sum,f(0,0);cout<<"加法計算"<<endl<<"最少輸入兩個復數(shù),并以零結束"<<endl;cout<<"第一個復數(shù)"<<endl;cin>>a1;cout<<"第二個復數(shù)"<<endl;cin>>a2;sum=a1+a2;cout<<"第三個復數(shù)"<<endl;cin>>a1;inti=4;while(!(a1==f)){sum=sum+a1;cout<<"第"<<i<<"個復數(shù)"<<endl;cin>>a1;i++;}cout<<"結果"<<sum<<endl;cout<<"按任意鍵繼續(xù)"<<endl;//cout.flush();cin.get();}voidSub(){CComplexa1,a2,sub,f(0,0);cout<<"減法計算"<<endl<<"最少輸入兩個復數(shù),并以零結束"<<endl;cout<<"第一個復數(shù)"<<endl;cin>>a1;cout<<"第二個復數(shù)"<<endl;cin>>a2;sub=a1-a2;cout<<"第三個復數(shù)"<<endl;cin>>a1;inti=4;while(!(a1==f)){sub=sub-a1;cout<<"第"<<i<<"個復數(shù)"<<endl;cin>>a1;i++;}cout<<"結果:"<<sub<<endl;cout<<"按任意鍵繼續(xù)"<<endl;//cout.flush();cin.get();}voidMul(){CComplexa1,a2,mul,f(0,0);cout<<"乘法計算"<<endl<<"最少輸入兩個復數(shù),并以零結束"<<endl;cout<<"第一個復數(shù)"<<endl;cin>>a1;cout<<"第二個復數(shù)"<<endl;cin>>a2;mul=a1*a2;cout<<"第三個復數(shù)"<<endl;cin>>a1;inti=4;while(!(a1==f)){mul=mul*a1;cout<<"第"<<i<<"個復數(shù)"<<endl;cin>>a1;i++;}cout<<"結果:"<<mul<<endl;cout<<"按任意鍵繼續(xù)"<<endl;//cout.flush();cin.get();}voidDiv(){CComplexa1,a2,div,f(0,0);cout<<"除法計算"<<endl<<"最少輸入兩個復數(shù),并以零結束"<<endl;cout<<"第一個復數(shù)"<<endl;cin>>a1;cout<<"第二個復數(shù)"<<endl;cin>>a2;div=a1/a2;cout<<"第三個復數(shù)"<<endl;cin>>a1;inti=4;while(!(a1==f)){div=div/a1;cout<<"第"<<i<<"個復數(shù)"<<endl;cin>>a1;i++;}cout<<"結果:"<<div<<endl;cout<<"按任意鍵繼續(xù)"<<endl;//cout.flush();cin.get();}voidCompare(void){ cout<<"復數(shù)模比較"<<endl; CComplexa1,a2; cout<<"輸入兩個復數(shù):"<<endl; cout<<"第一個復數(shù):"; cin>>a1; cout<<"第二個復數(shù)"; cin>>a2; if(a1==a2) cout<<"這兩個復數(shù)相等"<<endl; elseif(a1>a2) cout<<a1<<"的模大于"<<a2<<"的模"<<endl; elseif(a1<a2) cout<<a1<<"的模小于"<<a2<<"的模"<<endl;cout<<"按任意鍵繼續(xù)"<<endl; cin.get();}istream&operator>>(istream&is,CComplex&com){//重載輸入,能夠輸入a+bi,也能夠輸入a+b*i chars[100]; is>>s;//字符串s用于接收復數(shù) intlen=strlen(s); intn=0,sign=1;//n為當前從字符串中提取出來的數(shù)字,初始化為0;sign為n的符號,初始化為正 com.Image=com.Real=0; if(len==4) { for(intk=0;k<len;k++)//判斷字符串是否合法 { if((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i')) { cout<<"Error"<<endl;//若字符串不是1~9的數(shù)字或“+”、“-”、“=”則錯誤,輸出Error returnis; } } for(k=0;k<len;)//依次識別字符串中和字符 { if(n!=0&&(s[k]=='-'||s[k]=='+'))//判斷是否為符號位 { com.Real=sign*n;//是符號,且n!=0,n已被賦值,當前讀取的是虛部的符號 n=0;//將sign*n的值賦給實部,然后n清零,準備接受虛部的值 } if(s[k]=='-') { sign=-1;k++;//給符號標志賦值 } if(s[k]=='+') { sign=1;k++;//給符號標志賦值 } if(s[k]=='i')//若當前字符為i { if(k!=len-1)//判斷i是否為最后一個字符 cout<<"error\n";//若不是,則復數(shù)輸入格式錯誤 else com.Image=sign*n; //是最后一個字符,復數(shù)對象已接收完畢,用sign*n給虛部賦值 break; }while(s[k]>='0'&&s[k]<='9')//當字符在0~9之間是,將數(shù)字字符轉化為數(shù)字數(shù)值 { n=n*10+s[k]-'0'; k++; } } if(s[len-1]!='i'&&n!=0)//如果最后一個字符不是i,表示復數(shù)只有實部,沒有虛部 com.Real=n*sign; returnis;}else{ for(intk=0;k<len;k++)//依次識別字符串中和字符 { if((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i'&&s[k]!='*')) //若字符串不是1~9的數(shù)字或“+”、“-”、“=”、“*”則錯誤,輸出Error { cout<<"Error"<<endl; returnis; } } for(k=0;k<len;)//依次識別字符串中和字符 { if(n!=0&&(s[k]=='-'||s[k]=='+'))//判斷是否為符號位 { com.Real=sign*n; n=0; } if(s[k]=='-') { sign=-1;k++;//給符號標志賦值 } if(s[k]=='+') { sign=1;k++;//給符號標志賦值 } if(s[k]=='*')//若當前字符為* { k++; com.Image=sign*n; } if(s[k]=='i')//若當前字符為i { if(k!=len-1)//判斷i是否為最后一個字符 cout<<"error\n";//若不是,則復數(shù)輸入格式錯誤 //else //com.Image=sign*n; break; }while(s[k]>='0'&&s[k]<='9')//當字符在0~9之間是,將數(shù)字字符轉化為數(shù)字數(shù)值 { n=n*10+s[k]-'0'; k++; } } if(s[len-1]!='i'&&n!=0)//如果最后一個字符不是i,表示復數(shù)只有實部,沒有虛部 com.Real=n*sign; returnis;}}ostream&operator<<(ostream&os,CComplex&com)//重載輸出{ if(fabs(com.Image)<Z)//如果虛部為零 os<<com.Real;//只輸出實部; elseif((fabs(com.Real)<Z))//如果實部為零 os<<com.Image<<"i";//只輸出虛部 elseif(com.Image>0) os<<com.Real<<"+"<<com.Image<<"i";//虛部為正,用“+”連接實部與虛部 else os<<com.Real<<com.Image<<"i";//虛部為負,虛部的符號連接實部與虛部returnos;}voidTest(void){ double real1,real2,real3,real4,image1,image2,image3,image4; CComplexanswer,f5; intscore=0; charop; for(inti=1;i<=10;i++){ real1=rand()%200-100;//產(chǎn)生隨機的兩位數(shù),可正可負image1=rand()%200-100;real2=rand()%200-100;image2=rand()%200-100; CComplexf1(real1,image1),f2(real2,image2); //用隨機產(chǎn)生的兩位數(shù)初始化類對象 real3=rand()%20-10; //產(chǎn)生隨機的一位數(shù) image3=rand()%20-10; real4=rand()%20-10; image4=rand()%20-10; CComplexf3(real3,image3),f4(real4,image4); //用隨機產(chǎn)生的一位數(shù)初始化類對象 op=rand()%3;//隨即產(chǎn)生3種運算符 cout<<"第"<<i<<"題:"; switch(op){ case0: answer=f1+f2; cout<<f1<<"加上"<<f2<<"等于"; break;case1: answer=f1-f2; cout<<f1<<"減去"<<f2<<"等于"; break; case2://乘法用實部、虛部都是一位的對象answer=f1*f2; cout<<f1<<"乘以"<<f2<<"等于"; break; } cin>>f5; if(answer==f5){//判斷結果是否正確 cout<<"此題做對了"<<'\n'; cout<<"加十分:"<<'\n'; score+=10;}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論