c++程序?qū)嶒?yàn)報(bào)告_第1頁
c++程序?qū)嶒?yàn)報(bào)告_第2頁
c++程序?qū)嶒?yàn)報(bào)告_第3頁
c++程序?qū)嶒?yàn)報(bào)告_第4頁
c++程序?qū)嶒?yàn)報(bào)告_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)一:C++程序的基本運(yùn)行與操作一.試驗(yàn)?zāi)康?.初步理解程序的編譯、連接和運(yùn)行的過程。

2.掌握和理解程序的構(gòu)造。二.試驗(yàn)內(nèi)容1.使用VC2.運(yùn)行三個(gè)簡樸的程序例:4.9#include<iostream.h>intm(8);intadd_int(intx,inty=7,intz=m);voidmain(){ inta(5),b(15),c(20); ints=add_int(a,b); cout<<s<<endl;}intadd_int(intx,inty,intz){ returnx+y+z;}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:在闡明函數(shù)add_int()時(shí),給函數(shù)參數(shù)設(shè)置了默認(rèn)值,其中一種參數(shù)的值被設(shè)置為一種已知變量(m)的值。例:4.10#include<iostream.h>inta[8]={1,3,5,7,9,11,13};voidfun(intb[],intn){ for(inti=0;i<n-1;i++) b[7]+=b[i];}voidmain(){ intm=8; fun(a,m); cout<<a[7]<<endl;}用數(shù)組作為函數(shù)參數(shù),在main()中,輸出數(shù)組a的元素a[7]的值為b[7]的值。例:4.13#include<iostream.h>inlineintpower_int(intx){ return(x)*(x);}voidmain(){ for(inti=1;i<=10;i++) { intp=power_int(i); cout<<i<<"*"<<i<<"="<<p<<endl; 南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:函數(shù)power-int()是一種內(nèi)聯(lián)函數(shù)。三.試驗(yàn)環(huán)境PC微機(jī):操作系統(tǒng):VC程序集成環(huán)境。四、試驗(yàn)心得與體會(huì)通過在MicrosoftVisualC++6.0編程環(huán)境中運(yùn)行簡樸的示例程序,基本上熟悉了MicrosoftVisualC++6.0的基本使用。程序的對否可通過MicrosoftVisualC++6.0來檢查,調(diào)試,修改最終將程序修改對的。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)二:構(gòu)造函數(shù)與析構(gòu)函數(shù)一、試驗(yàn)?zāi)康模?.熟悉類的構(gòu)造函數(shù)與析構(gòu)函數(shù)2.通過上機(jī)掌握構(gòu)造函數(shù)與析構(gòu)函數(shù)詳細(xì)調(diào)用二.試驗(yàn)內(nèi)容1.使用VC2.編寫兩個(gè)程序,驗(yàn)證構(gòu)造函數(shù)與析構(gòu)函數(shù)是怎么運(yùn)行的,看運(yùn)行成果與自己讀的成果有什么不一樣例:5.2#include<iostream.h>classTpoint{public: voidSetPoint(intx,inty); intXcoord() {returnX;}intYcoord() {returnY;} voidMove(intxOffset,intyOffset);private: intX,Y;};voidTpoint::SetPoint(intx,inty){ X=x; Y=y;}voidTpoint::Move(intxOffset,intyOffset){ X+=xOffset; Y+=yOffset;}voidmain(){ Tpointp1,p2; p1.SetPoint(3,5); p2.SetPoint(8,10); p1.Move(2,1); p2.Move(1,-2); cout<<"x1="<<p1.Xcoord()<<",y1="<<p1.Ycoord()<<endl;cout<<"x2="<<p2.Xcoord()<<",y2="<<p2.Ycoord()<<endl;}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該程序重要為理解類,對象,組員函數(shù)的基本概念及運(yùn)行方式。點(diǎn)類名為TPoint,該類有四個(gè)公有組員,它們都為組員函數(shù)。SetPoint()用來給對象的數(shù)據(jù)組員賦值,Xcoord()用來返回?cái)?shù)據(jù)組員X值,Ycoord()用來返回?cái)?shù)據(jù)組員Y值,Move用來變化某個(gè)點(diǎn)的坐標(biāo)值。該類有兩個(gè)私有組員,為Int型變量X和Y,用來表達(dá)某一點(diǎn)的坐標(biāo)值。例:5.3#include<iostream.h>classTDatel{public: TDatel(inty,intm,intd); ~TDatel(); voidPrint();private: intyear,month,day;};TDatel::TDatel(inty,intm,intd){ year=y; month=m; day=d; cout<<"Constructorcalled.\n";}TDatel::~TDatel(){ cout<<"Destructorcalled.\n";}voidTDatel::Print(){ cout<<year<<"."<<month<<"."<<day<<endl;}voidmain(){ TDateltoday(1998,4,9),tomorrow(1998,4,10); Cout<<"todayis"; today.Print(); cout<<"tomorrowis"; tomorrow.Print();}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:程序中定義了兩個(gè)對象,并對他們進(jìn)行初始化,初始化由構(gòu)造函數(shù)實(shí)現(xiàn),構(gòu)造函數(shù)又是自動(dòng)。調(diào)用的,共調(diào)用兩次,析構(gòu)函數(shù)也是被自動(dòng)調(diào)用的,在輸出函數(shù)結(jié)束前,調(diào)用了兩次析構(gòu)函數(shù)。三.試驗(yàn)環(huán)境PC微機(jī);操作系統(tǒng):VC程序集成環(huán)境。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)三常類型與數(shù)據(jù)轉(zhuǎn)換一、試驗(yàn)?zāi)康模?.熟悉常類型與數(shù)據(jù)轉(zhuǎn)換2.通過上機(jī)掌握常類型與數(shù)據(jù)轉(zhuǎn)換二.試驗(yàn)內(nèi)容1.使用VC2.編寫兩個(gè)程序,熟悉并掌握常類型與數(shù)據(jù)轉(zhuǎn)換例6.11#include<iostream.h>constintN=6;voidprint(constint*p,intn);voidmain(){ intarray[N]; for(inti=0;i<N;i++) cin>>array[i]; print(array,N);}voidprint(constint*p,intn){ cout<<"{"<<*p; for(inti=1;i<n;i++) cout<<","<<*(p+i); cout<<"}"<<endl;}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該程序中,出現(xiàn)了兩處const修飾符。一是定義int型常量N,二是定義了一種指向常量數(shù)組元素的指針。該數(shù)組元素不能被更新。但程序中有一問題,print()函數(shù)中,實(shí)參array是一種int數(shù)組名,形參為constint的指針,類型不一樣,但沒有出現(xiàn)類型錯(cuò)誤。由于形參雖指向一種非constint數(shù)組,該數(shù)組可更新,但在print()函數(shù)中不能更新。例6.20#include<iostream.h>classRational{public:Rational(intd,intn){ den=d; num=n;}operatordouble();private: intden,num;};Rational::operatordouble(){ returndouble(den)/double(num);}voidmain(){ Rationalr(5,8); doubled=4.7; d+=r; cout<<d<<endl;}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:d是一種double數(shù)值,r是Rational類的對象。兩個(gè)不一樣類型的數(shù)據(jù)進(jìn)行加法之因此進(jìn)行,得益于類型轉(zhuǎn)換函數(shù)operatordouble().編譯系統(tǒng)先查看類Rational的闡明,看與否存在類型轉(zhuǎn)換函數(shù)將Rational類型的操作數(shù)轉(zhuǎn)換為double類型的闡明。由于Rational類中闡明了類型轉(zhuǎn)換函數(shù)operatordouble(),因此在運(yùn)行時(shí)可進(jìn)行上述類型轉(zhuǎn)換。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)四派生類的構(gòu)造函數(shù)與虛基類一、試驗(yàn)?zāi)康模?.熟悉派生類的構(gòu)造函數(shù)與虛基類2.通過上機(jī)掌握派生類的構(gòu)造函數(shù)與虛基類二.試驗(yàn)內(nèi)容1.使用VC2.編寫兩個(gè)程序,熟悉并掌握派生類的構(gòu)造函數(shù)與虛基類例7.4#include<iostream.h>classA{public: A() { a=0;cout<<"A'sdefalutconstructorcalled.\n"; } A(inti) { a=i;cout<<"A'sconstructorcalled.\n"; }~A(){cout<<"A'sdefalutconstructorcalled.\n";} voidPrint()const { cout<<a<<","; } intGeta() {returna;}private: inta;};classB:publicA{public:B(){b=0;cout<<"B'sdefalutconstructorcalled.\n";}B(inti,intj,intk);~B(){cout<<"B'sdefalutcalled.\n";}voidPrint();private: intb; Aaa;};B::B(inti,intj,intk):A(i),aa(j){ b=k; cout<<"B'sconstructorcalled.\n";}voidB::Print(){A::Print();cout<<b<<","<<aa.Geta()<<endl;}voidmain(){Bbb[2];bb[0]=B(1,2,5);bb[1]=B(3,4,7);for(inti=0;i<2;i++)bb[i].Print();}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該程序中,先定義了類A,再定義了類B,它是類A的派生類。繼承方式為公有繼承。派生類B的構(gòu)造函數(shù)格式如下:B(inti,intj,intk):A(i),aa(j){ b=k; cout<<"B'sconstructorcalled.\n";}B是派生類構(gòu)造函數(shù)名,總參數(shù)表中有三個(gè)參數(shù):i用來初始化基類的數(shù)據(jù)組員,j用來初始化B的子對象aa,k用來初始化B的數(shù)據(jù)組員b.執(zhí)行次序:先創(chuàng)立兩個(gè)對象元素的對象數(shù)組。調(diào)用兩次類B的默認(rèn)構(gòu)造函數(shù),每調(diào)用一次類B的默認(rèn)構(gòu)造函數(shù)時(shí),先調(diào)用兩次類A的默認(rèn)構(gòu)造函數(shù)和一次類B的默認(rèn)構(gòu)造函數(shù)。接著,程序中出現(xiàn)了兩個(gè)賦值語句。系統(tǒng)要建立一種臨時(shí)對象,調(diào)用B類的三個(gè)參數(shù)的構(gòu)造函數(shù)對它初始化,并賦給左值對象,再調(diào)用B類的析構(gòu)函數(shù)將臨時(shí)對象刪除。輸出兩個(gè)類B對象的數(shù)據(jù)組員值。最終,程序結(jié)束前系統(tǒng)調(diào)用類B的析構(gòu)函數(shù)。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:例7.10#include<iostream.h>classA{public: A(constchar*s) {cout<<s<<endl;}~A(){}};classB:virtualpublicA{public: B(constchar*s1,constchar*s2):A(s1) { cout<<s2<<endl; }};classC:virtualpublicA{public: C(constchar*s1,constchar*s2):A(s1) { cout<<s2<<endl; }};classD:publicB,publicC{public: D(constchar*s1,constchar*s2,constchar*s3,constchar*s4) :B(s1,s2),C(s1,s3),A(s1) { cout<<s4<<endl;};voidmain(){D*ptr=newD("classA","classB","classC","classD");deleteptr;}該程序中,定義了類A,類B,類C和類D。在派生類B和C中使用了虛基類,使得建立的D類對象只創(chuàng)立一次虛基類子對象。在派生類B,C,D的構(gòu)造函數(shù)的組員初始化列表中均包括了對虛基類A的構(gòu)造函數(shù)。在建立類D的對象時(shí),只有類D的構(gòu)造函數(shù)的組員初始化列表中列出的虛基類構(gòu)造函數(shù)被調(diào)用,并且僅調(diào)用一次,而類D的虛類的構(gòu)造函數(shù)的組員初始化列表中列出的虛基類構(gòu)造函數(shù)不被執(zhí)行。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)五運(yùn)算符重載一、試驗(yàn)?zāi)康模?.熟悉運(yùn)算符重載2.通過上機(jī)掌握運(yùn)算符重載二.試驗(yàn)內(nèi)容1.使用VC2.編寫兩個(gè)程序,熟悉并掌握運(yùn)算符重載例8.4#include<iostream.h>classA{public: A() {X=Y=0;} A(inti,intj) {X=i;Y=j;} A(A&p) {X=p.X;Y=p.Y;} A&operator=(A&p); intgetX() {returnX;} intgetY() {returnY;}private: intX,Y;};A&A::operator=(A&p) { X=p.X; Y=p.Y; cout<<"Assignmentoperatorcalled.\n"; return*this; }voidmain(){Aa(7,8);Ab;b=a;cout<<b.getX()<<","b.getY()<<endl;}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該程序中,在類A內(nèi)定義了一種賦值運(yùn)算符函數(shù),它被定義為組員函數(shù)。程序中,體現(xiàn)式:b=a被編譯程序解釋為:

