C++程序設計實驗報告_第1頁
C++程序設計實驗報告_第2頁
C++程序設計實驗報告_第3頁
C++程序設計實驗報告_第4頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一章 程序設計同步實驗指導實驗… VisualC++集成開發(fā)環(huán)境(IDE)入門ー、實驗目的初步學會使用VisualC++集成開發(fā)環(huán)境:①進入和退出;②菜單、工具欄的使用;③用戶窗口區(qū)的劃分:workspace,scourcefile,message,初步了解調(diào)試程序方法。二、實驗內(nèi)容1.范例:VisualC++控制臺應用程序設計步驟。作為學習面向?qū)ο蟮腃++的第一步,學習的重點是算法,必須避免用戶圖形界面的干擾,這時可采用控制臺應用程序進行練習??刂婆_應用程序創(chuàng)建一個窗ロ模擬DOS進行輸入輸出。下面是一個控制臺應用程序?qū)嵗?該程序要求用戶從鍵盤輸入3個整數(shù),然后按照從小到大的順序在屏幕上輸出。[步驟ー]進入和退出VisualC++集成開發(fā)環(huán)境啟動并進入VisualC++集成開發(fā)環(huán)境有至少有三種方法:(1)在開始菜單上,選擇程序,然后選擇MicrosoftVisualStudio6.0組,再選擇MicrosoftVisualC++6.0,如圖!.1.(2)在桌面上創(chuàng)建MicrosoftVisualC++6.0的快捷方式,宜接雙擊該圖標:(3)如果已經(jīng)創(chuàng)建了VC的某種工程,雙擊該工程的dsw(DevelopStudioWorkshop)文件圖標,也可進入集成開發(fā)環(huán)境,并打開該工程。選擇FilelExit菜單,退出集成開發(fā)環(huán)境。圖1.!進入VisualC++集成開發(fā)環(huán)境[步驟ニ]創(chuàng)建一個控制臺應用程序工程。Qr金!①メ電儀歐陽6f如□師心…(1)入VC環(huán)境后,選擇FilelNew菜單,彈出New對話框,在Projects頁面選擇Win32ConsoleApplication工程類型,在Projectname編輯框輸入工程名Expl_l,在Qr金!①メ電儀歐陽6f如□師心…M 出メ8”夕OtUotkExpr?ttQFmloviFliytrS 日記父羞レi誡險圖1.2NewProject頁面,創(chuàng)建新的應用程序圖1.3Win32ConsoleApplicationStep1of1(2)隨后的Win32ConsoleApplicationStep1of1中,參見圖!.3,選擇anemptyproject,按Finish按鈕。(3)現(xiàn)ProjectInformation框,如圖1.4。顯示創(chuàng)建了一個空的控制臺應用程序,且沒有任何文件被添加到新工程中,此時,工程創(chuàng)建完成。圖1.4NewProjectInformation窗ロ[步驟三]程序的編輯、編譯、建立、執(zhí)行。(1)選擇FilelNew菜單項,在New對話框的Files頁面選擇C++SourceFile,輸入文件名Expl_l.cpp,選中AddtoProject復選框,如圖1.5,按OK按鈕,打開了源文件編輯窗口。輸入以下源代碼。#include<iostream>usingnamespacestd;3intmain(){inta,b,c;intmax,min;coutvぐ請輸入三個不等整數(shù):\n";cin?a?b?c;if(a>b)! 〃A行max=a;min=b;}else{ //B行max=b;min=a;}if(c>max) cout<<c?'\t,?max?At,?min?Anelseif(c<min)cout?max?'\t,?min?\t,?c?'\n';elsecout?max?\t'?c?At'?min?'\n,;return0;?對于已經(jīng)存在的源文件,選擇PrqjectlAddtoPrqjectlFiles…菜單項,在隨后扌所的脳変他防舌框中選擇待添加文件,按OK添加進工程。(2)選擇BuildICompile菜單項,即可編譯源文件Expl_l.cpp,系統(tǒng)會在Output窗口給出Error(錯誤)信息以及Warning(警告)信息。當所有Error改止后,得至リ冃標文件(Expl」.。西)。編譯器在Output窗口給出語法錯誤和編譯錯誤信息。語法錯誤(Error)處理:鼠標雙擊錯誤信息可跳轉(zhuǎn)到錯誤源代碼處進行修改,ー個語法錯誤可能引發(fā)系統(tǒng)給出很多條Error信息,因此,發(fā)現(xiàn)ー個錯誤并修改后最好重新編譯ー次,以便提髙工作效率;警告信息(Warning)處理:一般是觸發(fā)了C\C++的自動規(guī)則,如將一個浮點型數(shù)據(jù)給整型變量賦值,需要系統(tǒng)將浮點型數(shù)據(jù)自動轉(zhuǎn)換為整型,此時小數(shù)部分會丟失,因而系統(tǒng)給出警告信息。警告信息不會影響程序執(zhí)行,本例可以通過強制類型轉(zhuǎn)換去掉警告信息。(3)選擇BuildlBuild菜單項,鏈接并建立工程的EXE文件,得到可執(zhí)行文件Expl_l.exe。這時編譯器可能會給出鏈接錯誤。鏈接錯誤(LinkingError)處理:鏈接時可能產(chǎn)生錯誤,原因可能是所需要的庫文件或目標文件缺少,或程序中調(diào)用的Extern函數(shù)沒有定義等,只要補充相應文檔再重新建立即可。(4)選擇BuildlExecute菜單項,執(zhí)行工程文件,會出現(xiàn)ー個類似DOS操作系統(tǒng)的窗口,光標閃爍等待輸入,按要求輸入三個不等的整數(shù)后按Enter鍵,屏幕運行程序,可能會發(fā)現(xiàn)程序沒有編譯錯誤,也能執(zhí)行,但執(zhí)行的結(jié)果不對,此時,除了仔細分析源程序,還可借助調(diào)試工具進行跟蹤調(diào)試。例如,在例1」程序中B行處出錯,在else后多加一個分號:...else;{max=b;min=a;)用88,45,67這組數(shù)據(jù)測試,發(fā)現(xiàn)輸出結(jié)果為674588,結(jié)果不對。下面介紹調(diào)試過程。首先在源程序屮可能出現(xiàn)錯誤的行上設置斷點,方法是將光標移至該行,然后按F9鍵,或選擇工具欄上的手形按鈕(再按一次取消斷點),此時該行左側(cè)出現(xiàn)ー個紅色圓點,斷點設置成功,如圖1.7在A行設置斷點。選擇BuildIStartDebugIGo...菜單命令(也可選擇Build工具欄上的Go圖標),程序執(zhí)行到斷點處停止,這時選擇ViewlDebugWindows子菜單的Watch和Variables兩個菜單項,打開監(jiān)視和變量窗口觀察變量值(Watch和Variables窗ロ的詳細介紹見VisualC++6.0集成開發(fā)環(huán)境介紹中菜單的View菜單介紹),分析査找出錯原因。在Watch窗口加入max和min兩個變量,進行監(jiān)視。Watch窗口的每一行可顯示一個變量,左欄顯示變量名,雙擊它可進行編輯:右欄顯示變量值。單步執(zhí)行按F10(不跟蹤進函數(shù))或F11(跟蹤進函數(shù)內(nèi)),盡管a>b,在執(zhí)行了if后面的{max=a;min=b;}后,仍然執(zhí)行了{max=b;min=a;}。當程序執(zhí)行到箭頭所指處時,max=45,min=88,如圖1.7,與預期結(jié)果不相符,說明程序的流程有問題。此時再仔細分析源程序,發(fā)現(xiàn)問題出在else后多余的分號。圖1.7VisualC++ 集成開發(fā)環(huán)境及程序的調(diào)試調(diào)試過程中Variables窗口動態(tài)顯示各變量值隨程序執(zhí)行而變化的結(jié)果。在學習到面向?qū)ο蟪绦蛟O計后,若程序中有類的對象,Variables窗口的this頁面可顯示當前this指針所指向?qū)ο蟮母鱾€值。修改源程序,再執(zhí)行,反復調(diào)試,當程序中所有問題都得到改正后,得到正確的執(zhí)行結(jié)果。實驗二簡單的C++程序設計.簡單程序設計,掌握C++程序基本結(jié)構。ー、實驗目的.掌握C++基本數(shù)據(jù)類型與運算符。3,熟悉輸入輸出方法。二、實驗內(nèi)容1.范例:要求實現(xiàn)輸入兩個整數(shù),將它們交換后輸出。[分析]交換兩個整數(shù),一般方法是用ー個中間變量,經(jīng)過幾次賦值實現(xiàn);[過程]①首先在資源管理器中,在用戶盤(硬盤)創(chuàng)建自己的文件夾,如可以自己的學號為名建立文件夾。②進入VC環(huán)境,選擇FilelNew菜單,彈出New對話框,在Projects頁面選擇Win32ConsoleApplication工程類型,在Projectname編輯框輸入工程名Exp2_l,路徑選擇自己的文件夾,按OK按鈕。③在隨后的ApplicationWizard中選擇anemptyproject?按Finish按鈕。④選擇FilelNew菜單項,在New對話框的Files頁面選擇C++SourceFile,輸入文件名Exp2_l.cpp,選中AddtoProject復選框,按OK按鈕,打開了源文件編輯窗口,輸入以下源代碼。#include<iostream>usingnamespacestd;intmain(){inta=-3,b=7,temp;cout?"a=,'?a?\t'?,'b="?b?endl;temp=a;a=b;b=temp;cout?"a=,'?a?V,?"b="?b?endl;return0;}[分析二](可選)第二種方法采用按位異或,任一位與。異或保持不變,而與1異或后翻轉(zhuǎn)(0變1,1變0)。vl=a;v2=b;〃原vl為a,v2為bvl=v?v2;〃即VI為aAb,V2保持不變v2=v1Av2;〃即v2=aAbAb=avl=v1Av2;〃即vl=aAbAa=b,交換成功#include<iostream>usingnamespacestd;intmain(){inta=-3,b=7,temp;cout?"a=,'?a?\t'?,'b="?b?endl;a=aAb;b=aAb;a=aAb;cout?,'a=,'?a?V,?Mb="?b?endl;return0;)[實驗要求]①仔細閱讀程序,掌握程序結(jié)構,找到程序的數(shù)據(jù)定義部分和操作部分,辨識各部分功能,注意輸入輸出語句的使用;②按照正確的步驟進入VC環(huán)境,在自己創(chuàng)建的工程中錄入上述源程序,注意書寫格式,養(yǎng)成良好的編程習慣;消除語法錯誤,編譯鏈接程序;③運行程序,輸入數(shù)據(jù)觀察結(jié)果,并進行測試。④用位運算符重新運行程序并対比運行結(jié)果。(可選).編寫程序:輸入球的半徑,分別計算球的表面積、體積和質(zhì)量,假設球的密度為7.8,輸出計算結(jié)果。4[提示]球表面積計算公式s=4ロ,2球體積計算公式v=7tr,33注意輸入輸出形式,要求輸入前應有提示性輸出,如"PleaseInputtheRadiusoftheBall...",注意變量名的定義,最好能望文生義,如Radius,Volume,Weight等;整數(shù)相除取整,注意在計算公式中使用正確的變量數(shù)據(jù)類型。.范例:要求用sizeof運算符計算C++中char,short,int,long,float,double等基本數(shù)據(jù)類型所占字節(jié)數(shù),并按以下格式輸出。sizeof(char)=1bytesizeof(short)=2bytessizeof(int)=4bytes再將計算結(jié)果以表格形式輸出。TOC\o"1-5"\h\zchar 1short 2int 4最后將計算結(jié)果保存在數(shù)組中,再按表格形式輸出。#include<iostream>usingnamespacestd;intmain(){intsize[6J;cout?',sizeof(char)=,'?sizeof(char)?,,Byte,,?endl;cout?',sizeoftshort)=',?sizeof(short)?,,Byte,,?endl;cout?,'sizeof(int)="?sizeof(int)?',Byte"?endl;cout?"sizeof(long)=,,?sizeof(long)?"Byte,,?endl;cout?Msizeof(float)=n?sizeof(float)?"ByteH?endl;cout?,,sizeof(double)="?sizeof(double)?"Byte",?endl;cout?Mchar\t"?sizeof(char)?endli 〃表格方式輸出cout?,,short\t"?sizeof(short)?endl;cout?,,int\t,'?sizeof(int)?endl;cout?"long\tH?sizeof(long)?endI;cout?,'float\t,'?sizeof(float)?endl;cout?,,double\tH?sizeof(double)?endl;size[0]=sizeof(char)1 〃字節(jié)數(shù)存入整型數(shù)組size[l]=sizeof(short);size[2]=sizeof(int);size[3]=sizeof(long);size[4]=sizeof(float);size[5]=sizeof(double);cout?Mchar\tn?size[0]?endli 〃再用數(shù)組以表格方式輸出cout?"short\tM?size(1]?endl;cout?,,inl\t,,?size|2|?endl;cout?,'long\t,'?size[3]?endl;cout?"float\t"?size[4]?endl;cout?,,double\t',?size[5]?endl;return0;}.范例:演示C++輸入輸出易出錯的兒個地方:①采用cin輸入將會跳過空白字符(包括空格,制表,backspace和回車等)。如果要求把從鍵盤上輸入的所有字符,包括空白字符,都作為輸入字符賦給字符變量,必須使用函數(shù):cin.get(字符變量),但這時如前面曾有輸入,會讀入不是希望獲取的數(shù)字輸入結(jié)朿的回車符。②向ー個字符數(shù)組中輸入字符串時,應該使用函數(shù):getline(字符數(shù)組,字符數(shù)量)。這時如前面曾有輸入,會讀入輸入結(jié)束的回車符,形成空串。③當使用老的頭文件<iosmam.h>時,數(shù)字輸入時如以O開頭,計算機認為是8進制數(shù),以Ox開頭是16進制。當使用不帶.h的頭文件<iostream>時,0被忽略,仍作為十進制,Ox開頭只認〇〇要適當?shù)刂付〝?shù)據(jù)的進制。非十進制只適用于整型變量,不適用于實型變量。#include<iostream>usingnamespacestd;intmain(){chara[20];inti;coutvv”請輸入以下包含空格的字符串:It,sabook.M?endl;cin?a[0]?a[l]?a[2]?a|3]?a|4]?a[5|?a[6]?a[7]?a|81?a|9];a[10]=M)';coutvv"保存的是:"vvavvendl;coutvv”請重輸一遍:"vvendl;cin.get(a[0]);cin.get(a[l]);cin.get(a[2]);cin.get(a[3]);cin.get(a[4]);cin.get(a[5]);cin.get(a[6]);cin.get(a[7]);cin.get(a[8]);cin.get(a[9]);cin.get(a[10]);cin.get(a[11]);cin.get(a[I2]);cin.get(a[14]);a[15]=A0,;coutvv"保存的是:"vvendl;cout?a?endl;coutvv"注意:a[0]放上次輸入結(jié)束的回車符,a[14]放本次結(jié)束的回車符,各自產(chǎn)生一個換行。"vvendl;coutvv"請輸入8進制整數(shù):0750"vvendl;cin?i;coutv<”輸入的數(shù)用十進制表示是:M?endl;cout?dec?i?endl;cout?M請輸入16進制整數(shù):Oxff'?endkcin?i;couiv<”輸入的數(shù)用十進制表示是:"vvendl;coul?dec?i?endl;coutvv”用cin.getline()吸收。后的字符:H?endl;cin.getline(a.18);cout?a?endl;coutv〈”改用顯式指定類型,輸入8進制數(shù)750:"vvendl;cin?oct?i;coutvc”輸入的數(shù)用十進制表示是:"vvendl;cout?i?endl;couivv"輸入的數(shù)用8進制表示是:"v<end1;cout<<oct<<i?endl; 〃指明8進制輸出以后一直有效coutvv"請輸入16進制整數(shù):fr?endl;cin?hex?i;coutvv"輸入的數(shù)用十進制表示是:"?endl;cout?dec<<i<<endl; 〃必須顯式改為十進制coutvv"輸入的數(shù)用16進制表示是:"vcendl;cout?hex?i?endl;coutvv"請輸入字符串:Thisisacat."?endl;cin.getline(a.18);cout?a?endl;couivv"沒有機會輸入。讀了上次輸入數(shù)字時的回車,輸出ー個空串?,F(xiàn)在可輸入了:"<vendl;cin.getline(a,18);cout?a?endl;coutv〈"成功!"?endl;return0;)[實驗要求)讀懂程序,理解程序中演示的輸入輸出中易出錯的情況。實驗三分支結(jié)構程序設計ー、實驗目的流程控制語句用于實現(xiàn)基本程序結(jié)構,是程序設計基礎。要求掌握:.條件語句的使用。.開關語句的使用。二、實驗內(nèi)容.范例:輸入一個整數(shù),判斷數(shù)的奇偶性后輸出結(jié)果。[分析] 判斷ー個數(shù)是否為偶數(shù),只要判斷它是否能被2整除,用除法取余。n%2為0,則n為偶數(shù),否則,為奇數(shù)。#include<iostream>usingnamespacestd;intmain(){intinput;cout?"Whichnumberdoyouwanttotest?\nn;cin?input;if(input%2) coutvぐnumber ”<vinput<v't'v<"isodd.";〃如果能被2整除,是偶數(shù)elsecoutvv"number,'<<input?\t,<<Hiseven.";〃否則是基數(shù)return0;)形式中,奇數(shù)的末位為1,偶數(shù)末位為〇。可以用整數(shù)n與1進行按位與運算:[分析二](可選)判斷ー個數(shù)的奇偶,只需判斷最后一位,在二進制表示n&l為非O(真),則是奇數(shù),為0(假),則是偶數(shù)。在上面程序中,將if判斷的條件改為n&l即可,其它部分不用修改。#include<iostream>usingnamespacestd;intmain(){intinput;湍處Which爛照患澀ザ修湍濫、い大皿”;〃如果能被2整除,是偶數(shù)else>>inpucout?,,number "<<input?At,?Hiseven.”;〃否則是基數(shù)return0;)[測試數(shù)據(jù)]345 680 -34 -23.5(有意用非整數(shù)測試)分別用以上各數(shù)作為輸入數(shù)據(jù),測試程序,分析程序結(jié)果,并進行記錄。.范例:編程求一元二次方程ax2+bx+c=0的根。包括以下判斷和結(jié)果:若輸入a=0,給出提示:若△>0,輸出兩個不等實根;若△=0,輸出兩個相等實根:若A<0,輸出兩個復數(shù)根。[程序]根據(jù)以上要求,編寫下列源程序,請與主教材例2.8作對比。#include<iostream>#include<cmath>usingnamespacestd;intmain(){doublea,b,c;doubledelta,xl,x2;intsign;cout?"ー?元二次方程 a*x*x+b*x+c=0\n";coutv<"輸入三個系數(shù)a(a!=0),b,c:"?endl;cin?a?b?c;cout?Ha=',?a?At,?Hb=',?b?,\t,?Hc=M?c?endl;if(a=0){coutvぐ二次項系數(shù)為0,不是一元二次方程”vvendl;exit(O);delta=b*b-4*a*c;)if(delta=O){coutvv”方程有兩個相同實根:"vvendl;cout?Mxl=x2=H?-b/(2*a)?endl;if(delta>0)sign=l;else{. .”elsesign=O;dclta=sqrt(fabs(delta));xl=-b/(2*a);x2=delta/(2*a);if(sign){couivc”方程有兩個不同實根:”<<endl;cout?"xl=H?xl+x2?*\t'?Mx2=M?xl-x2?endl;)else{//dclta<0coutvv”方程無實根!有兩個不同復數(shù)根:”vvendl;cout?"xl=M?xl?"+i"<<x2?'\t'?,,x2=',?xl?H-i"?x2?endl;})return0;).編寫程序:輸入一門課程的成績,若高于90分,輸出“AGrade”,若高于80而低于90,輸出"BGrade”,髙于70而低于80.輸出”CGrade”,高于60而低于70,輸出”DGrade",否則,輸出”NotPassed”。用if-else嵌套和switch語句兩種方法實現(xiàn)。[注意]ifWse嵌套使用時,注意else子句總與其最近的if配對;對數(shù)據(jù)劃分區(qū)間時,注意關系和邏輯表達式的正確書寫。注意if-else與switch的區(qū)別與聯(lián)系,switch特適合某個整型或字符型表達式的值與一組常量匹配的情況。.編寫程序:輸入一個數(shù),判斷是否是3或7的倍數(shù),可分四種情況輸出:1)是3的倍數(shù),但不是7的倍數(shù);2)不是3的倍數(shù),是7的倍數(shù);3)是3的倍數(shù),也是7的倍數(shù);4)既不是3的倍數(shù),也不是7的倍數(shù):實驗四循環(huán)結(jié)構程序設計.循環(huán)控制語句用于實現(xiàn)循環(huán)程序結(jié)構,要求掌握三種循環(huán)結(jié)構 while、ー、實驗目的do-while>for的區(qū)別與聯(lián)系,如何相互轉(zhuǎn)換,并能正確使用。.掌握與循環(huán)語句相關的break和continue語句的使用。二、實驗內(nèi)容.范例:輸入正整數(shù)n,求n的階乘。[分析]n!=l-2-3??…n?因此可以從1開始,由1!乘以2得到2!,再乘以3得到3!……,以此推出n!?[程序]#include<iostream>usingnamespacestd;intmain()(intn,i;doubleresult=O;〃resul1是結(jié)果coutvv"請輸入正整數(shù):"?endl;cin?n;if(n<l){cout?"輸入錯誤!”<vendl;return1;}result=l;fk)r(i=2;i<=n;i++)result*=i;cout?result?endl;return0;).范例:輸入若干字符,統(tǒng)計其中數(shù)字字符,白字符和其它字符的個數(shù),輸入EOF結(jié)束。[分析]要統(tǒng)計若干字符,需用循環(huán)反復輸入,讀入數(shù)據(jù)后用switch語句判斷字符的種類;要統(tǒng)計三種字符數(shù),需定義三個用于計數(shù)的變量nDigit,nWhite,nOther并首先置0:讀入字符用cin.get()函數(shù),在這里,用while循環(huán)比較合適。白字符指空格鍵,tab鍵和回車鍵。EOF表示EndofFile,其值為ー1,從鍵盤輸入(ctrl+z)即可。這里采用重載的intcin.get()函數(shù),它返回的是整型數(shù),所以能返回EOF。[程序]#include<iostream>usingnamespacestd;intmain()(chare;intnWhite,nOther,nDigit;nWhite=nOther=nDigit=0;c=cin.get();while(c!=EOF){switch(c){case,0':caseT:case:case*3':case'4':case'5':case'6':case7*:case'8':case'9’:nDigit++;break;case*caseAn1:caseAt*:nWhite++;break;default:nOther++;break;)c=cin.get(); 〃讀入下一字符}cout?',Digits="?At'?nDigit?\n';cout?"Whitespace=',?'\t'?nWhite?'\n\cout?"OtherChars="?'\t'?nOther?'\n';return0;)[思考]①如果要分別統(tǒng)計數(shù)字0?9各數(shù)字出現(xiàn)的次數(shù),怎樣オ能有效地實現(xiàn)?②如果要統(tǒng)計輸入的一段文字中出現(xiàn)的行數(shù)、單詞數(shù)和字符數(shù),又如何有效實現(xiàn)?③本例采用的是什么算法?.編寫程序:約瑟夫(Josephus)問題:n個人圍坐成一圈,從1開始順序編號;游戲開始,從第一個人開始由1到m循環(huán)報數(shù),報到m的人退出圈外,問最后留下的那個人原來的序號。[分析]本題首先要定義ー個數(shù)組,其元素個數(shù)為n。n定義為常變量,以便定義數(shù)組。數(shù)組元素的值標識該人是否出局,1在圈內(nèi),〇出局。值為0的元素不參加報數(shù)??捎茅`個整型數(shù)k做計數(shù)器,采用倒計數(shù),記錄留下的人數(shù)。[提示]數(shù)組是線性排列的,而人是圍成圈的,用數(shù)組表示要有一種從數(shù)組尾部跳到其頭部的技巧,即下標加1除以n求余數(shù)。.范例:將輸入的小寫字母轉(zhuǎn)換為大寫字母。[提示]由ASCII碼表可以看出,大寫英文字母的ASCI!碼值在65至90之間,小寫英文字母的ASCI!碼值在97至122之間,每ー個英文字母的大寫和小寫的ASCI!碼相差32(以上均為十進制)。#include<iostream>usingnamespacestd;intmain(){charstr[100];inti=0;cout?"Pleaseinputastringcin.getline(str,100);do{if(str[i]<'a'llstr[i]>'z')continue; 〃條件可有多種寫法,也可不用continueslr[i]-=32;)whiIc(str[++i]!='\O');cout?n\nTheresultstringis:*'?str?endl;return0;[思考]但當用戶輸入ー個空串,即用戶開始輸入時就以Enter鍵結(jié)束,stringlO]中就是表征輸入串結(jié)束的へ0'字符。由于是do_while循環(huán),所以肯定要進入循環(huán),在循環(huán)結(jié)束前由i++使i的值修改為!,使得循環(huán)體完成后的判斷是對string[l]進行,從而跳過對string⑼中的串結(jié)束符‘'0’判斷,導致在這種所謂"邊界”的情況中,程序不能正確運行。怎樣修改?考慮兩種方法。程序的質(zhì)量指標和算法的質(zhì)量指標ー樣,包括程序的正確性、可讀性、健壯性以及高的執(zhí)行效率和低的存儲空間要求。正確性是指對于各種合法的輸入,即使是苛刻的帶有刁難性的輸入數(shù)據(jù)也能夠得到滿足規(guī)格要求的結(jié)果,這其中就包括應當能處理各種邊界情況。.編程:設計ー個程序,輸入某天是幾月兒日,要求算出這一天是本年的第幾天。[分析]要算出某天是當年的第兒天,應該將當年中本月之前所有月的天數(shù)相加,再加上本月的天數(shù)。但這里有一個閏年問題,二月是ー個特殊月,如該年是閏年,則二月有29天,否則,便是28天,所以,還必須給出年份。[提示]判斷某年是閏年的條件是:該年號能被4整除但不能被100整除,或者能被400整除的是閏年。如,1996,2000是閏年,但!800不是閏年。實驗五常用算法:枚舉法遞推法迭代法ー、實驗目的掌握常用算法:枚舉法,遞推法、迭代法。二、實驗內(nèi)容 ;個.編程求和:s=a+aa+aaa+...+aa...a?其中a是1?9中的ー個數(shù)字。[提示]令各項為bO,bl,b2,…bn則b0=abl=b0*10+ab2=bl*10+a...即每ー項是為前ー項乘以10加a,遞推得到各項并求和。.編程求出所有的“水仙花數(shù)”,所謂“水仙花數(shù)”是指一個三位數(shù),其各位數(shù)字的立方和等于該數(shù)本身,例如153是一個”水仙花數(shù)”,因為153=135+す.采用枚舉法。.范例:設函數(shù)f(x)定義在區(qū)間[a,b]上,f(x)連續(xù)且滿足f(a)*F(b)<0,求f(x)在[a,b]上的根。采用割線法,迭代公式為:Xi+,=Xj+(Xj.j-Xj)/(f(xj)-f(xQ)*f(xi) _其代換規(guī)律為:首先用兩端點函數(shù)值的絕對值較大者的對應點作為rri^小者作為xi,即如果[f(a)klf(b)l,則xLi-a,xジ為用迭代公式得出xi+l,f(xj+l)?誤差定義為:/、=(Xm-X)/(f(X>f(XQ)*f(Xi)當N* <£或f(Xi+,)==0則結(jié)朿運算。否則用(Xノ(XJ)代替(X,?f(XH)),(Xi+l,f(Xj+J)代替(Xノ(X)),繼續(xù)迭代。求解方程:x*lg(x)=1的實根的近似值,誤差不超過0.01。[提示]令f(x)=x*lgx-1,則f(2)?0.398<0,而f(3卜0.431>0,根在2與3之間。#include<cmath>#include<iostream>usingnamespacesld;constmax=30;doublea=2,b=3,ep=O.OOl;intmain(){intmaxit,j;doublex1,x2,temp,f1,f2,dx;fl=a*log10(a)-1;f2=b*log10(b)-l;if(fl*f2>=0){cout?"初值錯!"?endl;return0;}if(fabs(fl)<fabs(f2)){xl=a;x2=b;)else(xl=b;x2=a;temp=fl;fl=f2;f2=temp;}fbr(j=l;j<=max;j++){dx=(xl-x2)*f2/(f2-fl);cout?dx;temp=x2;x2=x2+dx;xl=temp;fl=f2;f2=x2*log10(x2)-1;cout?*\t'?x2?endl;if((fabs(dx)<ep)ll(f2==0))|coutvv"方程的根為:"?x2?endl;return0;coutv<”迭代次數(shù)過多!M?endl;return1;}.范例:0到4五個數(shù)字,組成五位數(shù),每個數(shù)字用一次,但十位和百位不能為3(當然萬位不能為0),輸出所有可能的五位數(shù)。#include<iostream>usingnamespacestd;intmain(){intij,k丄m,count=0;fbr(i=|;i<=4;i++)(for(j=0;j<=4;j-H-){if(j==i)continue;for(k=0;k<=4;k++){if(k=3llk==illk==j)continue;for(l=0;l<=4;l-H-){if(l==3lll==illl==jlll==k)continue;fbr(m=0;m<=4;m++){if(m=illm==jllm==kllm=l)continue;cout?i<<j?k?l?m?*\t';count++;if(count%5=0)cout?endl;)})}}return0;)窮舉法采用循環(huán)語句,對須剔除的情況,應在循環(huán)體內(nèi)用條件語句實現(xiàn),并使用continue語句,不可用breako如果放在循環(huán)條件中,必然出錯。實驗六文本文件簡單應用ー、實驗目的.學會將程序運行的結(jié)果存入文本文件。.學會從文本文件讀取數(shù)據(jù),進行運算。二、實驗內(nèi)容.范例:修改實驗五中的第二題,求出水仙花數(shù)后不是在屏幕上顯示而是存入文本文件。請在退出程序后,用記事本打開該文本文件,查看結(jié)果。[格式](1)說明一個文件流對象(內(nèi)部文件)。文件流類型ifstream支持從輸入文件中提取數(shù)據(jù)的操作。而文件流類型ofstream完成數(shù)據(jù)寫入輸出文件中的各種操作。ifstreamifile; 〃定義輸入文件,ifile為文件名,可用任意標識符ofstreamofile; /定義/輸出文件,ofile為文件名,可用任意標識符特別注意:輸入文件用于讀,輸出文件用于寫。(2)打開文件。ifile.open("d:\\my_in_file.txt");〃引號中的"d:\\my_in_file.txt"為磁盤文件路彳も名ofile.open("d:\\my_out_file.txt");在文件流對象和磁盤文件名之間建立聯(lián)系。

