




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗一明確的概念:〔1〕理解類和對象的概念;〔具體見附一〕類是抽象的對象是具體的例如:你、我、他都是人那么你、我、他就是對象人就是類〔2〕掌握類與對象的定義方法;類的定義:class類名{…/*定義這個類*/};//(別忘了最后的分號)對象的定義:類名對象名(參數);〔3〕理解類的成員的訪問控制的含義,公有和私有成員的區別; public://訪問屬性為公有通過外部直接訪問即: private://訪問屬性為私有不能通過外部直接訪問〔不聲明訪問屬性時系統默認為私有〕當出現對象名.成員(私有)時編譯器報錯 protected://訪問屬性為保護與private類似但protected屬性的成員可以繼承private不能繼承〔4〕掌握構造函數和析構函數的含義與作用、定義方式和實現; 構造函數:為數據成員開辟存儲空間 函數名必須與類名相同之前絕對不許說明返回值類型void也不行 構造函數不能由用戶調用即:對象名.構造函數名(參數)是錯誤的 構造函數是隨著對象的聲明而調用的 例如: classStudent{Student(){cout<<〞Hello.〞<<endl;}};Intmain(void){cout<<〞Hello.〞<<endl;StudentA;}運行結果: Hello. //<-這個Hello是主函數中的 Hello. //<-是聲明A對象時調用的構造函數構造函數中的Hello 析構函數功能與構造函數相反注意調用時間和順序(看書)附:如何知道該程序析構函數的調用順序是p3p2p1?答:將拷貝構造函數中改為x=附:如何知道該程序析構函數的調用順序是p3p2p1?答:將拷貝構造函數中改為x=2*p.x;y=2*析構函數中在cout<<〞Destructoriscalled.〞之后添加<<〞x=〞<<x<<〞y=〞<<y后面的不變運行時析構函數輸出結果變為:Destructoriscalled.x=12y=16Destructoriscalled.x=6y=8Destructoriscalled.x=3y=4Pressanykeytocontinue由此可知其調用順序或者在拷貝構造函數和析構函數中的cout語句的<<endl;之前參加<<this來輸出對象地址再對號入座也可知調運順序輸入以下程序,按要求進行實驗,并記錄實驗的結果。#include<iostream>usingnamespacestd;classCoordinate{public: Coordinate(intx1,inty1){x=x1;y=y1;} Coordinate(Coordinate&p); ~Coordinate(){cout<<"Destructoriscalled."<<endl;} intgetx(){returnx;} intgety(){returny;}private: intx,y;};Coordinate::Coordinate(Coordinate&p){//拷貝構造函數 x=p.x;y=p.y; cout<<"Copyinitianizationconstructoriscalled."<<endl;運行結果:Copyinitianizationconstructoriscalled.運行結果:Copyinitianizationconstructoriscalled.Copyinitianizationconstructoriscalled.p3=(3,4)Destructoriscalled.Destructoriscalled.Destructoriscalled.Pressanykeytocontinue調用構造函數調用拷貝構造函數〔見書P89〕調用構造函數調用拷貝構造函數〔見書P89〕 Coordinatep1(3,4); Coordinatep2(p1); Coordinatep3=p2; cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")"<<endl;程序結束時調用析構函數注意析構函數的調用順序從上至下依此為p3p2p1的析構函數程序結束時調用析構函數注意析構函數的調用順序從上至下依此為p3p2p1的析構函數 return0;}記錄程序的運行結果將Coordinate類中帶有兩個參數的構造函數進行修改,在函數體內增加如下語句:cout<<〞Constructoriscalled.〞<<endl; 重新記錄程序的運行結果,并解釋輸出結果。按以下要求進行測試。在主函數體內,添加如下語句:Coordinatep4; 錯誤原因:構造函數沒有參數構造函數為Coordinate::Coordinate(int,int)Coordinatep5(2); 錯誤原因:參數數量不對根據注釋語句的提示實現類Date的成員函數,并將完整的程序編譯、連接成功以保證程序能夠正確運行。#include<iostream.h>classDate{public: voidprintDate(); //顯示日期分析:1.題目中Date類的數據成員為day,month,year且均為整型訪問屬性為私有主函數中聲明了testDay對象2.數據成員均為私有那么不能通過tesDay.day=<數值>的方法來設置題目中給出了voidsetDay(int)voidsetMonth(int)和voidsetYear(int)三個成員函數去是指daymonth和year的值還有一個voidprintDate()來輸出分析:1.題目中Date類的數據成員為day,month,year且均為整型訪問屬性為私有主函數中聲明了testDay對象2.數據成員均為私有那么不能通過tesDay.day=<數值>的方法來設置題目中給出了voidsetDay(int)voidsetMonth(int)和voidsetYear(int)三個成員函數去是指daymonth和year的值還有一個voidprintDate()來輸出3.準備工作結束開始編程看程序僅差4個成員函數未定義類外定義要寫出作用域即該函數屬于哪個類:格式:返回值類型作用域::函數名參數表voidDate::setDay(intd)/*定義時必須要給形參一個名字這里給的是*/d{day=d}//設置了day的值其他函數依此類推輸出函數就不用再嘮叨了4.驗證結果出現溢出數據時查看是否寫反了例如寫成d=day了解設置函數的作用機制見附二 voidsetMonth(int);//設置月的值 voidsetYear(int);//設置年的值private: intday,month,year;};intmain(){ DatetestDay; testDay.setDay(5); testDay.setMonth(10); testDay.setYear(2023); testDay.printDate();};voidDate::setDay(intd){day=d;}voidDate::setMonth(intm){month=m;}voidDate::setYear(inty){year=y;}voidDate::printDate(){cout<<year<<"/"<<month<<"/"<<day<<endl;}3. 下面是一個計算器類的定義,請完成該類的成員函數的實現,并設計一個主函數使用該類和相關成員函數以測試該類設計的正確性。#include<iostream>usingnamespacestd;classcounter{public: counter(intnumber=0) //構造函數 { value=number; }voidincrement(); //給value原值加1 voiddecrement(); //給value原值減1 intgetvalue(); //取得計數器值 intprint(); //顯示計數private: intvalue; //數據成員};voidcounter::increment(){value++;cout<<"Thecounterhasincreasedby1"<<endl;}//〔其中的cout語句可以不寫〕voidcounter::decrement(){value--;cout<<"Thecounterhasdecreasedby1"<<endl;}intcounter::getvalue(){returnvalue;}intcounter::print(){cout<<"\nDisplay:"<<getvalue()<<endl<<endl;return0;}intmain(){ cout<<"Pleaseinputoriginnumber:"; //定義counter類的幾個對象并調用有關成員函數 inta; cin>>a; counterc(a);//輸入a并將a作為參數通過構造函數為對象中的value賦值 c.increment(); c.print(); //題目要求驗證所以使用輸出函數一次驗證value的值 c.decrement(); c.print(); return0; }4.定義一個類ClsName,要求該類設計如下:〔1〕該類有兩個整型數據成員x和y;〔2〕為該類重載三個不同的構造函數:分別為無參數、帶一個參數和帶兩個參數的構造函數,要求在構造函數中輸出必要的信息以示區別;〔3〕設計2個成員函數用來讀取數據成員x和y;〔4〕設計2個成員函數用來設置數據成員x和y;〔5〕設計1個成員函數用來在屏幕上打印輸出數據成員x和y;〔6〕在main〔〕函數中用三個不同的構造函數創立3個對象,并使用所有的成員函數對這些對象進行必要的操作。classClsName{public: inta,b; ClsName(inta,intb){cout<<"Constructbytwonumbers."<<endl;x=a,y=b;} //以下三個(2)中要求的重載構造函數 ClsName(inta){cout<<"Constructby1number."<<endl;x=a,y=b;}//題目要求加以區別,所以cout輸出不同內容加以區分 ClsName(void){cout<<"Constructwithoutanumber."<<endl;x=a,y=b;} intgetx(){returnx;}因為x,y的訪問屬性為私有,不能由主函數直接訪問所以會設置讀取函數專門負責返回相應的值重載:函數名相同,參數的類型不同或者個數不同、或者都不同。即根據帶入參數的類型、數量的不同,來實現不同的功能 intgety(){returny;}重載:函數名相同,參數的類型不同或者個數不同、或者都不同。即根據帶入參數的類型、數量的不同,來實現不同的功能 voidsetx(){cout<<"ChangeX:";cin>>x;} voidsety(){cout<<"ChangeY:";cin>>y;} voidprint(){cout<<"X="<<getx()<<'\t'<<"Y="<<gety()<<endl;}private: intx,y;〔1〕中要求的兩個整型數據成員};intmain(){ inta,b; cout<<"Test1:Inputwith2numbers,nowpleaseinputtwonumbers:"<<endl; cin>>a;cin>>b; ClsNamet1(a,b); t1.print(); t1.setx();t1.sety(); t1.print(); cout<<"\nTest2:Inputwithanumbers,nowpleaseinputanumber:"; cin>>a; ClsNamet2(a); t2.print(); t2.setx();t2.sety(); t2.print(); cout<<"\nTest3:Withoutnumbers"; ClsNamet3; t3.print(); t3.setx();t3.sety(); t3.print(); return0;5. 建立類cylinder,包括兩個數據成員radius和height,分別表示圓柱體的半徑和高度,cylinder類的構造函數被傳遞了兩個double值來初始化這兩個成員;定義成員函數area()和volume用來求圓柱體的外表積和體積,定義成員函數print()打印cylinder類的相關信息。最后,在主函數中對cylinder類的設計進行測試。這題很簡單沒啥說的#include<iostream.h>classcylinder{public: voidset(doubler,doubleh){radius=r,height=h;} doublearea(){return(radius*3.14);} doublevolume(){return(height*area());} voidprint(){cout<<"Area="<<area()<<'\t'<<"Volume="<<volume()<<endl;}private: doubleradius,height;};intmain(){ inta,b; cylinderv; cout<<"Radius="; cin>>a; cout<<"Height="; cin>>b; v.set(a,b); v.print(); return0;}6.定義一個學生類CStudent實現簡單的學籍管理功能,要求該類至少實現以下功能:(1)錄入學生的根本信息(包括姓名,學號,性別,年齡,專業,入學時間,各門功課成績)(2)輸出學生的根本信息(3)選課〔輸入時間和所選的課程〕(4)統計每門課的學分績點(5)統計每學期的平均學分績點(6)統計重考科目(7)統計重修科目#include<iostream>#include<string>usingnamespacestd;constMAX=4;classCStudent{ stringname,sex,ID,object,jtime;//分別存儲姓名性別學號專業入學時間 intage; //存儲年齡 intmark[MAX]; //設立一個數組存放成績 stringsbj[MAX]; //設立string數組來存放科目名稱 intretry,redo; //統計重考重修數量 stringt_chose,s_chose; //存放選課時間和選課名稱 intm_point[MAX],m_mark[MAX]; //存放每門功課的學分和績點 intmarker[MAX]; //存放重修科目的角標〔有時不止掛掉一科可能會很多所以聲明稱數組〕為什么建立數據時使用的數組?通過對角標的控制便可以把一行數據全部對應起來為什么建立數據時使用的數組?通過對角標的控制便可以把一行數據全部對應起來請看下面數據對應關系:角標科目名稱(sbj[i])成績(mark[i])學分(m_mark[i])0數學4461C語言9262英語724便于統計也可以方便地調用出一門科目的全部內容public: CStudent() { cout<<"構造CStudent開始錄入根本信息"<<endl; cout<<"Name:";cin>>name; cout<<"ID:";cin>>ID; cout<<"Sex:";cin>>sex; cout<<"Age:";cin>>age; cout<<"YourObject:";cin>>object; cout<<"Timeyoujointhecolleage:";cin>>jtime; cout<<"Nowpleaseinputyourmarks."<<endl; for(inti=0;i<MAX;i++) { cout<<"Subjectname:";cin>>sbj[i]; cout<<"Mark:";cin>>mark[i]; } } voidbaseprint() //按(2)要求輸出根本信息 { cout<<"根本信息:"<<endl; cout<<"學生姓名:"<<name<<"\t學號:"<<ID<<"\t年齡:"<<age<<"\t性別"<<sex<<endl; cout<<"入學時間:"<<jtime<<"\t專業:"<<object<<endl; cout<<"成績:"<<endl; for(inti=0;i<MAX;i++) { cout<<sbj[i]<<":"<<mark[i]<<"\t"; } cout<<endl; } voidchose() //按(3)要求設置選課函數 { cout<<"選課名稱:";cin>>s_chose; cout<<"選課時間:";cin>>t_chose; } voidPoint() //按(4)要求 { for(inti=0;i<MAX;i++) { cout<<"請設置"<<sbj[i]<<"的學分:";cin>>m_mark[i]; } cout<<endl; cout<<endl; intscore=0,j=0; //給score賦初值防止溢出因為后面有score+=...相當于score=score+...無法確定第一個score的值 retry=0; for(i=0;i<MAX;i++) { if(mark[i]>=60)score+=m_mark[i]; //成績及格壘加學分 else{retry++;marker[j++]=i;} //否那么不及格便要重考將重考數量自增 } //其中marker[j++]=i是將當時重修科目的角標記錄下來 floats=0; for(i=0;i<MAX;i++){ if(m_mark==0){m_point[i]=0;cout<<sbj[i]<<"學分績點均為0"<<endl;continue;} float(m_point[i]=4-(100-(float)mark[i])*(100-(float)mark[i])/1600);//績點的計算方法 s+=m_point[i]; cout<<sbj[i]<<"所獲學分:"<<m_mark[i]<<"\t績點:"<<m_point[i]<<endl; } cout<<"平均績點為:"<<s/MAX<<endl; cout<<endl; } voidcheck() { if(retry==0)cout<<"無重考科目"; else { cout<<"重考數目為:"<<retry<<"包括"<<endl; for(inti=0;i<retry;i++)cout<<sbj[marker[i]]<<"\t"; cout<<endl; redo=0; cout<<endl; inttemp,j=0; cout<<"輸入重考分數"<<endl; for(i=0;i<retry;i++) { cout<<sbj[marker[i]]<<":";cin>>temp; if(temp<60) { redo++; marker2[j++]=marker[i]; } } cout<<endl; if(redo==0)cout<<"無重修科目"; else { cout<<"重修數目為:"<<redo<<"包括"<<endl; for(i=0;i<redo;i++)cout<<sbj[marker2[i]]<<"\t"; cout<<endl; } } }};intmain(void){ CStudenta; a.baseprint(); a.chose(); a.Point(); a.check(); return0;}注意:〔1〕新設計的類中所需要的數據成員需要根據所要實現的功能自行設計;〔2〕用一個演示程序完成對所設計的新類的功能測試,并給出測試數據和實驗結果;〔3〕為增加程序可讀性,請在程序中對類成員進行適當注釋說明;補充實驗題: 〔1〕教材134頁【3.33】-【3.36】實驗二〔2010-3-23〕實驗名稱:復雜形式的對象。實驗目的:〔1〕掌握對象數組、對象指針和string類的使用方法; 把對象想象成一種數據類型比方整型有整型數組吧〔inta[10]〕自然也有對象數組 對象指針以以上類似有時涉及到動態聯編〔〕String類不如說是string類型類似于智能化的字符串數組〔2〕掌握對象數組、對象指針和對象引用作為函數參數的使用方法; 主要看書實際用的不多注意對象數組初始化方法〔書P77中上的說明〕〔3〕掌握類對象作為成員的使用方法; 了解就行〔4〕掌握友元的概念和使用方法; 通常的,通過A對象想要訪問B對象的私有成員是不可能的而通過友元就可以做到 需要注意的是友元函數雖然在類內聲明但是友元函數不是成員函數獨立于類外所以類外定義是不能加作用域“::〞 另外,由于使用的VisualC++6.0不是完全使用C++標準編程時如果遇到報錯內容為一堆大寫字母且錯誤位置指向友元函數的話把#include<iostream>usingnamespacestd;改為#include<iostream.h>還有!只有上述情況才可以把頭文件加上“.h〞,否那么會導致局部功能不正?!?〕掌握靜態數據成員和靜態成員函數的使用方法; 例如:有Object類,擁有數據成員a,由Object類聲明出的對象A、B、C,那么A、B、C都擁有各自的a,內存中也會分配出各自的內存空間A::a,B::a,C::a〔共3個〕。而如果將數據成員a聲明為靜態成員〔static〕,那么A、B、C那么共用一個內存空間a〔只有1個〕最典型的例子是統計聲明對象的數量使用方法:static數據類型數據成員名由于不能直接對數據成員賦初值所以靜態數據成員初始化方法為:數據類型類名::靜態數據成員名=初值〔注意:1.是類名,不是對象名;2.之前不要加static〕靜態成員函數靜態成員函數屬于整個類而不是某個對象所以調用方法為類名::靜態成員函數名(參數表)其他參看書P103幾點說明練習工程Time類的框架定義如下:#include<iostream.h>classTime //聲明Time類{public: Time(intA=0,intB=0,intC=0)//帶默認參數的構造函數 { hour=A; minute=B; second=C; } //setfunctions voidsetTime(inta,intb,intc) //設置hour,minute,second { cout<<"RunSetimeFunction"<<endl; setHour(a); setMinute(b); setSecond(c); }voidsetHour(inta)//設置hour(確保數據在合理范圍) { for(;;) { if(a>=24||a<0) { cout<<"小時輸入錯誤再來一次"<<endl; cin>>a; } else{break;} } hour=a; }voidsetMinute(inta) //設置minute(確保數據在合理范圍) { for(;;) { if(a>=60||a<0) { cout<<"\n分鐘輸入錯誤再來一次"<<endl; cin>>a; } else{break;} } minute=a; }voidsetSecond(inta) //設置second(確保數據在合理范圍) { for(;;) { if(a>=60||a<0) { cout<<"秒輸入錯誤再來一次"<<endl; cin>>a; } else {break;} } second=a; }//getfunctionsintgetHour()//返回hour { returnhour; }intgetMinute()//返回minute { returnminute; }intgetSecond()//返回second { returnsecond; }voidprintUniversal()//按24小時格式輸出時間:23:56:12 { cout<<getHour()<<":"<<getMinute()<<":"<<getSecond()<<endl; } voidprintStandard()//按12小時格式輸出時間:11:56:12(PM)或9:23:55(AM) {if(hour>12) cout<<(hour-12)<<":"<<minute<<":"<<second<<"(PM)"<<endl; else cout<<hour<<":"<<minute<<":"<<second<<"(AM)"<<endl; }private: inthour; //0-23(24小時格式) intminute;//0-59 intsecond;//0-59};//Timel類定義結束intmain(){ Timet; inta,b,c; cout<<"設置小時:"; cin>>a; cout<<"設置分鐘:"; cin>>b; cout<<"設置秒:"; cin>>c; t.setTime(a,b,c); t.printStandard(); t.printUniversal(); return0;2.設計一個用來表示直角坐標系的Location類,在主程序中創立類Location的兩個對象A和B,要求A的坐標在第3象限,B的坐標點在第2象限,分別采用成員函數和友元函數計算給定兩個坐標點之間的距離,要求按如下格式輸出結果:A〔x1,y1〕,B〔x2,y2〕Distance1=d1Distance2=d2其中:x1,x2,y1,y2為指定的坐標值,d1和d2為兩個坐標點之間的距離。Location類框架可參考如下:#include<iostream.h>#include<cmath>classLocation //聲明類Location{public: Location(double,double); //構造函數 doubleGetx(); //成員函數,取x坐標的值 doubleGety(); //成員函數,取y坐標的值 doubledistance1(Location&);//成員函數,求兩坐標點之間的距離frienddoubledistance2(Location&A,Location&B)//友元函數,求兩坐標點之間的距離 { returnsqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); }~Location(void){cout<<"Destrcted..";}private: doublex,y;};Location::Location(doublea,doubleb){ x=a; y=b;}doubleLocation::Getx(){ returnx;}doubleLocation::Gety(){ returny;}doubleLocation::distance1(Location&L){ returnsqrt((L.x-x)*(L.x-x)+(L.y-y)*(L.y-y));}intmain(){ doublea,b; cout<<"輸入A點坐標〔在第二象限〕:"<<endl; cout<<"x(x<0):"; for(;;) { cin>>a; if(a<0)break; cout<<"不對,再來一次:"; } cout<<"y(y>0):"; for(;;) { cin>>b; if(b>0)break; cout<<"不對,再來一次:"; } LocationA(a,b); cout<<"輸入B點坐標〔在第四象限〕:"<<endl; cout<<"x(x>0):"; for(;;) { cin>>a; if(a>0)break; cout<<"不對,再來一次:"; } cout<<"y(y<0):"; for(;;) { cin>>b; if(b<0)break; cout<<"不對,再來一次:"; } LocationB(a,b); cout<<"A("<<A.Getx()<<","<<A.Gety()<<")"<<endl; cout<<"B("<<B.Getx()<<","<<B.Gety()<<")"<<endl;1(B)<<endl; cout<<"Distance2="<<distance2(A,B)<<endl; return0;}3.使用C++的string類,將5個字符串按逆轉后的順序顯示出來。例如,逆轉前的5個字符串是:Germany逆轉后的順序輸出字符串是:France#include<iostream>#include<string>usingnamespacestd;intmain(void){ stringstr1,str2,str3,str4,str5; cin>>str1>>str2>>str3>>str4>>str5; cout<<str5<<""<<str4<<""<<str3<<""<<str2<<""<<str1<<endl; return0;}4.設計一個模仿類magic來實現4*4的魔方陣。類的框架如下:#include<iostream>usingnamespacestd;classmagic //聲明魔方陣類magic{public: voidgetdata(); //輸入初值成員函數 voidsetfirstmagic(); //設置初始魔方成員函數 intgenerate(); //生成最終魔方成員函數 intprintmagic(); //顯示魔方成員函數private: intm[4][4]; intstep; intfirst; intsumj;};voidmagic::getdata(){ cout<<"first=";cin>>first; cout<<"step=";cin>>step;}voidmagic::setfirstmagic(){ inttemp; temp=m[0][0]=first; for(inti=0,j=0;i<4;i++) for(j=0;j<4;j++) { if(i==0&&j==0)continue; temp+=step; m[i][j]=temp; } sumj=m[0][0]+m[3][3];}intmagic::generate(){ inti,j; for(i=0,j=3;i<4;i++,j--) { m[i][j]=sumj-m[i][j]; m[i][i]=sumj-m[i][i]; } return0;}intmagic::printmagic(){ cout<<endl; for(inti=0,j;i<4;i++) { for(j=0;j<4;j++) cout<<m[i][j]<<"\t"; cout<<endl; } return0;} intmain(void){ magicm; m.getdata(); m.setfirstmagic(); m.generate(); m.printmagic(); return0;}所謂4*4的魔方陣,是指該矩陣的各行值的和等于各列值的和,并等于兩對角線值的和,如:,其各行、各列以及對角線值的和都是64。求4*4的魔方陣的一般步驟提示如下:設置初始魔方的起始值和相鄰元素之間的差值。例如上述魔方陣的初始魔方的起始值和相鄰元素之間的差值分別為:first=1,step=2設置初始魔方元素的值。例如上述魔方的初始魔方陣為:生成最終魔方陣。方法如下:eq\o\ac(○,1)求最大元素和最小元素的和sum,本例為1+31=32。eq\o\ac(○,2)用32減去初始魔方陣所有對角線上元素的值,然后將結果放在原來的位置,即可求得最終的魔方陣。本例最終魔方陣為:編寫主程序,測試所設計的魔方類的正確性.5.聲明一個Employee類,數據成員包括:一個long型的id,兩個字符指針成員,代表職員的姓名和家庭住址,一個double數據,代表月薪。成員函數有:構造函數、析構函數、set_salary()和get_salary()代表修改和獲取薪資、set_name()和get_name()代表修改和獲取姓名、set_address()和get_address()代表修改和獲取家庭住址,set_id()和get_id()用來修改獲取當前職員的id號。在主程序中,創立對象數組調用上述函數以測試Employee類設計的正確性。Employee類的框架可參考:#include<iostream>#include<string>usingnamespacestd;classEmployee //聲明Employee類{public: Employee(long=0,char*="000",char*="000",double=0);//構造函數 ~Employee(); //析構函數 //setfunctions voidset_id(long); //設置id voidset_salary(double); //設置salaryvoidset_name(char*); //設置namevoidset_address(char*); //設置adress//getfunctions longget_id(); //返回iddoubleget_salary(); //返回salarychar*get_name(); //返回namechar*get_addressSecond(); //返回addressvoidprint(); //打印輸出Employee的相關信息private:longid; //工號char*name; //姓名char*address; //家庭住址doublesalary; //月薪};//Employee類聲明結束Employee::Employee(long,char*,char*,double){ name=newchar; address=newchar;}voidEmployee::set_address(char*q){ address=q;}voidEmployee::set_id(longa){ id=a;}voidEmployee::set_name(char*z){ name=z;}voidEmployee::set_salary(doublea){ salary=a;}longEmployee::get_id(){ returnid;}doubleEmployee::get_salary(){ returnsalary;}char*Employee::get_name(){ returnname;}char*Employee::get_addressSecond() //返回address{ returnaddress;}Employee::~Employee(){}voidEmployee::print(){ cout<<"======================================================="<<endl; cout<<"\tID"<<get_id()<<"\t\t"<<"姓名::"<<get_name()<<"\n\t月薪:"<<get_salary()<<endl; cout<<"\t住址:"<<get_addressSecond()<<endl;}intmain(void){ cout<<"輸入要統計的員工數量:"; inti;cin>>i; intj=0,a; doubleb; cout<<"\n\n\n\t\t\t\t===錄入信息==="<<endl; Employees[1000]; char*p; for(;j<i;j++) { cout<<"\n輸入員工ID:"; cin>>a; s[j].set_id(a); p=newchar[1000]; cout<<"員工姓名:";cin>>p; s[j].set_name(p); p=newchar[1000]; cout<<"員工住址:";cin>>p; s[j].set_address(p); cout<<"輸入員工工資:"; cin>>b; s[j].set_salary(b); } for(j=0;j<i;j++) s[j].print(); return0;}6.聲明一個Student類,在該類中包括一個數據成員:score〔代表課程成績〕、兩個靜態數據成員:total_score〔代表總分〕,count〔代表學生總人數〕。成員函數有:構造函數、析構函數、account〔int〕用于設置分數、靜態成員函數sum()返回所有學生的總成績、靜態成員函數average()返回所有學生的平均成績、print()用于打印當前學生對象的成績等。在主程序中,輸入某班同學的成績,并調用上述函數打印全班同學的成績、求出全班學生的成績之和與平均分等。Student類的框架可參考:#include<iostream>#include<string>usingnamespacestd;classStudent //聲明Student類{public: Student(int=0); //構造函數 ~Student(); //析構函數 voidaccount(int); //設置分數 staticintsum(); //返回總成績 staticdoubleaverage();//返回平均成績 voidprint2(); // 打印輸出Student的平均成績和總成績voidprint(); // 打印輸出Student的相關信息private:intscore; //分staticinttotal_score; //總分staticintcount; //人數};//Student類聲Student::Student(int){ score=0;}Student::~Student(){}voidStudent::account(inta){ score=a; total_score+=score; count++;}intStudent::sum(){ returnStudent::total_score;}doubleStudent::average(){ returnStudent::total_score/double(Student::count);}voidStudent::print(){ cout<<score<<"\t";}voidStudent::print2(){ cout<<"\n全班統計:\n總成績:"<<Student::sum()<<"\n平均成績:"<<Student::average()<<endl;}intStudent::count=0;intStudent::total_score=0;intmain(void){ inti=0,a; Students[100]; cout<<"開始錄入成績,輸入-1結束"<<endl; while(i>=0) { cin>>a; if(a<0) { cout<<"成績錄入結束"<<endl;break; } s[i++].account(a); } cout<<"輸出全班成績:"<<endl; intj=1; while(i>0) { s[--i].print(); if(j++%6==0)cout<<endl; } s[0].print2(); return0;}注意:靜態成員和非靜態成員的初始化方式的區別。實驗三派生與繼承〔2010-3-23〕實驗名稱:派生與繼承。實驗目的:理解繼承的含義,掌握派生類的定義方法和實現;繼承就是子承父類看書注意格式私有成員不能繼承父類的保護成員繼承成變為子類的私有成員理解公有繼承下基類成員對派生類成員和派生類對象的可見性,能正確地訪問繼承層次中的各種類成員;理解保護成員在繼承中的作用,能夠在適當的時候選擇使用保護成員以便派生類成員可以訪問基類的局部非公開的成員;理解虛函數在類的繼承層次中的作用,虛函數的引入對程序運行時的影響,能夠對使用虛函數的簡單程序寫出程序結果。練習工程“點〞類Point,再由“點〞類派生出“圓〞類Circle。#include<iostream.h>classPoint//定義“點〞類{ intx,y;public: Point(inta=0,intb=0) { x=a;y=b; } voidShowPoint() { cout<<"Point:("<<x<<','<<y<<")\n"; } intGetx() { returnx;} intGety() { returny; } voidSetxy(inta,intb) { x=a;y=b; }};classCircle:publicPoint//定義“圓〞類,公有繼承{ intr;//“圓〞的半徑public: Circle(intx,inty,intra):Point(x,y)//B { r=ra; } voidSetr(intra) { r=ra;} doubleArea()//求圓的面積 { returnPI*r*r; } voidMove(intx_offset,inty_offset)//將圓心坐標平移 { intx1=Getx();//存取基類的私有成員 inty1=Gety();//D x1+=x_offset;y1+=y_offset;Setxy(x1,y1);//E } voidShowCircle() { ShowPoint();//F cout<<"Radius:"<<r<<'\t'; cout<<"Area:"<<Area()<<endl;//G }};voidmain(){ Circlec(1,1,1); c.ShowCircle(); c.Move(1,2); c.ShowCircle();c.Setxy(4,5);//重新置圓心坐標 c.Setr(2);//重新置半徑值 c.ShowCircle();}記錄程序的運行結果測試能否將move函數體改寫為x=x+x_offset;y=y+y_offset; 運行結果略1(2)不能改寫派生類不能直接訪問基類的私有成員2:先定義“點〞類Point和“半徑〞類Radius,再由Point類和Radius類多重派生出“圓〞類Circle。#include<iostream.h>classPoint{protected://A intx,y;public: Point(inta=0,intb=0){x=a;y=b;} voidShowPoint(){cout<<"Point:("<<x<<','<<y<<")\n";} intGetx(){returnx;} intGety(){returny;} voidSetxy(inta,intb){x=a;y=b;}};classRadius{protected://B intr;public: Radius(intra=0){r=ra;} voidSetr(intra){r=ra;} intGetr() {returnr;}};classCircle:publicPoint,publicRadius{public: Circle(intx,inty,intra):Point(x,y),Radius(ra)//D {}doubleArea() {returnPI*r*r;}//直接訪問基類的保護成員voidMove(intx_offset,inty_offset) {x+=x_offset;y+=y_offset;}voidShowCircle() { ShowPoint(); cout<<"Radius:"<<r<<'\t'; cout<<"Area:"<<Area()<<endl; }};voidmain(){ Circlec(1,1,1); c.ShowCircle(); c.Move(1,2); c.ShowCircle(); c.Setxy(4,5); c.Setr(2); c.ShowCircle();}記錄程序的運行結果運行結果略為什么可以直接使用x,y,基類的數據成員x,y為保護數據成員相當于派生類的私有數據成員可以被派生類的成員函數訪問如果x,y在基類中是私有的行嗎?私有那么不能被訪問3.多重繼承中基類構造函數和析構函數的調用順序#include<iostream.h>classBase1{protected: intdata1;public: Base1(inta=0) { data1=a; cout<<"BaseConstructor1\n"; } ~Base1() { cout<<"BaseDestructor1\n";}};classBase2{protected: intdata2;public: Base2(inta=0) { data2=a; cout<<"BaseConstructor2\n"; } ~Base2() { cout<<"BaseDestructor2\n";}};classDerived:publicBase1,publicBase2{ intd;public: Derived(intx,inty,intz):Base1(x),Base2(y) {d=z; cout<<"DerivedConstructor\n"; } ~Derived() {cout<<"DerivedDestructor\n";} voidShow() {cout<<data1<<','<<data2<<','<<d<<endl;}};voidmain(){ Derivedc(1,2,3); c.Show();}記錄程序的運行結果運行結果:BaseConstructor1BaseConstructor2DerivedConstructor1,2,3DerivedDestructorBaseDestructor2BaseDestructor1Pressanykeytocontinue要求記住調用順序#include<iostream.h>classBase1{protected: intdata1;public: Base1(inta=8){ data1=a; cout<<data1<<",BaseConstructor1\n"; } ~Base1() { cout<<data1<<",BaseDestructor1\n"; }};classBase2{protected:intdata2;public: Base2(inta=9) { data2=a; cout<<data2<<",BaseConstructor2\n"; } ~Base2() { cout<<data2<<",BaseDestructor2\n"; }};classDerived:publicBase1,publicBase2{ intd; Base1b1,b2;public:Derived(intx,inty,intz):Base1(x),Base2(y),b1(x+y),b2(x+z) { d=z;cout<<"DerivedConstructor\n"; } ~Derived() { cout<<"DerivedDestructor\n"; } voidShow() { cout<<data1<<','<<data2<<','<<d<<endl; }};voidmain(){ Derivedc(1,2,3); c.Show();}記錄程序的運行結果1,BaseConstructor12,BaseConstructor23,BaseConstructor14,BaseConstructor1DerivedConstructor1,2,3DerivedDestructor4,BaseDestructor13,BaseDestructor12,BaseDestructor21,BaseDestructor1Pressanykeytocontinue5.編程題假設某商店有如下幾種貨品:襯衣、帽子、立柜。每一種貨物都有與其關聯的說明信息。襯衣:單價、產地、庫存量、布料;帽子:單價、產地、庫存量、布料、樣式〔平頂或尖頂〕;立柜:單價、產地、庫存量、木料、顏色。對這些商品的操作有:商品的進庫〔增加庫存量〕,商品的出庫〔減少庫存量〕,該類貨品總價格的計算。要求自行設計數據結構,用類的繼承與派生關系將上述的各種貨品表示出來,并使用類的構造函數來初始化每一類對象的初始數據。而后將上述的商品管理計算機化,完成操作要求的功能。【實現方法提示】1.設立3個不同的類來描述與處理3種不同的貨品。首先注意到上述3種貨品數據之間的相互關聯關系,可使用C++基類及其派生類的定義方法,先抽象出〔“提取〞出〕如下每一貨品都具有的“公有〞數據構成一個所謂的基類base,而后再派生出所需的那3個類。〔1〕base〔基〕類:單價、產地、庫存量;〔2〕由base作為基類,派生出shirt〔襯衣〕類:增加“布料〞數據;〔3〕由base出發,派生出wardrobe〔立柜〕類:增加“木料〞與“顏色〞數據;〔4〕而后又由shirt類出發〔作為基類〕,派生出cap〔帽子〕類:增加“樣式〞數據。2.對應于要對各類數據所進行的操作,而設立出類的如下幾個成員函數。〔1〕構造函數通過傳遞來的實參數據,來構造出每一對象所具有的各數據成員。如基類base需要傳遞place、count與price三項數據,而派生類shirt那么需在base數據的根底上增加第四項即布料數據material等?!?〕商品的進庫〔增加庫存量〕voidin_something(intadd_cnt);將對象的庫存量count增加一個數量add_cnt?!?〕商品的出庫〔減少庫存量〕voidout_something(intdel_cnt);將對象的庫存量count減少一個數量del_cnt。〔4〕該類貨品總價格的計算doubletotal_price();通過使用“price*count〞計算并返回對象所代表貨品的總價格?!?〕對象數據的輸出。在屏幕上顯示出對象所擁有的當前數據。代碼:#include<iostream>#include<string>usingnamespacestd;classbase{protected: stringplace; intcount; doubleprice;public: base(stringpl,doublepr,intc); voidin_something(intadd_cnt); voidout_something(intdel_cnt);};classwardrobe:publicbase{ stringcolor; stringwood;public: wardrobe(stringpl,doublepr,intc,stringco,stringwo):base(pl,pr,c) { color=co; wood=wo; } voidprint();};classshirt:publicbase{protected: stringmaterial;public: shirt(stringpl,doublepr,intc,stringma):base(pl,pr,c) { material=ma; } voidprint();};classcap:publicshirt{ stringstyle;public: cap(stringpl,doublepr,intc,stringma,stringst):shirt(pl,pr,c,ma) { style=st; } voidprint();};base::base(stringpl,doublepr,intc){ place=pl; price=pr; count=c;}voidbase::in_something(intadd_cnt){ count+=add_cnt; }voidbase::out_something(intdel_cnt){ count-=del_cnt; if(count<0)count=0;}voidshirt::print(){ cout<<"襯衣\t產地:"<<place<<"\t布料:"<<material<<"\n單價:"<<price<<"\t數量:"<<count<<"\t總價:"<<price*count<<endl;}voidcap::print() { cout<<"帽子\t產地:"<<place<<"\t布料:"<<material<<"\t樣式:"<<style<<"\n單價:"<<price<<"\t數量:"<<count<<"\t總價:"<<price*count<<endl;}voidwardrobe::print() { cout<<"立柜\t產地:"<<place<<"\t顏色:"<<color<<"\t木料:"<<wood<<"\n單價:"<<price<<"\t數量:"<<count<<"\t總價:"<<price*count<<endl;}intmain(void){ shirts("廣州",55.8,20,"棉"); capc("蘇州",23.5,30,"帆布","A"); wardrobew("福建",1200,10,"紅色","樟木"); stringa; cout<<"有如下商品:"<<endl; s.print(); c.print(); w.print(); inttemp; while(a!="0") { cout<<"輸入相應物品進行相應操作〔襯衣:s帽子:c立柜:w結束:0〕"<<endl; cin>>a; if(a=="s"){ cout<<"+為入庫-為出庫?為查詢";cin>>a; if(a=="+"){cout<<"入庫數量:";cin>>temp;s.in_something(temp);} if(a=="-"){cout<<"出庫數量:";cin>>temp;s.out_something(temp);} if(a=="?")s.print(); } elseif(a=="c"){ cout<<"+為入庫-為出庫?為查詢";cin>>a; if(a=="+"){cout<<"入庫數量:";cin>>temp;c.in_something(temp);} if(a=="-"){cout<<"出庫數量:";cin>>temp;c.out_something(temp);} if(a=="?")c.print(); } elseif(a=="w"){ cout<<"+為入庫-為出庫?為查詢";cin>>a; if(a=="+"){cout<<"入庫數量:";cin>>temp;w.in_something(temp);} if(a=="-"){cout<<"出庫數量:";cin>>temp;w.out_something(temp);} if(a=="?")w.print(); } elseif(a=="0"){s.print();c.print();w.print();} elsecout<<"有誤重新"; } return0;}運行結果:有如下商品:襯衣產地:廣州布料:棉單價:55.8數量:20總價:1116帽子產地:蘇州布料:帆布樣式:A單價:23.5數量:30總價:705立柜產地:福建顏色:紅色木料:樟木單價:1200數量:10總價:12000輸入相應物品進行相應操作〔襯衣:s帽子:c立柜:w結束:0〕s+為入庫-為出庫?為查詢+入庫數量:20輸入相應物品進行相應操作〔襯衣:s帽子:c立柜:w結束:0〕c+為入庫-為出庫?為查詢-出庫數量:100輸入相應物品進行相應操作〔襯衣:s帽子:c立柜:w結束:0〕w+為入庫-為出庫?為查詢?立柜產地:福建顏色:紅色木料:樟木單價:1200數量:10總價:12000輸入相應物品進行相應操作〔襯衣:s帽子:c立柜:w結束:0〕0襯衣產地:廣州布料:棉單價:55.8數量:40總價:2232帽子產地:蘇州布料:帆布樣式:A單價:23.5數量:0總價:0立柜產地:福建顏色:紅色木料:樟木單價:1200數量:10總價:12000Pressanykeytocontinue實驗四〔2010-4多態程序設計實驗目的:〔1〕掌握運算符重載的方法; 運算符其實相當于一個函數只不過我們平時使用的是它的隱式形式重載是函數名不變,帶入函數的參數個數不變,但參數類型必須改變,返回值類型改變,功能也隨之發生相應變化其實質是將函數功能拓展函數重載的方法與定義一個函數的方法幾乎完全相同格式為:返回值類型作用域::重載函數名〔參數表〕{函數定義}注意:類其實也可以看做是一種數據類型所以return之后可以返回一個對象〔2〕掌握使用虛函數實現動態多態性; 也叫動態聯編是通過指針實現的練習工程1.定義Point類,有坐標x,y兩個成員變量,利用友元函數對Point類重載“++〞運算符,實現對坐標值的改變。具體要求如下:編寫程序定義Point類,在類中定義整型的私有成員變量x,y;在類中定義兩個友元函數,分別重載前置++和后置++;編寫主函數測試。注意函數有無返回值的區別,以及返回值是否帶有&應用符號。1程序代碼:#include<iostream.h>//usingnamespacestd;classPoint{ intx,y;public: Point(){} Point(int&a,int&b) { x=a,y=b; } friendPointoperator++(Point&c){ inta,b; a=++c.x; b=++c.y; cout<<"->x="<<a<<",y="<<b<<endl; returnc; } friendPointoperator++(Point&c,int){ inta,b; a=c.x++; b=c.y++; cout<<"->x="<<a<<",y="<<b<<endl; returnc; } voidshow() { cout<<"->x="<<x<<",y="<<y<<endl; }};intmain(void){ cout<<"x,y"<<endl; inta,b; cin>>a;cin>>b; Pointob1(a,b); cout<<"Point++";ob1++; cout<<"NowPoint"; ob1.show(); cout<<"++Point";++ob1; cout<<"NowPoint"; ob1.show(); return0;}運行結果:x,y56Point++->x=5,y=6NowPoint->x=6,y=7++Point->x=7,y=8NowPoint->x=7,y=8Pressanykeytocontinue2.定義Point類,有坐標x,y兩個成員變量,利用運算符重載對Point類重載“++〞運算符,實現對坐標值的改變。具體要求如下:編寫程序定義Point類,在類中定義整型的私有成員變量x,y;定義成員函數Point&operator++();Pointoperator++(int);以實現對Point類重載“++〞運算符,分別重載前置++和后置++;編寫主函數測試。2程序代碼:#include<iostream>usingnamespacestd;classPoint{ intx,y;public: Point(){} Point(int&a,int&b) { x=a; y=b; } Pointoperator++(int){ inta,b; a=x++; b=y++; cout<<"Point++->x="<<a<<",y="<<b<<endl; return*this; } Pointoperator++(){ inta,b; a=++x; b=++y; cout<<"++Point->x="<<a<<",y="<<b<<endl; return*th
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 今天山西高考語文作文
- 5-7MSI同步計數器2-74161實現模長小于16任意進制計數器
- 湖北省部分重點中學2023~2024學年高二數學下學期五月聯考試卷含答案
- 上海閔行區2025屆高三高考化學試題系列模擬卷(4)含解析
- 吉林省松原市扶余第一中學2025屆高三下學期第二次階段考試數學試題含解析
- 山西醫科大學晉祠學院《中西醫臨床診療技術》2023-2024學年第一學期期末試卷
- 吉林省長春市第151中學2025屆高三下學期線上周語文試題含解析
- 泉州醫學高等??茖W校《軟件項目》2023-2024學年第二學期期末試卷
- 上海市華師大二附中2025屆高三下學期第二次診斷性測驗生物試題試卷含解析
- 南通大學《DSP原理與應用》2023-2024學年第二學期期末試卷
- 音樂(歌唱)《買菜》
- 美團運營大綱
- 【公開課】第6課+凝神造像-中國傳統雕塑+課件高中美術人教版(2019)美術鑒賞
- (2.22)-一、壓花原理壓花藝術
- 國際石油合作合同協議書模式分析
- 小型手推式除雪機及論文
- 2023年初級社工證考試-社會工作實務試題及答案
- 藥事管理醫療機構藥事管理
- 實體與虛空-凝固的音樂+課件高一上學期美術人美版(2019)美術鑒賞
- 【杜邦分析體系下揚子江藥業盈利質量案例分析(7700字)】
- 幼兒園防汛工作安全排查表
評論
0/150
提交評論