c++课程设计.docx
- 文档编号:29792060
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:44
- 大小:445.83KB
c++课程设计.docx
《c++课程设计.docx》由会员分享,可在线阅读,更多相关《c++课程设计.docx(44页珍藏版)》请在冰豆网上搜索。
c++课程设计
1C++面向对象程序设计基础
【实验简介】学会用算法语言C++描述抽象数据类型,使用模板建立数据结构。
理解数据结构的组成分为两部分,第一部分是数据集(数据元素),第二部分是在此数据集上的操作。
从面向对象的观点看,这两部分代表了对象的属性和方法。
掌握用C++描述数据结构的基本方法,即通过建立类来描述抽象数据类型。
类的数据成员提供对象属性,成员函数提供操作方法,方法是公共接口,用户通过调用方法实现对属性的访问。
【实验内容】
1.定义三维空间的坐标点TPoint
2.描述三维空间的球TBall,实现其主要操作(如计算体积和表面积,输出空间坐标等)。
【主要代码】
#include
usingnamespacestd;
#definePI3.1415926//定义PI的值
template
classTpoint//空间直角坐标系中的点
{
private:
Tx,y,z;//虚拟类型的坐标值X,Y,Z
public:
Tpoint()
{x=0;y=0;z=0;}//缺省构造函数
Tpoint(Ta,Tb,Tc)
{x=a;y=b;z=c;}//带参数的构造函数
Tpoint(Tpoint&a);
Tgetx(){returnx;}//返回坐标点的x值
Tgety(){returny;}//返回坐标点的y值
Tgetz(){returnz;}//返回坐标点的z值
TTpointmove(Tmx,Tmy,Tmz)
{x+=mx;
y+=my;
z+=mz;//移动位置(修改坐标值)
}
voidinput()
{cout<<"请分别输入点的坐标x,y,z的值:
"< cin>>x>>y>>z;//输入球面上一点的坐标值 } voidoutput() { cout<<"("< } Tpoint }; template Tpoint : Tpoint { x=p1.getx(); y=p1.getx(); z=p1.getz();//取坐标值 } template Tpoint : operator=(Tpoint { x=p2.getx(); y=p2.getx(); z=p2.getz(); return*this; } template classTball { private: Tpoint doubleradius; public: Tball {radius=0;} Tball {m=zx;radius=zy;} Tvolume() {return(4.0/3)*PI*radius*radius*radius; } Tarea() {return4*PI*radius*radius;} voidsetradius() { cout<<"请输入球的半径: "< cin>>radius; } voidsetTpoint() { cout<<"请输入球的圆心坐标"< m.input(); } voidoutput() { cout<<"球的圆心坐标为"; m.output(); cout<<"球的半径为"< } voidTballmove(Tmx,Tmy,Tmz) {m.Tpointmove(mx,my,mz);} }; voidmain() { Tball x1.setradius(); x1.setTpoint(); cout<<"球的表面积为"< cout<<"球的体积为"< x1.output(); system("pause"); } 【实验过程】 【实验体会】 先熟悉老师给的定义点坐标的平面类,然后利用模板类定义球面点坐标类,定义PI的值,根据类实现函数的重载等操作。 在定义了球类后,设置一个点作为球的球心,并初始化球心坐标。 然后,根据要求,分别设计球体面积和体积的算法公式。 虽然这是一个比较简单的程序设计,但刚开始时,我基本上是无从下手,再看了模板类后,我照着编了一个,然后经过不断的调试,我终于完成了第一个程序,自豪感油然而生。 3通讯簿管理(顺序表的应用) 【问题描述】通讯簿是一个线性表,可以存储一定数量的联系人记录,提供查找、插入、删除和修改等操作。 通讯簿的特点是以查找为主要操作,要求快速查找到指定对象的位置,故宜采用具有随机访问功能的顺序表。 【数据结构】使用顺序表SeqList建立通讯簿。 作为表项的联系人记录,至少应包括以下属性: {序号,姓名,与本人关系,电话号码} 其中序号具有唯一性。 序号和姓名可作为查找的主要关键字。 与本人关系可枚举为“亲人”、“朋友”和“同事”,主要作用是为联系人分组,并作为次要关键字。 将上述联系人记录定义为一个结构(struct),在主程序中建立模板类顺序表SeqList的对象时用该结构实例化表结点的类型。 【主要功能】程序应为用户提供操作选择界面,必要的操作包括: 查找某人电话号码,添加新记录,修改记录,删除记录,打印亲人清单、朋友清单或同事清单以及退出等。 另外,为初始化方便,原始数据可存储在磁盘文件中。 【主要代码】 #include usingnamespacestd; #include #include staticintn=1; enumRelation{Friends,Familiers,Colleague}; template structPerson {charNum[10];//编号 charPhoNum[12];//电话号码 charName[20];//姓名 intm;//关系 Person(int&ite){m=ite;} Person(int&p1,charName[],charP[],charitem[]) {for(inti=0;i<20;i++){Name[i]=Name[i];} for(intj=0;j<11;j++){PhoNum[j]=P[j];} for(intk=0;k<10;k++){Num[k]=item[k];} m=p1; }}; template classSeqList {protected: Person public: SeqList boolInput(); voidOutput(); voidInsert(); voidSearch(); voidShow_All(); voidDelete(); voidCorrect(); voidShow_Select(); voidShow_Friends(); voidShow_Familiers(); voidShow_Colleague(); }; template boolSeqList : Input() {staticintl; cout<<"请输入您要添加的人的编号: ";cin>>data[l].Num; cout<<"请输入您要添加的人的姓名: ";cin>>data[l].Name; cout<<"请输入您要添加的人的电话: ";cin>>data[l].PhoNum; cout<<"请输入您要添加人与您的关系 (1)亲人 (2)同事(3)朋友";cin>>data[l].m;l++;n++;returntrue; } template voidSeqList : Insert() {this->Input();cout<<"信息已保存好! "< template voidSeqList : Search() {charpr[20]; cout<<"请输入您要查找的姓名或序号: ";cin>>pr; boolflag=1; for(intli=0;li {if(IfEqual(pr,data[li].Name)||IfEqual(pr,data[li].Num)) { cout<<"姓名: "< "< "; for(intk=0;data[li].PhoNum[k]! ='\0';k++) {cout< cout<<'\t';Switch(data[li].m);flag=0;//关系 }} if(flag)cout<<"没有您需要的信息! 请查证后再试! "< } template voidSeqList : Show_All() {cout<<"所有人的信息如下: "< for(intlm=0;lm { cout<<"序号: "< "< "; for(intk=0;data[lm].PhoNum[k]! ='\0';k++) {cout< cout<<'\t';Switch(data[lm].m);} } template voidSeqList : Show_Select() {cout<<"请选择要显示联系人与您的关系 (1)亲人, (2)同事,(3)朋友.我的: "; intm;cin>>m; switch(m) { case1: {Show_Familiers();break;} case2: {Show_Colleague();break;} case3: {Show_Friends();break;} case4: {Search();break;} default: {cout<<"关系设置错误! 请重新设置! ";break;} }} template voidSeqList : Show_Friends() {cout<<"所有朋友的信息如下: "< for(intlm=0;lm {if(data[lm].m==3) { cout<<"序号: "< "< "; for(intk=0;data[lm].PhoNum[k]! ='\0';k++) {cout< cout<<'\t';Switch(data[lm].m);} }} template voidSeqList : Show_Familiers() {cout<<"所有亲人的信息如下: "< for(intlmm=0;lmm {if(data[lmm].m==1) { cout<<"序号: "< "< "; for(intk=0;data[lmm].PhoNum[k]! ='\0';k++) {cout< cout<<'\t';Switch(data[lmm].m);} }} template voidSeqList : Show_Colleague() {cout<<"所有同事的信息如下: "< for(intlmp=0;lmp {if(data[lmp].m==2) { cout<<"序号: "< "< "; for(intk=0;data[lmp].PhoNum[k]! ='\0';k++) {cout< cout<<'\t';Switch(data[lmp].m);} }} template voidSeqList : Correct() {charptk[20]; cout<<"请输入您要修改联系人的序号或姓名: ";cin>>ptk;boolflag=1; for(intlp=0;lp {if(IfEqual(ptk,data[lp].Name)||IfEqual(ptk,data[lp].Num)) { cout<<"修改序号";cin>>data[lp].Num; cout<<"修改姓名";cin>>data[lp].Name; cout<<"修改电话号码";cin>>data[lp].PhoNum; cout<<"修改与您的关系: (1)亲人, (2)同事,(3)朋友: "; cin>>data[lp].m;flag=0; }} if(flag)cout<<"您要修改的联系人不存在! "< } template voidSeqList : Delete() {charptr[20]; cout<<"请输入您要删除的联系人的序号或姓名: ";cin>>ptr;boolflag=1; for(intlr=0;lr {if(IfEqual(ptr,data[lr].Name)||IfEqual(ptr,data[lr].Num)) {strcpy(data[lr].Num,data[n-2].Num); strcpy(data[lr].Name,data[n-2].Name); strcpy(data[lr].PhoNum,data[n-2].PhoNum); data[lr].m=data[n-2].m;n--; cout<<"信息已删除"< } } if(flag)cout<<"删除失败! "< voidSwitch(inti) {switch(i) { case1: {cout<<"亲人"<<'\t'< case2: {cout<<"同事"<<'\t'< case3: {cout<<"朋友"<<'\t'< default: {cout<<"关系设置错误! ";break;} }} intIfEqual(charp1[],charp2[]) {intflag=strcmp(p1,p2);returnflag;} voidMenu() { cout<<"\t\t#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#"< <<"\t\t"< <<"\t\t*学生通讯录*"< <<"\t\t"< <<"\t\t1.添加新联系人.4.查询联系人."< <<"\t\t"< <<"\t\t2.显示所有联系人.5.修改信息."< <<"\t\t"< <<"\t\t3.删除联系人.6.关闭通讯簿."< <<"\t\t"< <<"\t\t*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*"< } voidmain() {cout<<"欢迎使用通讯簿"< boolflag1=0;Menu();intx=0;SeqList while (1) { cout<<"\t\t请选择菜单: ";intn;cin>>n; switch(n) { case1: hyb.Insert();break;//添加联系人 case2: hyb.Show_All();break;//显示所有联系人 case3: hyb.Delete();break;//删除联系人 case4: hyb.Show_Select();break;//选择查询联系人 case5: hyb.Correct();break;//修改联系人信息 case6: cout<<"\t\t安全退出"< default: break; } if(flag1)break; } system("pause"); } 【实验过程】 【实验体会】 我认为这是一个超级难的程序,他考验的不是我们的知识,而是我们的耐心。 要实现这个实验,要定义多个头文件,然后利用模板类,定义许多模板。 定义了模板之后,在进行实例化。 我在做这个程序的时候光是代码的输入就用了两天时间,然后一边XX,一边编程,经过各种努力终于实现,虽然有很多都是XX来的,但也经过了自己的思考。 2链表的建立、合并与拆分 【实验简介】链表是用链接存储的方式来表达线性表,它用指针表示结点间的逻辑关系,链表适用于插入或删除频繁,存储空间需求不定的情形。 【实验内容】定义一个链表存储的线性表,除已给出的表元素插入、删除、查找等基本操作外,再提供表的合并、拆分和逆置等操作。 在应用程序中建立两个整型的单链表对象A和B,应用线性表的基本操作对表的实例对象进行操作测试。 1.设线性链表A=(a1,a2,…,am),,B=(b1,b2,…bm),按下列规则合并A,B为线性表C的算法,即使得 C=(a1,b1,…,am,bm,b(m+1),…,bn)当m<=n 或C=(a1,b1,…,an,bn,a(n+1),…,am)当m>n C表利用A表和B表中的结点空间构成。 2.将C表原地逆置。 3.将C表的中偶数和奇数分别链接为两个循环链表D和E。 说明: 每一次合并、拆分和逆置等操作的结果均要输出。 【主要代码】 #include #include template structLinkNode//链表结点类的定义 {Tdata;//数据域 LinkNode LinkNode(LinkNode {link=ptr;}//构造函数 LinkNode(constT&item,LinkNode {data=item;link=ptr;}//构造函数 }; template classList//单链表类定义 { protected: LinkNode public: List(){first=newLinkNode List(constT&x) { first=newLinkNode } List(List ~List(){/*makeEmpty();*/}//析构函数 voidoppo();//逆转函数 voidmakeEmpty();//将链表置为空表 intLength()const;//计算链表的长度 LinkNode LinkNode LinkNode boolgetData(inti,T&x);//取出第i元素值 voidsetData(inti,T&x);//更新第i元素值 boolInsert(inti,T&x);//在第i元素后插入x boolRemove(inti,T&x);//删除第i个元素,x返回该元素值 boolIsEmpty()const//判表空否 { returnfirst->link==NULL? true: false; } voidSort();//排序 voidinputRear(Tendtage); voidoutput(); voidoutput1(); List voidturn() { inti=this->Length(); LinkNode j->link=first; } }; template List : operator=(List { Tvalue; LinkNode LinkNode while(srcptr->link! =NULL) { value=srcptr->link->data; destptr->li
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计