(3)對文件進行讀寫操作??捎肅++的提取運算符(?)和插入運算符(?)進行。也可以用讀字符的get()和讀字符串的getling。等函數(shù)。用輸出文件(如ofile)代替cout?輸入文件(如ifile)代替cin。(4)關閉文件。ifile.close();ofile.close();關閉文件時,系統(tǒng)把與該文件相關聯(lián)的文件緩沖區(qū)中的數(shù)據(jù)寫到磁盤文件中,保證文件的完整;同時把磁盤文件名與文件流對象之間的關聯(lián)斷開,可防止誤操作修改了磁盤文件。#include<fstream>usingnamespacestd;intmain(){intk=100,l,m,n,count=0;ofstreamofile; 〃定義輸岀文件ofile.open("myfile.txtM);ofilev〈”水仙花數(shù)有:"?endl;do{l=k/100; 〃百位n=k%10J 〃個位m=(k-l*!00-n)/10;if(k=l*l*l+m*m*m+n*n*n){ofile?k?V;count++;if(count%5=0)ofile?endl;)k++;)while(k<999);ofile?endl;ofile.closeOI 〃關閉文件return0;.范例:編程從上題生成的文本文件讀取水仙花數(shù),并顯示在屏幕上。#include<fstream>#include<iostream>usingnamespacestd;intmain(){charch[256];〃定義輸入文件〃由文件讀入數(shù)據(jù)〃屏幕顯示ifstreamifile;〃定義輸入文件〃由文件讀入數(shù)據(jù)〃屏幕顯示ifile.open("..\\Exp6_l\\myfile.txtH);coutvv”文件內(nèi)容:n?endl;do{ifile.getline(ch,255);cout?ch?endl;|whUe(ifile.eof()=0); 〃當讀到文件結(jié)束時,ifile.eof()為真ifile.closeO; 〃關閉文件return0;)注意:在讀到文件結(jié)束符前,先讀了一個空串,所以輸出多了一空行。.編寫程序求500以內(nèi)的勾股弦數(shù)。即滿足c=bチa的三個數(shù),要求b>a。將所有符合要求的組合存入文本文件。.編寫程序從上題建立的文本文件中讀取500以內(nèi)的勾股弦數(shù),并顯示在屏幕上。實驗七函數(shù)的基本概念ー、實驗目的函數(shù)是C++程序的基本組成模塊,要求熟練掌握:.函數(shù)的定義及調(diào)用。.函數(shù)參數(shù)的傳遞(傳值),形參、實參的關系,函數(shù)聲明。.理解局部變量的意義。二、實驗內(nèi)容.范例:將教材中【例2.12I改為用函數(shù)實現(xiàn),編寫一個用迭代法求平方根的函數(shù)。[分析]寫ー個通用的求平方根的函數(shù),參數(shù)(形參)為待求根的數(shù),返回值為該數(shù)的平方根。由于平方數(shù)不可能為負,因此在主調(diào)函數(shù)中,設置ー個判斷輸入數(shù)正負的操作,為正則用該數(shù)(實參)調(diào)用求平方根函數(shù),為負輸出錯誤信息。[程序]#include<iostream>#include<cmath>usingnamespacestd;doublesroot(doublea); 〃求平方根函數(shù)原型聲明intmain(){doublex,a;cout?MPleaseinputavalue:\n";cin?a;if(a<0)cout?"InputError!\nM;else(x=sroot(a); 〃調(diào)用求平方根函數(shù)cout?"ThesquarerootofM?a?**isM?x?endl;}return0;1doublesroot(doublea){doublex=a/2;while(fabs((x-a/x)/2)>1e-7) x=(x+a/x)/2;return(x);).范例:在按值傳遞中,被調(diào)函數(shù)執(zhí)行時,形式參數(shù)得到了實在參數(shù)的一個副本,這樣調(diào)用函數(shù)可以向被調(diào)函數(shù)單方向傳遞數(shù)據(jù)。但在被調(diào)函數(shù)中不能對實在參數(shù)本身操作。C++/C對數(shù)組參數(shù)傳遞拷貝的是數(shù)組的起始地址,而不是拷貝數(shù)組本身,所以操作是在原數(shù)組上進行。下面是傳遞數(shù)組的ー個簡單例子#include<ioslream>#include<string>usingnamespacestd;voidchange_it(charc|4]);intmain(){charname[4]="ABC";cout?name?endl; //OutputABCchange_it(name);cout?name?endl; //OutputXYZreturn0;)voidchange_it(charc|4]){strcpy(c,"XYZ");return;(.設計ー個簡單的計算器程序,從鍵盤輸入"+3 5”代表表達式"3+5”,程序讀入運算符和數(shù)據(jù),調(diào)用Calculate函數(shù),根據(jù)運算符進行四則運算。要求能反復執(zhí)行這ー過程,直到用戶輸入#符號作為運算符。函數(shù)原型已給出如下:doubleadd(double,double); 〃加+doubleminus(double,double);〃減ーdoublemulti(double,double); 〃乘?doublediv(double,double); 〃除ノdoubleCalculate(加uble,double,char);〃運算符作為字符數(shù)據(jù)讀入.設計ー個求兩個數(shù)最大公約數(shù)的通用函數(shù),算法不限,要求能反復輸入數(shù)據(jù)并輸出其最大公約數(shù)。?可用枚舉法,從兩數(shù)中的小者開始試,逐步減小,直到找到最大公約數(shù)。實驗ハ函數(shù)的遞歸算法ー、實驗目的.掌握函數(shù)的嵌套調(diào)用、遞歸調(diào)用。.掌握遞歸法編程。二、實驗內(nèi)容1.函數(shù)嵌套調(diào)用是在被調(diào)用的函數(shù)內(nèi)再調(diào)用其它函數(shù),而遞歸調(diào)用是在被調(diào)函數(shù)內(nèi)調(diào)用自身。嵌套調(diào)用的層數(shù)沒有限制,而遞歸調(diào)用函數(shù)必須包含使遞歸終止的語句。范例:求組合數(shù),C"=才/(m!(”-m)!)[分析]求組合數(shù)要用到求階乘,將求階乘定義為ー個函數(shù),在求組合數(shù)的函數(shù)中嵌套調(diào)用階乘函數(shù)。由于n!=n*(n-l)!,求階乘是ー個典型的遞歸算法,在此用遞歸方法實現(xiàn)。#includc<iostrcam>usingnamespacestd;longcom(),fac(int);intmain(){〃函數(shù)聲明coul?"Pleaseinputtwonumbersm,n(m<n):\nH;cin?m?n;if(m<=n)cout?,'C(m,n)=H?com(mji)?endl;elsecout?HInputError!\n";return0;longcom(inti,intj){longcmb;cmb=fac(j)/(fac(i)*fac(j-i));returncmb;//att:〃在com函數(shù)內(nèi)嵌套調(diào)用fac函數(shù)longfac(inti){longfcl;if(i=01li==1)fcl=1;elsefcl=i*fac(i-l);returnfcl;//att:B〃使遞歸結(jié)束的語句〃遞歸調(diào)用這里因階乘極易溢出,n最大取12,否則運算中溢出。[注意]在函數(shù)內(nèi)定義局部變量時,變量名不應與函數(shù)名相同,在A行處,不可定義變量名為com,在B處,不可為fac:還有一種常見錯誤如下:longfac(inti){if(i=0lli=l)fac(i)=l;elsefac(i)=i*fac(i-l);returnfac(i);)編譯這樣的程序,會出現(xiàn)"Left_valuerequired"的錯誤,這是為什么?.用歐幾里德算法計算兩個數(shù)的最大公約數(shù),分別用遞推(while循環(huán)實現(xiàn))和遞歸兩種方法實現(xiàn)。并計算兩個數(shù)的最小公倍數(shù)。[提示]歐幾里德算法參見教材【例2.21】