b.operator=(a)調(diào)用下列函數(shù):A&A::operator=(A&p)完畢賦值操作。例8.7#include<iostream.h>classF{public: doubleoperator()(doublex,doubley)const;};doubleF::operator()(doublex,doubley)const{ return(x+5)*y;}voidmain(){ Ff; cout<<f(1.5,2.2)<<endl;}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該程序?qū)崿F(xiàn)f(x,y)=(x+5)y函數(shù)的抽象。Main()函數(shù)中出現(xiàn)的體現(xiàn)式:f(1.5,2.2)被編譯程序解釋為:F.operator()(1.5,2.2)F是類F的對象。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)六動(dòng)態(tài)聯(lián)編一、試驗(yàn)?zāi)康模?.熟悉動(dòng)態(tài)聯(lián)編2.通過上機(jī)掌握動(dòng)態(tài)聯(lián)編二.試驗(yàn)內(nèi)容1.使用VC2.編寫兩個(gè)程序,熟悉并掌握動(dòng)態(tài)聯(lián)編例8.9#include<iostream.h>classPoint{public: Point(doublei,doublej) {x=i,y=j;} virtualdoubleArea()const {return0.0; }private: doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel); virtualdoubleArea()const{returnw*h;}private: doublew,h;};Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){w=k;h=l;}voidfun(Point&s){cout<<s.Area()<<endl;}voidmain(){ Rectanglerec(3.0,5.2,15.0,25.0); fun(rec);}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該程序中類Point中的Area()函數(shù)和類Rectangle中的Area()函數(shù)為虛函數(shù),在fun()函數(shù)的對象引用參數(shù)s被動(dòng)態(tài)聯(lián)編,該函數(shù)體內(nèi)調(diào)用的Area()函數(shù)是在運(yùn)行中束定的,它被確定為Rectangle類的Area(0函數(shù),因此成果為375.例8.14#include<iostream.h>classA{public: virtualvoidf() {cout<<"A::f()called.\n";}};classB:publicA{public: virtualvoidf() {cout<<"B::f()called.\n";}};voidmain(){ Bb; A&r=b; void(A::*pf)()=A::f; (r.*pf)();}南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:該例闡明當(dāng)使用指向類的組員函數(shù)的指針來標(biāo)識虛函數(shù)時(shí)在公有繼承的條件下,對該虛函數(shù)的調(diào)用采用動(dòng)態(tài)聯(lián)編。南昌大學(xué)試驗(yàn)匯報(bào)學(xué)生姓名:學(xué)號:專業(yè)班級:試驗(yàn)類型:□驗(yàn)證□綜合□設(shè)計(jì)□創(chuàng)新試驗(yàn)日期:試驗(yàn)成績:試驗(yàn)七撲克牌游戲程序設(shè)計(jì)試驗(yàn)?zāi)康模涸O(shè)計(jì)撲克牌游戲二、試驗(yàn)規(guī)定創(chuàng)立一副撲克,并完畢洗牌、發(fā)牌、顯示、花色排序、面值排序、刪除一張牌、刪除一輪牌等操作。三、試驗(yàn)內(nèi)容1.使用VC2.編寫程序,掌握并能純熟應(yīng)用C++基礎(chǔ)知識與實(shí)踐中#include<iostream.h>#include<string.h>#include<conio.h>#include<stdlib.h>#include<stdio.h>#include<time.h>classPlaying_Card/*撲克牌類,表達(dá)一張撲克牌的面值、花色和與之相聯(lián)絡(luò)的操作*/{private: intm_Value;//撲克的實(shí)際面值,用整型值表達(dá),從1開始,1~13 charm_Face[3];/*撲克的數(shù)字大小,用字符串的形式表達(dá),為A,2,3,…,10,J,Q,K*/ charm_Suit;//撲克的花色(黑、紅、梅、方)public: Playing_Card(); //構(gòu)造函數(shù),初始化撲克對象,實(shí)際上是將對象清零 voidshowcard(); //顯示撲克牌對象的面值,花色 voidCard_Make(int);//為一張撲克牌對象賦予特定的面值和花色 friendclassPerDeck;//定義類PerDeck為類Playing_Card的友元類};classDeck //一副撲克(54張)類{private: Playing_Cardm_cardarray[54]; //一副撲克由54張撲克牌構(gòu)成 intm_lastdelt;//標(biāo)識這副撲克牌刪除的張數(shù)public: Deck(); /*構(gòu)造函數(shù),初始化一副撲克牌對象,實(shí)際上是將其內(nèi)的54張撲克牌清零*/ voidMakeDeck();/*生成一副撲克,即對其內(nèi)的54張撲克賦予對的的面值及花色*/ voidShowDeck(); //依次逐張顯示這副牌 voidDeckShuff(int); //洗牌,其參數(shù)是洗牌的次數(shù) voidRemove_Card(); /*將刪除的那張撲克牌的內(nèi)容清零,使這張牌在屏幕上顯示不出來*/ friendclassPerDeck;//定義類PerDeck為類Deck的友元類};classPerDeck{ Playing_Cardm_Card[20];//最多有20張牌 intnNum;//實(shí)際張數(shù)public: PerDeck(){} voidMakeperDeck(Deck&,int);/*對象初始化,參數(shù)為指定的那副牌及實(shí)際賦值個(gè)數(shù)*/ voidShow();//顯示 voidSortFace();//按面值排序 voidSortSuit();//按花色排序 intDelete(intn);//刪除序號為n的那一張};voidPerDeck::MakeperDeck(Deck&deck_3,intn){ nNum=n;//初始化目前對象的實(shí)際張數(shù) staticinti=0;//標(biāo)識為每個(gè)人發(fā)牌的其始位置 for(intk=0;k<nNum;k++)m_Card[k]=deck_3.m_cardarray[i+k];//用創(chuàng)立好的那副牌為目前對象發(fā)牌 i+=nNum;//為一種人發(fā)牌后起始位置向后跳nNum個(gè)}voidPerDeck::Show()//顯示玩家的牌面{ intj=0; if(nNum==0)cout<<"已無牌!"<<endl;//假如玩家無牌輸出提醒信息 else { for(inti=0;i<nNum;i++) { if(j%11==0)cout<<endl;//每行輸出11張牌 m_Card[i].showcard(); j++; } }}intPerDeck::Delete(intn){ if(n>=nNum)return0;//判斷與否刪牌 else { for(inti=n;i<nNum;i++)m_Card[i]=m_Card[i+1];//刪除指定的牌 nNum--;//刪除一張牌后將實(shí)際張數(shù)減1return1; }}voidPerDeck::SortFace()//按面值排序{ Playing_Cardrecord;//產(chǎn)生一種臨時(shí)對象 for(intj=0;j<nNum-1;j++) for(inti=j+1;i<nNum;i++) if(m_Card[j].m_Value>m_Card[i].m_Value) {record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;} }voidPerDeck::SortSuit()//按花色排序{ Playing_Cardrecord;//產(chǎn)生一種臨時(shí)對象 for(intj=0;j<nNum-1;j++) for(inti=j+1;i<nNum;i++) if(m_Card[j].m_Suit>m_Card[i].m_Suit) {record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;}}classPlayDeck{ PerDeckm_deck[4];//一共是四個(gè)人玩牌public: PlayDeck(){} voidPlayCard(Deck&);//用指定的那副牌對四個(gè)人分別賦值 voidShow();//顯示 intDeleteOne(introw,intcolumn);/*刪除一張,參數(shù)為第row個(gè)人的第column張牌*/ intDeleteAll(int,int,int,int);/*刪除一輪,參數(shù)分別代表四個(gè)人刪除哪一張*/ voidSortDeckFace();//對整副牌面值排序voidSortDeckSuit();//對整副牌花色排序};voidPlayDeck::PlayCard(Deck&deck_2)//給四個(gè)人發(fā)牌{ for(inti=0;i<2;i++)m_deck[i].MakeperDeck(deck_2,14);//前兩個(gè)人發(fā)14張牌 for(intj=2;j<4;j++)m_deck[j].MakeperDeck(deck_2,13);//后兩個(gè)人發(fā)13張牌}voidPlayDeck::Show()//顯示四個(gè)玩家的牌{ for(inti=0;i<4;i++) { cout<<endl; cout<<"玩家"<<i+1<<"的牌:"; m_deck[i].Show(); } cout<<endl<<endl;}intPlayDeck::DeleteOne(introw,intcolumn)/*刪除一張,參數(shù)為第row個(gè)人的第column張牌*/{returnm_deck[row-1].Delete(column-1);}intPlayDeck::DeleteAll(inta,intb,intc,intd)/*刪除一輪,參數(shù)分別代表四個(gè)人各刪除哪一張*/{returnm_deck[0].Delete(a-1)+m_deck[1].Delete(b-1)+m_deck[2].Delete(c-1)+m_deck[3].Delete(d-1);}voidPlayDeck::SortDeckFace()//將四個(gè)人的牌按面值排序{ m_deck[0].SortFace(); m_deck[1].SortFace(); m_deck[2].SortFace(); m_deck[3].SortFace();}voidPlayDeck::SortDeckSuit()//將四個(gè)人的牌按花色排序{ m_deck[0].SortSuit(); m_deck[1].SortSuit(); m_deck[2].SortSuit(); m_deck[3].SortSuit();}voidProgram_Init(); //程序初始化,輸出初始化信息intmain();voidCenter_Text(char[]); /*將參數(shù)(字符串)在屏幕上顯示在一行的中間位置*/voidGet_Key(); //接受顧客鍵入的字符voidDeckMakeDriver(); /*程序的重要算法,內(nèi)部調(diào)用多種函數(shù),包括生成撲克牌,洗牌,刪除,排序等重要操作*/intgetRandInt(intmin,intmax); //獲得在兩參數(shù)間的整型隨機(jī)值voidprog_close(); //暫停程序運(yùn)行,供顧客查看中間運(yùn)行成果 intmain(){srand((unsigned)time(NULL)); //初始化隨機(jī)數(shù)種子 Program_Init(); //顯示程序初始化提醒信息 DeckMakeDriver(); //調(diào)用程序的重要算法,包括程序的重要操作過程 prog_close(); //暫停程序運(yùn)行,供顧客查看運(yùn)行成果 return1; }Playing_Card::Playing_Card() //撲克牌對象的構(gòu)造函數(shù){ inti; for(i=0;i<3;) //初始化撲克牌的面值,清零 { m_Face[i]=''; i++; } m_Suit=''; //初始化撲克牌的花色,清零 m_Value=0;}voidProgram_Init()//程序一開始運(yùn)行的提醒信息{ Center_Text("撲克牌游戲\n");Center_Text("C++試驗(yàn)撲克牌游戲設(shè)計(jì):"); cout<<endl<<endl; Get_Key();}voidGet_Key()//從鍵盤接受顧客鍵入的字符{ cout<<endl; Center_Text("單擊任意鍵繼續(xù)..."); getch();cout<<endl;}voidPlaying_Card::showcard()//在屏幕上顯示一張撲克牌的面值及花色{ cout<<""; cout<<m_Face;//顯示面值 cout.width(1); cout<<m_Suit;//顯示花色 cout<<"";}voidCenter_Text(charShellText[80])/*將函數(shù)參數(shù)(字符串)在屏幕上居中顯示*/{ intlength; intcenter; length=strlen(ShellText);//獲得欲顯示字符串的大小 center=(80-length)/2;/*整個(gè)屏幕的列數(shù)為80,獲得字符串在該行的其始位置*/ for(;center!=0;center--)//在字符串前輸出空格 { cputs(""); } cputs(ShellText);}voidPlaying_Card::Card_Make(intnum)/*根據(jù)參數(shù)num生成一張撲克牌,num不一樣,生成的面值或花色不一樣*/{ inti=0; charj; intface_num=num%13;//撲克牌的面值,從0到12 if(num==52)strcpy(m_Face,"S");//大王花色賦為S elseif(num==53)strcpy(m_Face,"B");//小王花色賦為B else { switch(face_num) //當(dāng)面值不小于10時(shí),用J,Q,K替代,面值為0,用A替代 { case0:strcpy(m_Face,"A");break; case9:strcpy(m_Face,"10");break; case10:strcpy(m_Face,"J");break; case11:strcpy(m_Face,"Q");break; case12:strcpy(m_Face,"K");break; default: j=char(face_num+49); //其他的面值,用對應(yīng)的ASCII碼表達(dá) if(i<3) { m_Face[i]='';i++; m_Face[i]=j;i++; m_Face[i]=NULL; break; } } }//撲克牌的花色,分別用紅桃,黑桃,梅花,方塊的ASCII碼替代 if(num<=12)m_Suit=6; //紅桃 if(num>12&&num<=25)m_Suit=3; //黑桃 if(num>25&&num<=38)m_Suit=5;//梅花 if(num>38&&num<=51)m_Suit=4;//方塊if(num==52)m_Suit=1;//小王 if(num==53)m_Suit=2;//大王 if(num==52)m_Value=14;//小王面值賦為14 elseif(num==53)m_Value=15;//大王面值賦為15 elsem_Value=face_num+1;/*A的面值實(shí)際上用1表達(dá),其他面值依次加1*/}voidDeckMakeDriver()/*重要程序操作部分,調(diào)用多種函數(shù),完畢生成一副牌,洗牌,顯示,刪除等操作*/{ Deckdeck_1;/*生成一副撲克牌對象,內(nèi)有54張牌,此時(shí)所有的撲克牌均未賦值*/ PlayDeckman;//產(chǎn)生一局牌 deck_1.MakeDeck(); //對54張撲克牌賦值 deck_1.ShowDeck();//逐一顯示這54張牌 Get_Key();//暫停運(yùn)行,供顧客查看顯示成果 system("cls");//清屏 deck_1.DeckShuff(250); //對生成的這副牌洗牌250次 deck_1.ShowDeck();//逐一顯示這洗好的54張牌 Get_Key();//暫停運(yùn)行,供顧客查看顯示成果 system("cls");//清屏 man.PlayCard(deck_1);//發(fā)牌 intMemory=0; for(;;) { man.Show();//顯示四個(gè)人的牌 Center_Text("******菜單******\n"); Center_Text("*1:刪除一張牌*\n"); Center_Text("*2:刪除一輪牌*\n"); Center_Text("*3:花色排序*\n"); Center_Text("*4:面值排序*\n"); Center_Text("*5:退出程序*\n"); Center_Text("****************\n");cout<<"請選擇菜單里對應(yīng)功能的一種整數(shù):\n"; intn; charstr[30];aa: cin>>n; cin.getline(str,30); if(strlen(str)>=1) { cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotoaa; }if(!cin) { charstr[30]; cin.clear(); cin.getline(str,30); cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotoaa; } switch(n)//判斷執(zhí)行的操作 { case1://執(zhí)行刪除一張牌的操作 inta,b; charstr[30];bb: cout<<"請輸入刪除第幾種人的第幾張牌"<<endl; cin>>a>>b; cin.getline(str,30); if(strlen(str)>=2) { cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotobb; } while(!cin) { charstr[30]; cin.clear(); cin.getline(str,30); cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotobb; } Memory+=man.DeleteOne(a,b); break; case2://執(zhí)行刪除一輪牌的操作 intc,d,e,f; charstr1[30];cc:cout<<"請依次輸入刪除四個(gè)人的第幾張牌"<<endl; cin>>c>>d>>e>>f; cin.getline(str1,30); if(strlen(str1)>=2) { cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotocc; } while(!cin) { charstr[30]; cin.clear(); cin.getline(str,30); cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotocc; } Memory+=man.DeleteAll(c,d,e,f); break; case3: man.SortDeckSuit();//執(zhí)行按花色排序 break; case 4:man.SortDeckFace();//執(zhí)行按面值排序 break; case5: exit(0);//執(zhí)行退出程序 default: cout<<"輸入錯(cuò)誤,請重新輸入:"<<endl; gotoaa; } system("cls");//清屏 if(Memory==54)break;//判斷循環(huán)結(jié)束條件 } cout<<endl<<endl<<endl;} voidDeck::MakeDeck() //對生成的54張牌逐一賦值{ m_lastdelt=53; //賦初值,該值作為生成每張撲克牌的參數(shù) while(m_lastdelt>-1) //判斷與否產(chǎn)生完54張牌 { m_cardarray[m_lastdelt].Card_Make(m_lastdelt);/*調(diào)用每張撲克牌的生成函數(shù),依次對每張撲克牌賦值,直到生成完一副撲克牌*/ m_lastdelt--; //生成完一張撲克牌后變化生成的參數(shù) }}voidDeck::ShowDeck()//顯示一副撲克牌{ intindex=m_lastdelt+1;/*以該位置為第一張牌,從頭顯示這副撲克牌*/ intnewline=0; Center_Text("完整的一副牌"); cout<<endl; while(index<=53) { if(newline%11==0)cout<<endl;//每顯示11張輸出一種回車 m_cardarray[index].showcard(); //按數(shù)組的次序依次顯示 newline++; index++; }}intgetRandInt(intmin,intmax)//返回兩個(gè)參數(shù)之間的一種整型隨機(jī)值{ intnumToReturn; numToReturn=rand();//獲得隨機(jī)值 numToReturn=numToReturn%(max-min+1)+min;/*將隨機(jī)值的范圍調(diào)整到兩個(gè)參數(shù)之間*/ returnnumToReturn;}voidDeck::DeckShuff(inttimes)//洗牌,參數(shù)為洗牌次數(shù){ intx,split;//split是分開成兩部分的位置,如上部分、下部分 Center_Text("洗牌……"); cout<<endl; for(x=0;x<=times;x++) //開始循環(huán),每循環(huán)一次將牌所有重排一遍 { split=getRandInt(20,35); //隨機(jī)選用split的值 Decktopdeck; //生成兩副撲克牌對象 Deckbottomdeck; inti; intbottomdeckindex=1; inttopdeckindex=1; for(i=0;i<=split-1;) /*將初始的那副撲克牌的上邊部分的張數(shù)賦值到新生成的撲克牌對象中*/ { topdeck.m_cardarray[topdeckindex]=this->m_cardarray[i]; topdeckindex++; i++; } for(i=(split);i<54;)/*同樣將初始那副撲克牌的下邊部分的張數(shù)賦值到新生成的撲克牌對象中*/ { bottomdeck.m_cardarray[bottomdeckindex]=this->m_cardarray[i]; bottomdeckindex++; i++; } intdeckoutindex=0; intnumcardstomovetop; intnumcardstomovebottom; intj; inth=0; bottomdeckindex=54-split; //下部分那副撲克牌的張數(shù) topdeckindex=split; //上部分那副撲克牌的張數(shù) while(deckoutindex<=53) { numcardstomovetop=getRandInt(2,7);/*從上部分抽取的張數(shù),是2-7之間的隨機(jī)數(shù)*/ numcardstomovebottom=ge

溫馨提示

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

評論

0/150

提交評論