c++综合实验.docx
- 文档编号:11694733
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:13
- 大小:133.04KB
c++综合实验.docx
《c++综合实验.docx》由会员分享,可在线阅读,更多相关《c++综合实验.docx(13页珍藏版)》请在冰豆网上搜索。
c++综合实验
学生实验报告
实验课程名称C++程序设计
开课实验室计算机中心
学院2011级信息与计算科学专业班一班
学生姓名陈世超学号631122020113
开课时间2012至2013学年第1学期
评分细则
评分
报告表述的清晰程度和完整性(30分)
程序设计的正确性(40分)
实验结果的分析和体会(30分)
总成绩
综合设计实验
一、实验内容:
1.无序输入多个用户的记录电话号码(至少包括姓名和电话两个域),要求以单链表结构存储。
然后编写冒泡排序程序,将用户记录可以按照用户名或者电话顺序输出。
2.对于上题的单链表结构存储的用户电话号码记录,实现二分查找算法,可以分别按照姓名和电话来查询到相应的记录。
要求:
1)每个用户记录是由用户类生成的一个对象,用户记录至少包括姓名和电话两个域,该域为类里的private成员。
2)提供成员函数dispName()、disCode()分别用来显示该对象的姓名和电话号码。
提供成员函数setName()、setCode()分别用来修改该对象的姓名和电话号码。
3.实现CardGame类用来表示普通的52张纸牌,有四种花色(红心、方块、梅花和黑桃),每种花色各有13张:
A、K、Q、J、10、9、……、2,用适当的方式实现纸牌的基本功能。
CardGame类派生出桥牌Bridge类,为Bridge类设计deal函数,用来将纸牌分为4手,每手13张;从CardGame类派生出扑克Poker类,为Poker类设计deal函数,用来将纸牌分为n(n从2到7,代表游戏人数)手,每手5张。
完成类的设计,并编写完整的程序测试。
分析:
(本题目考察类的继承和派生关系。
发牌过程中,需要使用随机函数rand(),用于获得一个随机数。
)
实验要求:
按照实验要求设计算法,编写程序。
对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)。
源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
2、程序代码
#include
#include
#include"stdio.h"
usingnamespacestd;
classlist;
classaa
{
friendclasslist;
private:
stringname;//姓名
stringnumber;//电话号码
aa*next;
public:
aa()
{//初始化用户信息
name="";number="";next=NULL;}
voiddispName()
{//显示用户的姓名
cout< voiddispCode() {//显示用户的电话号码 cout< voidsetName(stringna1) {name=na1;} voidsetName() {//修改用户的姓名 cout<<"用户的姓名为: "; cin>>name;} voidsetCode(stringnu1) {number=nu1;} voidsetCode()//修改用户的电话号码 {cout<<"用户的电话号码为"; cin>>number;} voidsetnext() {next=NULL;} voidsetnext(aa*b1) {next=b1;} stringgetname()//返回用户的姓名 {returnname;} stringgetnumber()//返回用户的电话号码 {returnnumber;} aa*getnext()//返回指向下一条用户信息的指针 {returnnext;} }; classlist { private: ints;//所包含的用户信息的条数 aa*head;//头指针 public: list()//初始化链表 {head=newaa; s=0;} list(intn) {//创建一个包含n条记录的链表 inti;s=n;head=newaa; aa*temp;aa*a;temp=head; for(i=1;i<=n-1;i++) {temp->setName();temp->setCode(); a=newaa;temp->setnext(a);temp=a;} temp->setName();temp->setCode();temp->setnext();} ~list()//析构函数 {aa*q; while(head) {q=head->getnext(); deletehead;head=q;}} voidsortname()//按姓名降序排列 {inti,j; aa*p,*n,*temp;temp=newaa; p=head; for(i=1;i<=s-1;i++) {n=p->getnext(); temp->setName(p->getname());temp->setCode(p->getnumber()); for(j=i+1;j<=s;j++) {if((p->getname()).compare(n->getname())<0) {temp->setName(n->getname()); temp->setCode(n->getnumber()); n->setName(p->getname()); n->setCode(p->getnumber()); p->setName(temp->getname()); p->setCode(temp->getnumber());} n=n->getnext();} p=p->getnext(); } deletetemp; } voidsortnumber()/*冒泡排序算法,按电话号码降序排列*/ { inti,j; aa*p,*n,*temp; temp=newaa; p=head; for(i=1;i<=s-1;i++) {n=p->getnext(); temp->setName(p->getname());temp->setCode(p->getnumber()); for(j=i+1;j<=s;j++) {if((p->getnumber()).compare(n->getnumber())<0) {temp->setName(n->getname()); temp->setCode(n->getnumber()); n->setName(p->getname()); n->setCode(p->getnumber()); p->setName(temp->getname()); p->setCode(temp->getnumber()); } n=n->getnext(); } p=p->getnext(); } deletetemp; } voiddisplist()/*显示电话簿的信息*/ { inti; aa*p; cout<<"姓名"<<"电话号码"< p=head; for(i=0;i {cout<<""< p=p->getnext();}} intsearchname()/*按姓名查找*/ { inti; stringna; cout<<"请输入要查找的用户的姓名: "; cin>>na; aa*p; p=head; for(i=0;i {if((p->getname()).compare(na)==0) {cout<<"所查找的用户的电话号码是: "< return1;} p=p->next;} cout<<"未能找到符合要求的用户信息"< return0; } intsearchnumber()/*按电话号码查找*/ {inti;stringnu; cout<<"请输入您想要查找的用户的电话号码: "; cin>>nu;aa*p;p=head; for(i=0;i { if((p->getnumber()).compare(nu)==0) { cout<<"所查找的用户的姓名为: "< return1;} p=p->getnext();} cout<<"找不到符合要求的用户信息"< return0; } }; voidmain() { intnum; cout<<"输入用户的人数为: "; cin>>num; listtest(num);/*创建一个包含num条记录的电话簿*/ cout<<"创建的电话簿为"< test.displist(); cout<<"按姓名升序排列"< test.sortname();test.displist(); cout<<"按电话号码升序排列"< test.sortnumber();test.displist(); cout<<"按姓名查找算法的测试"< test.searchname();test.searchname(); cout<<"按电话号码查找算法的测试"< test.searchnumber();test.searchnumber(); } 实验结果: 实验体会: 通过实验我学会了怎么用二分查找法对链表进行查找,以及用冒泡法给数据排序和单链表结构存储数据。 程序代码: /*实现纸牌的洗牌,发牌功能*/ #include #include #include #include #include classCardGame; classcard//用来表示一张扑克牌的面值及花色 {friendclassCardGame; private: intvalue;//一张牌的数值,从1~13 chars;//一张牌的花色,红桃,黑桃,梅花,方块 charface[3];//一张牌的面值,A,2~10,J,Q,K public: card()//初始化一张牌 {value=0;strcpy(face,"");s='';} voidshowcard()//显示一张牌的面值及花色 {cout<<"";cout< cout<<"";} voidmakecard(intnumber) {//为一张牌赋予特定的面值和花色根据传入参数的不同 inta;a=number%13;value=a+1; switch(a){ case0: strcpy(face,"K");break; case1: strcpy(face,"Q");break; case2: strcpy(face,"J");break; case3: strcpy(face,"10");break; case4: strcpy(face,"9");break; case5: strcpy(face,"8");break; case6: strcpy(face,"7");break; case7: strcpy(face,"6");break; case8: strcpy(face,"5");break; case9: strcpy(face,"4");break; case10: strcpy(face,"3");break; case11: strcpy(face,"2");break; case12: strcpy(face,"A");break;} //纸牌的花色分别用红桃,黑桃,梅花,方块的ASCII码表示 if(number<=12)s=6;//红桃 if(number>12&&number<=25)s=3;//黑桃 if(number>25&&number<=38)s=5;//梅花 if(number>38&&number<=51)s=4;}};//方块 classCardGame//一副纸牌类,用来表示52张牌的面值及花色 {protected: cardcardarray[52];//用来存放52张纸牌 public: CardGame()//构造函数,生成一副完整牌,有52张,每张都有具体的花色和面值 {inti;for(i=0;i<52;i++) {cardarray[i].makecard(i);}} voidshowall()//按顺序显示一副牌 {inti,count=1;cout<<"一幅新牌"< for(i=0;i<52;i++) {cardarray[i].showcard(); if(count%10==0)cout<<"\n";count++;} cout< classBrige: publicCardGame//桥牌类 {intbrigeplayer[4][13];/*存放四位玩家的牌,用整数1~52依次对应CardGame类中cardarray数组的下标0~51, 即一副牌的每一张都对应一个1~52的整数*/ public: Brige(): CardGame()//初始化桥牌类的成员变量,并生成一副新纸牌 {inti,j;for(i=0;i<4;i++)for(j=0;j<13;j++) brigeplayer[i][j]=0;} voiddeal() {//将纸牌分成四手,每手十三张,即将牌发给四位玩家并显示 inti,j,tape[52]; for(i=0;i<52;i++)tape[i]=0;/*tape数组用来保证brigeplayer数组的所有值的大小不同,即确保每个玩家 不会拿到两张一样的牌*/ srand((int)time(0)); for(i=0;i<4;i++) {for(j=0;j<13;j++) {brigeplayer[i][j]=(int)(52*rand()/(RAND_MAX+1.0)); while(tape[brigeplayer[i][j]]! =0) brigeplayer[i][j]=(int)(52*rand()/(RAND_MAX+1.0)); tape[brigeplayer[i][j]]=1;}}} voidshow() {inti,j; for(i=0;i<4;i++) {cout<<"第"< "< for(j=0;j<13;j++) {cardarray[brigeplayer[i][j]].showcard();} cout< classPoker: publicCardGame {intnumber;//玩家数 int**playercards;//指向二维数组的指针,二维数组用于存放每位玩家的牌,0~52依次对应一副新牌的每一张 public: Poker(): CardGame()//构造函数,初始化扑克类的成员变量,并生成一副新牌 {inti,j,n=1; while(n) {cout<<"请输入玩家数n(2<=n<=7): ";cin>>number; if(number>7||number<2)cout<<"输入错误,请重新输入"< else n=0;} playercards=newint*[number]; for(i=0;i playercards[i]=newint[5]; for(i=0;i for(j=0;j<5;j++)playercards[i][j]=0;} ~Poker()//析构函数,删除构造函数申请的空间 {inti; for(i=0;i delete[]playercards[i];} voiddeal()//将扑克分成n手,每手五张,即将牌发给每位玩家,没人五张 {inti,j;inttape2[52]; for(i=0;i<52;i++)tape2[i]=0; for(i=0;i for(j=0;j<5;j++) {playercards[i][j]=(int)(52*rand()/(RAND_MAX+1.0)); while(tape2[playercards[i][j]]! =0) playercards[i][j]=(int)(52*rand()/(RAND_MAX+1.0)); tape2[playercards[i][j]]=1;}} voidshow()//显示每位玩家的牌 {inti,j,n; for(i=0;i {n=i+1;cout<<"第"< for(j=0;j<5;j++) cardarray[playercards[i][j]].showcard(); cout< //测试函数 voidmain(void) {cout<<"----桥牌类程序调用----"< Brigeplayb;//生成一个桥牌类的对象 playb.showall();//显示生成的这副新牌 playb.deal();//调用brige类的deal函数,为每位玩家发牌 playb.show();//显示每位玩家的牌 cout<<"----扑克类程序调用----"< Pokerplayp;//生成一个扑克类的对象 playp.deal();//为玩扑克的每位玩家发牌 playp.show();//显示每位玩家的牌 } 实验结果: 实验体会: 通过实验我学习到了怎么使用构造函数完成牌的分发及玩家所得牌的显示,知道了派生类对基类的继承、继承方式和对基类成员函数的继承。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 综合 实验