.修改第一題,使其不易溢出。考慮到:C:-n\!(m!(n一加)!)=(n*(n-l)*...*(n-m+l))/m!=(n/l)*(n-l)/2*...*(n-(m-2))/(m-l)*(n-(m-l))/m=Cm'n*(n-(m-1))/m可以用遞歸的方法計算。這里n可以用到40〇實驗九函數(shù)的重載和變量的作用域ー、實驗目的了解內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶缺省參數(shù)函數(shù)的定義及使用。.作用域概念,變量的存儲類型及它們之間的差別。.掌握程序的多文件組織。.掌握編譯預處理內(nèi)容,理解帶參數(shù)宏定義與函數(shù)的區(qū)別。(可選)二、實驗內(nèi)容.重載函數(shù)允許不同的函數(shù)使用相同的名字,這使得完成類似任務可以使用相同函數(shù)名。范例:編寫幾個計算面積的函數(shù),分別計算圓、矩形、梯形和三角形的面積,計算邊長為1的正方形及其內(nèi)切圓、內(nèi)接等腰三角形和等腰梯形面積。函數(shù)原型如下:doublearea(doubleradius=O);〃闕面積,參數(shù)為半徑,缺省參數(shù)〇,表示點面積doublearea(doublea,doubleb);〃計算矩形面積,參數(shù)為長和寬doublearea(doublea,doubleb,doubleh);〃計算梯形面積,參數(shù)為兩底和髙圖1.8計算不同圖形面積doublearea(doubiea,doubleb,圖1.8計算不同圖形面積〃三角形,參數(shù)為三邊長,int型參數(shù)起標示作用,以區(qū)別于梯形不參加計算程序如下:#include<iostream>#include<cmath>usingnamespacestd;#definePI3.14159doublearea(doubleradius=0);doublearea(doublea,doubleb);doublearea(doublea,doubleb,doubleh);doublearea(doublea,doubleb,doublec,int);intmain(){cout?,'Areaofpointis"?area()?'\n,;cout?"Areaofsquareis"?area(1,1)?^';cout?*'Areaofcircleis"?area(0.5)?'\n';cout?"Areaoftrapeziumis"?area(1,0.5,l)?,\n,;cout?"Areaoftriangleisn?area(1,sqrt(l+0.5*0.5),sqrt(l+0.5*0.5),0)?'\n,;return0;)doublearea(doubleradius){〃帶缺省參數(shù)的函數(shù)returnPI*radius*radius;1doublearea(doublea,doubleb){returna*b;)doublearea(doublea,doubleb,doubleh){return(0.5*(a+b)*h);)doublearea(doublea,doubleb,doublec,int){doubles=0.5*(a+b+c);returnsqrt(s*(s-a)*(s-b)*(s-c));).編程:將上題以多文件方式組織,在area.h中聲明各個area函數(shù)原型,在area.cpp中定義函數(shù),然后在Exp9_2.cpp中包含areah,定義main函數(shù)并執(zhí)行。注意:usingnamespacestd;只能說明一次,或者說只能在ー個文件屮說明。.范例:作用域:全局變量、局部變量和靜態(tài)局部變量的應用。 分析并寫出下列程序的執(zhí)行結(jié)果,然后輸入計算機執(zhí)行,比較分析結(jié)果與執(zhí)行結(jié)果。#include<iostream>usingnamespacestd;inta=300,b=400,c=500;voidfuna(intc){staticinta=5;a+=c;cout?a?''?c?'\n';)voidfunb(inta){a=b;coutvvavvへn';)voidfunc()(intc=0;cout?a?'*?b?',?c?,\n,;::c-=100;)intmain(){funa(a);funb(b);fiina(b);func();cout?a?'*?b?'*?c?An,;return0;).編程:分別以宏和函數(shù)形式求某個數(shù)的絕對值,并編程調(diào)用它們。內(nèi)聯(lián)(inline)函數(shù)雖然以函數(shù)形式定義,但在調(diào)用時相當于宏,將代碼直接替換函數(shù)調(diào)用表達式,不需調(diào)用棧操作,可以節(jié)省??臻g和函數(shù)調(diào)用的時間開銷;但要求函數(shù)代碼簡単,沒有復雜語句。(可選)[思考]這兩種方法各有什么特點,當考慮到不同數(shù)據(jù)類型時,哪種方法更合適?為什么C++不提倡用宏?.希望對不同類型的數(shù)據(jù)完成相似功能時往往采用函數(shù)重載的方法。例如要在程序中用不同的格式輸出不同類型的數(shù)據(jù),可以編制多個同名的output。函數(shù),這些函數(shù)的參數(shù)類型互不相同,對不同的參數(shù)設計不同的輸出格式。編程:使用函數(shù)重載技術編程實現(xiàn)自動適應字符串、整數(shù)和實數(shù)的輸出。實驗十類與對象的基本概念ー、實驗目的類是C++擴展數(shù)據(jù)類型,可以封裝不同類型的數(shù)據(jù)成員和函數(shù)成員,類是面向?qū)ο蟪绦蛟O計的基礎。本次實驗內(nèi)容包括面向?qū)ο蟮幕靖拍?、構造函?shù)與析構函數(shù),從實際問題抽象出類等,通過實驗要求:.掌握面向?qū)ο蟮幕靖拍?類的定義方法。.掌握類成員的訪問權限及訪問類成員的方法。.掌握內(nèi)聯(lián)函數(shù)和缺省函數(shù)。.掌握構造函數(shù)與析構函數(shù)的意義及使用方法。二、實驗內(nèi)容1.范例:集合是具有同一屬性(共性)而又能互相區(qū)別(個性)的多個成員匯集起來的整體,構成集合的每個成員稱為集合的元素,元素間沒有順序關系。例如,所有的大寫英文字母是ー個集合,它包括26個元素:A、B Z。不包含任何元素的集合稱為空集合。[實驗要求]自定義一個集合類set,采用數(shù)組存放集合的元素。自定義集合運算包括:1)判斷元素elem是否為集合set的元素。2)為集合添加一個元素elem。3)從集合中刪除ー個元素elem〇4)復制ー個集合,其元素與原集合完全ー樣。5)顯示集合中的所有元素。6)求兩個集合中相同的元素,即求兩個集合的交集。7)求兩個集合中所有的元素,即求兩個集合的并集。8)判斷兩集合包含的元素是否完全相同。9)判斷ー個集合是否被包含在另ー個集合之中,即是否為另ー個集合的子集。

[程序]#include<iostream>usingnamespacestd;constintmaxnum=20;enumErrCode{noErr,overflow};classset(charelements[maxnumj;intnum;public:set(){num=();)〃判斷元素elem是否為本集合的成員〃判斷元素elem是否為本集合的成員〃將新元素elem加入本集合〃將元素elem從該集合中刪去〃將本集合中的所有元素拷貝到實參指出的集合中去〃判斷兩集合各自包涵的元素是否完全相同〃顯示本集合的所有元素ErrCodeAddElem(char);voidRmvElem(char);voidCopy(set);boolEqual(set);voidprint();voidIntersect(set,set);〃求本集合與第一參數(shù)所指出的集合的交,并存入第二參數(shù)所指出的集合中ErrCodeUnion(set,set);〃求本集合與第一參數(shù)所指出的集合的并,并存入第二參數(shù)所指出的集合中boolContain(set); 〃判斷本集合是否包涵實參指出的集合中所有的元素);boolset::Member(charelem){inti;fbr(i=O;i<num;i++)if(elements[i]==elem)returntrue;returnfalse;}ErrCodeset::AddElem(charelem){inti;fbr(i=O;i<num;i++)if(elements[i]==elem)returnnoErr;〃集合中己冇elem,不重復加入if(num<maxnum){elements[num++]=elem;returnnoErr;}elsereturnoverflow; 〃數(shù)組已滿)voidset::RmvElem(charelem){inti;fbr(i=0;i<num;i++)if(elements[i]==elem){fbr(;ivnum?1;i++)elements[i]=elements[i+lj;〃當刪除ー個元素后,所冇后繼元素前移一位num—;))voidset::Copy(sets)(inti;fbr(i=O;i<num;i++)s.elements[i]=elements[i];s.num=num;)boolset::Equal(sets){inti;if(num!=s.num)returnfalse; 〃元素個數(shù)不同for(i=0;i<num;i++)if(s.Member(elements[i]))returnfalse; 〃冇元素不同returntrue;)voidset::print(){coutvv”集合的元素包括:"vvendl;inti;for(i=0;i<num;i++) cout?elements[i]?,^cout?endl;)voidset::Intersectsetsi,sets2){inti,j;s2.num=0;fbr(i=O;i<num;i++)fbr(j=O;j<sl.num;j++)if(elements[i]==sl.elements[j]){s2.elements[s2.num+4-]=elements[i];break;))ErrCodeset::Union(setsi,sets2){inti;sl.Copy(s2);ibr(i=O;i<num;i++)if(s2.AddElem(elemcnts[i])==overflow)returnoverflow;returnnoErr;)boolset::Contain(sets){inti;fbr(i=O;i<s.num;i++)if(!Member(s.elements[i]))returnfalse;returntrue;)intmain(){inti;charch[30]={,A,:B,:C':D\,E':F,:GVH';r:J,:K,;L';M\,N;sets?sl,s2,s3,s4;ErrCodeb;for(i=0;i<10;i++)(b=s.AddElem(ch[i]);b=sl.AddElem(ch[2*i]);b=s2.AddElem(ch[3*i]);}cout?MsM; s.print();cout?Hsr*; sl.printO;cout?Hs2H; s2.print();s.Intersect(sl,s3);b=s.Union(sl,s4);cout?,,s3n; s3.print();cout?"s4M; s4.print();if(s3.Contain(s4))cout?"Sets3containss4*'?endl;elsecout?nSets3donotcontainss4"?endl;if(s4.Contain(s3))cout?MSets4containss3,'?endl;elsecout?HSets4donotcontainss3H?endl;if(s3.Equal(s4))cout?"Sets3=s4"?endl;elsecout?"Sets3!=s4"?endl;for(i=6;i<10;i++){s.RmvElem(ch[i]);sl.RmvElem(ch[i]);s2.RmvElem(ch[i]);)coutvv”刪除部分元素后:"?endl;cout?"s"; s.print();cout?MslH; sl.printO;cout?Hs2H; s2.print();return0;12.編程:建立一個分數(shù)類。分數(shù)類的數(shù)據(jù)成員包括分子和分母,操作包括

顯示、輸入、約分、通分、比較、加、減、乘、除、求相反數(shù)。分數(shù)類定義如下:classfraction{intabove; 〃分子intbelow; 〃分母voidreduction(); 〃約分voidmakeCommond(fraction);〃通分public:fraction(int=0,int=l);fractionadd(fraction);fractionsub(fraction);fractionmul(fraction);fractiondiv(fraction);fractionreciprocal();boolfraction(int=0,int=l);fractionadd(fraction);fractionsub(fraction);fractionmul(fraction);fractiondiv(fraction);fractionreciprocal();boolepual(fraction);boolgreaterThan(fraction);boollessThan(fraction);voiddisplayO;voidinput();〃構造函數(shù)〃兩分數(shù)相加//本分數(shù)減去實參分數(shù)//兩分數(shù)相乘〃本分數(shù)除以實參分數(shù)〃求倒數(shù)〃等了運算〃大于運算//小于運算〃顯示分數(shù)〃輸入分數(shù)完成所有成員函數(shù)并進行檢驗。實驗十一 引用與拷貝構造函數(shù)ー、實驗目的1.掌握引用概念及應用,引用作函數(shù)參數(shù)。2,學會編寫與應用拷貝構造函數(shù)。二、實驗內(nèi)容1.范例:編寫ー個函數(shù),其原型為:voidlndex(inta[],intn,int&sub),其功能是,在大小為n的數(shù)組a中,查找某個數(shù)sub,若找到,將其下標存放在sub中,若沒找到,將一1存放在sub中,在主調(diào)函數(shù)中通過判斷值來判斷數(shù)組中是否有該數(shù)。在這里,sub是引用類型的參數(shù),但起返回值的作用。#include<iostream>usingnamespacestd;voidIndex(inta[],intn,int&sub);intmain(){intb[25]={2t3,5,7,11,13,17,19,23,29,3137,41,43,47^3,59,61,67,71,73,79,83,89,97);intn=25,sub;coutvぐ輸入小于100的正整數(shù):"<vendl;cin?sub;Index(bji,sub);if(sub!=-l) coutvv”所在元素下標為:"vvsubvvendl;elsecoutvv”未找至リ。"vvendl:coutcv"再輸入小于100的正整數(shù):"<vendl;cin?sub;Index(b,n,sub);if(sub!=-l) coutvv”所在元素下標為:"vvsubvvendl;elsecoutv〈”未找至リ。M?endl;return0;voidIndex(inta[],intn,int&sub)(inti,k=sub;sub=-1;for(i=0;i<n;i++)if(a[i]=k){sub=i;break;)1.范例(可選):ー個聲明為返回引用的函數(shù),還可以用在賦值號的左邊,即這種函數(shù)調(diào)用本身是ー個左值?!境绦颉?include<iostream>usingnamespacestd;intarray[]=[2,4.6,8,10);int&index(inti);intmain(){index(3)=16;for(inti=0;i<5;i++)cout?index⑴vv'';cout?endl;return0;}int&index(inti){returnarray[i];)[注意]由于函數(shù)index。是返回引用的類型,所以該函數(shù)調(diào)用可以作為一個左值,程序的表達式index(3)=16將16賦給左邊的函數(shù)調(diào)用,由于該函數(shù)調(diào)用返回對array[3]的引用,所以可以將array[3]賦新值。該程序運行的結(jié)果將使得整型數(shù)組array中的各元素值變?yōu)?,4,6,16,10o.范例:為矩形類定義拷貝構造函數(shù)。矩形類見主教材例4.2。在rect.h中類rect定義中加:Rectangle(Rectangle&rec);在recセ.cpp中添加:Rectangle::Rectangle(Rectangle&rec){lefl=rec.left;top=rec.top;right=rec.right;bottom二rec.bottom;}〃拷貝構造函數(shù)在main。函數(shù)中添加:Rectanglerect2(recti);cout?"由拷貝構造函數(shù)生成的rect2:"<<endl;rect2.Show();這里的拷貝構造函數(shù)是缺省的按成員語義定義的,只作為ー個練習,可以不寫,系統(tǒng)會自動提供。.編程:將實驗十的集合類和分數(shù)類的集合類型或分數(shù)類型參數(shù)改為引用,并添加拷貝構造函數(shù)。實驗十二運算符重載ー、實驗目的.掌握運算符重載為成員函數(shù)的方法。.理解友元函數(shù)和友元類。.掌握運算符重載為友元函數(shù)的方法。.使用靜態(tài)數(shù)據(jù)成員。二、實驗內(nèi)容1.范例:為主教材例題4.2的Rectangle類增加加減復合賦值和加減運算符重載函數(shù)。加減復合賦值語義定義為固定長方形的左上角,對右下角的坐標進行加減運算,使新矩形的長寬為原兩矩形長寬之和或差,對加和減復合賦值定義為成員函數(shù)。兩個矩形加減運算定義為友元函數(shù)。classRectangle{intleft,lop;intright,bottom;public:Rectangle(int1=0,intt=0,intr=0,intb=0);-Rectangle(){); 〃析構函數(shù),在此函數(shù)體為空voidAssign(int1,intt,intr,intb);voidSetLeft(intt){left=t;}/Z以下四個函數(shù)皆為內(nèi)聯(lián)成員函數(shù)voidSetRight(intt){right=1;}voidSelTop(intI){top=t;}voidSetBottom(intt){bottom=t;}voidShow();voidoperator+=(Rectangle&);voidoperator-=(RectangIe&);friendRectangleoperator+(Rectangle&,Rectangle&);friendRectangleoperator-(Rectangle&,Rectangle&);};〃將上述內(nèi)容保存為rect.h#include<iostream>#include"rect.h"usingnamespacestd;Rectangle::Rectangle(int1,intt,intr,intb){left=1;top=t;right=r;bottom=b;}〃構造函數(shù),帶缺省參數(shù),缺省值為全0,在聲明中指定voidRectangle::Assign(int1,intt,intr,intb){left=1;top=t;right=r;bottom=b;)voidRectangle::Show(){cout?nleft-toppointis(',?left?",n?top?u)*'?*\n*;cout?nright-bottompointis("?right?'\H?bottom?',)',?endl;}〃當用.h頭文件時,不用end1輸出次序可能出錯voidRectangle::operator+=(Rectangle&rect){intx=rect.right-rect.left;inty=rect.bottom-rect.top;right+=x;bottom+=y;}voidRectangle::operator-=(Rectangle&rect){intx=rect.right-rect.left;inty=rect.bottom-rect.top;right-=x;bottom-=y;)Rectangleoperator-(Rectangle&rectl,Rectangle&rect2){〃矩形相減,從recti中減去rect2的長度和寛度recti-=rect2;returnrect1;}Rectangleoperator+(Rectangle&rect1,Rectangle&rect2){〃矩形相加,從recti中加上rect2的長度和寬度recti+=rect2;returnrecti;}//將上述內(nèi)容保存為rect.cpp#include<iostream>usingnamespacestd;#include"rect.h"intmain(){Rectanglerect;coutvv"初始rect:"<vendl;rect.Show();rect.Assign(l00,200,300,400);cout<<”賦值后recピvvendl;rect.Show();Rectanglerect1(0,0,200,200);coutvv"初始recti:"v<endl:rectl.Show();rect+=rect1;coutvv"與recti相加后的rect:H?endl:rect.Show();rect-=rect1;coutvv”減去rect1后的rec匕"v<endl;rect.Show();Rectanglerect2;rect2=rect+rect1;coutv<"rect與recll相加所得rect2:"v<endl;rect2.Show();rect2=rect-rect1;coutvv"rect減irect!所得rect2:"v<endl;rect2.Show();return0;1//將上述內(nèi)容保存為Expl2_l.cpp[要求]建立工程,錄入上述程序,改變數(shù)據(jù)實驗之。[注意]缺省的按語義定義的賦值運算符,不必用戶定義,系統(tǒng)自動提供。.編程:修改上題,要求如下:(1)將加減運算重載為成員函數(shù);(2)為矩形類再增加一個靜態(tài)數(shù)據(jù)成員Counter,統(tǒng)計共產(chǎn)生了多少個矩形對象。為Counter添加定義、賦初值及隨程序運行而變化的代碼,并在main函數(shù)中對其輸出。注意靜態(tài)數(shù)據(jù)成員應該有定義性說明。.閱讀與理解:介紹MFC中的CRect類、CSize和CPoint類。(可選)介紹CRect之前需了解Windows的RECT結(jié)構,其定義如下:typedefstructtagRECT{LONGleft;LONGtop;LONGright;LONGbottom;}RECT;它定義了一個矩形的左上角和右下角的坐標,在應用WindowsAP!開發(fā)應用程序時,用RECT結(jié)構表示矩形,tagRECT是RECT結(jié)構一個不太常用的名字。可以用下列方法定義并初始化ー個RECT結(jié)構:RECTrctA;retA.left=20;rctA.top=30;rctA.right=180;retA.bottom=230;或者RECTrctB={20,30,180,230);由于MFC是用面向?qū)ο蠓椒ㄔO計的,引入了CRect類表示矩形,它類似于RECT結(jié)構,并封裝了和矩形操作相關的API函數(shù),包含了

溫馨提示

  • 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

提交評論