c++课程设计.doc_第1页
c++课程设计.doc_第2页
c++课程设计.doc_第3页
c++课程设计.doc_第4页
c++课程设计.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 C+面向对象程序设计基础【实验简介】学会用算法语言C+描述抽象数据类型,使用模板建立数据结构。理解数据结构的组成分为两部分,第一部分是数据集(数据元素),第二部分是在此数据集上的操作。从面向对象的观点看,这两部分代表了对象的属性和方法。掌握用C+描述数据结构的基本方法,即通过建立类来描述抽象数据类型。类的数据成员提供对象属性,成员函数提供操作方法,方法是公共接口,用户通过调用方法实现对属性的访问。【实验内容】1. 定义三维空间的坐标点TPoint2. 描述三维空间的球TBall,实现其主要操作(如计算体积和表面积,输出空间坐标等)。【主要代码】#includeusing namespace std;#define PI 3.1415926 /定义PI的值template /定义一个点的模板类class Tpoint /空间直角坐标系中的点private:T x,y,z; /虚拟类型的坐标值X,Y,Zpublic:Tpoint()x=0;y=0;z=0; /缺省构造函数Tpoint(T a,T b,T c)x=a;y=b;z=c; /带参数的构造函数Tpoint(Tpoint &a);T getx()return x; /返回坐标点的x值T gety()return y; /返回坐标点的y值T getz()return z; /返回坐标点的z值T Tpointmove(T mx,T my,T mz)x+=mx; y+=my; z+=mz; /移动位置(修改坐标值)void input()cout请分别输入点的坐标x,y,z的值:xyz; /输入球面上一点的坐标值void output()cout(x,y,z)endl;Tpoint operator=(Tpoint &p1);template Tpoint:Tpoint(Tpoint &p1)x=p1.getx();y=p1.getx();z=p1.getz(); /取坐标值template Tpoint Tpoint:operator =(Tpoint &p2)x=p2.getx();y=p2.getx();z=p2.getz();return *this;template class Tballprivate:Tpoint m;double radius;public:Tball()radius=0;Tball(Tpoint & zx,T zy)m=zx;radius=zy;T volume()return (4.0/3)*PI*radius*radius*radius;T area()return 4*PI*radius*radius;void setradius()cout请输入球的半径:radius;void setTpoint()cout请输入球的圆心坐标endl;m.input();void output()cout球的圆心坐标为;m.output();cout球的半径为radiusendl;void Tballmove(T mx,T my,T mz)m.Tpointmove(mx,my,mz);void main()Tball x1;x1.setradius();x1.setTpoint();cout球的表面积为x1.area()endl;cout球的体积为x1.volume()endl;x1.output();system(pause);【实验过程】【实验体会】 先熟悉老师给的定义点坐标的平面类,然后利用模板类定义球面点坐标类,定义PI的值,根据类实现函数的重载等操作。在定义了球类后,设置一个点作为球的球心,并初始化球心坐标。然后,根据要求,分别设计球体面积和体积的算法公式。虽然这是一个比较简单的程序设计,但刚开始时,我基本上是无从下手,再看了模板类后,我照着编了一个,然后经过不断的调试,我终于完成了第一个程序,自豪感油然而生。3 通讯簿管理(顺序表的应用)【问题描述】通讯簿是一个线性表,可以存储一定数量的联系人记录,提供查找、插入、删除和修改等操作。通讯簿的特点是以查找为主要操作,要求快速查找到指定对象的位置,故宜采用具有随机访问功能的顺序表。【数据结构】使用顺序表SeqList建立通讯簿。作为表项的联系人记录,至少应包括以下属性: 序号,姓名,与本人关系,电话号码其中序号具有唯一性。序号和姓名可作为查找的主要关键字。与本人关系可枚举为“亲人”、“朋友”和“同事”,主要作用是为联系人分组,并作为次要关键字。将上述联系人记录定义为一个结构(struct),在主程序中建立模板类顺序表SeqList的对象时用该结构实例化表结点的类型。【主要功能】程序应为用户提供操作选择界面,必要的操作包括:查找某人电话号码,添加新记录,修改记录,删除记录,打印亲人清单、朋友清单或同事清单以及退出等。另外,为初始化方便,原始数据可存储在磁盘文件中。【主要代码】#includeusing namespace std;#include#includestatic int n=1;enum RelationFriends,Familiers,Colleague;templatestruct Person char Num10;/编号 char PhoNum12;/电话号码 char Name20;/姓名 int m;/关系 Person( int &ite) m=ite;Person(int &p1,char Name,char P, char item) for(int i=0;i20;i+) Namei=Namei; for(int j=0;j11;j+)PhoNumj=Pj; for(int k=0;k10;k+) Numk=itemk; m=p1; ;templateclass SeqListprotected: Person *data;public: SeqList(T& x)data=new Person(x); bool Input(); void Output(); void Insert(); void Search(); void Show_All(); void Delete(); void Correct(); void Show_Select(); void Show_Friends(); void Show_Familiers(); void Show_Colleague();template bool SeqList:Input() static int l;coutdatal.Num;coutdatal.Name;coutdatal.PhoNum;coutdatal.m; l+; n+; return true;template void SeqList:Insert() this-Input(); cout信息已保存好!endl; template void SeqList:Search() char pr20; coutpr; bool flag=1; for(int li=0;lin-1;li+) if(IfEqual(pr,datali.Name)|IfEqual(pr,datali.Num) cout姓名:datali.Namett序号:datali.Numt电话:; for(int k=0;datali.PhoNumk!=0;k+) coutdatali.PhoNumk; coutt;Switch(datali.m);flag=0;/关系 if(flag) cout没有您需要的信息!请查证后再试!endl;template void SeqList:Show_All() cout所有人的信息如下:endl; for(int lm=0;lmn-1;lm+) cout序号:datalm.Numtt姓名:datalm.Namet电话:; for(int k=0;datalm.PhoNumk!=0;k+) coutdatalm.PhoNumk; coutt; Switch(datalm.m); template void SeqList:Show_Select()coutm;switch(m)case 1:Show_Familiers();break; case 2:Show_Colleague();break; case 3:Show_Friends();break;case 4:Search();break; default: cout关系设置错误!请重新设置!;break;template void SeqList:Show_Friends() cout所有朋友的信息如下: endl; for(int lm=0;lmn-1;lm+) if(datalm.m=3) cout序号:datalm.Numtt姓名:datalm.Namet电话:; for(int k=0;datalm.PhoNumk!=0;k+) coutdatalm.PhoNumk; coutt;Switch(datalm.m); template void SeqList:Show_Familiers() cout所有亲人的信息如下:endl; for(int lmm=0;lmmn-1;lmm+) if(datalmm.m=1) cout序号:datalmm.Numtt姓名:datalmm.Namet电话:; for(int k=0;datalmm.PhoNumk!=0;k+) coutdatalmm.PhoNumk; coutt; Switch(datalmm.m); template void SeqList:Show_Colleague() cout所有同事的信息如下:endl;for(int lmp=0;lmpn-1;lmp+) if(datalmp.m=2) cout序号:datalmp.Numtt姓名:datalmp.Namet电话: ; for(int k=0;datalmp.PhoNumk!=0;k+) coutdatalmp.PhoNumk; coutt; Switch(datalmp.m); template void SeqList:Correct() char ptk20; coutptk; bool flag=1; for(int lp=0;lpn-1;lp+)if(IfEqual(ptk,datalp.Name)|IfEqual(ptk,datalp.Num) coutdatalp.Num; coutdatalp.Name; coutdatalp.PhoNum; coutdatalp.m; flag=0; if(flag) cout您要修改的联系人不存在!endl;template void SeqList:Delete() char ptr20; coutptr;bool flag=1; for(int lr=0;lrn-1;lr+)if(IfEqual(ptr,datalr.Name)|IfEqual(ptr,datalr.Num) strcpy(datalr.Num,datan-2.Num);strcpy(datalr.Name,datan-2.Name); strcpy(datalr.PhoNum,datan-2.PhoNum); datalr.m=datan-2.m; n-; cout信息已删除endl; flag=0; if(flag) cout删除失败!endl; void Switch(int i)switch(i)case 1: cout亲人tendl;break;case 2: cout同事tendl;break; case 3: cout朋友tendl;break;default: cout关系设置错误!;break;int IfEqual(char p1,char p2)int flag=strcmp(p1,p2);return flag; void Menu() couttt#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# endltt endltt *学生通讯录* endl tt endltt 1. 添加新联系人. 4. 查询联系人. endl tt endltt 2. 显示所有联系人. 5. 修改信息. endltt endltt 3. 删除联系人. 6. 关闭通讯簿. endl tt endltt*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* endl;void main()cout 欢迎使用通讯簿endl; bool flag1=0; Menu(); int x=0; SeqList hyb(x); while (1) coutn; switch (n) case 1: hyb.Insert();break;/添加联系人 case 2: hyb.Show_All();break;/显示所有联系人 case 3: hyb.Delete();break;/删除联系人 case 4: hyb.Show_Select();break;/选择查询联系人 case 5: hyb.Correct();break;/修改联系人信息 case 6: cout tt安全退出 endl; flag1=1; break; default: break; if(flag1) break; system(pause);【实验过程】【实验体会】我认为这是一个超级难的程序,他考验的不是我们的知识,而是我们的耐心。要实现这个实验,要定义多个头文件,然后利用模板类,定义许多模板。定义了模板之后,在进行实例化。我在做这个程序的时候光是代码的输入就用了两天时间,然后一边百度,一边编程,经过各种努力终于实现,虽然有很多都是百度来的,但也经过了自己的思考。2链表的建立、合并与拆分【实验简介】链表是用链接存储的方式来表达线性表,它用指针表示结点间的逻辑关系,链表适用于插入或删除频繁,存储空间需求不定的情形。【实验内容】定义一个链表存储的线性表,除已给出的表元素插入、删除、查找等基本操作外,再提供表的合并、拆分和逆置等操作。在应用程序中建立两个整型的单链表对象A和B,应用线性表的基本操作对表的实例对象进行操作测试。1. 设线性链表A=(a1,a2,am),,B=(b1,b2,bm),按下列规则合并A,B为线性表C的算法,即使得 C = (a1,b1,am,bm, b (m+1),bn) 当mnC表利用A表和B表中的结点空间构成。2. 将C表原地逆置。3. 将C表的中偶数和奇数分别链接为两个循环链表D和E。说明:每一次合并、拆分和逆置等操作的结果均要输出。【主要代码】#include#includetemplate struct LinkNode /链表结点类的定义 T data; /数据域 LinkNode *link; /链指针域 LinkNode(LinkNode *ptr = NULL ) link = ptr; /构造函数 LinkNode(const T& item, LinkNode *ptr = NULL) data = item; link = ptr; /构造函数;template class List /单链表类定义 protected: LinkNode *first; /表头指针public: List() first= new LinkNode; /构造函数 List(const T & x) first = new LinkNode(x); List(List&L); List()/* makeEmpty(); */ /析构函数 void oppo(); /逆转函数 void makeEmpty(); /将链表置为空表 int Length() const; /计算链表的长度 LinkNode *getHead() const return first; LinkNode *Search(T x);/搜索含x元素 LinkNode *Locate(int i) const;/定位第i个元素 bool getData(int i, T &x); /取出第i元素值 void setData(int i, T &x); /更新第i元素值 bool Insert (int i, T &x); /在第i元素后插入x bool Remove(int i, T &x); /删除第i个元素,x返回该元素值 bool IsEmpty() const /判表空否 return first-link = NULL ? true : false; void Sort(); /排序 void inputRear(T endtage); void output(); void output1(); List& operator=(List& L); void turn() int i=this-Length(); LinkNode *j=this-Locate(i); j-link=first; ;templateList&List:operator =(List&L)T value;LinkNode *srcptr = L.getHead();LinkNode *destptr = first = new LinkNode;while(srcptr-link!=NULL)value = srcptr-link-data;destptr-link=new LinkNode(value);destptr=destptr-link;srcptr=srcptr-link;destptr-link=NULL;return * this;templateList:List(List&L)T value;LinkNode*srcptr=L.getHead();LinkNode*destptr=first=new LinkNode;while(srcptr-link!=NULL)value=srcptr-link-data;destptr-link=new LinkNode(value);destptr=destptr-link;srcptr=srcptr-link;destptr-link=NULL;template void List:makeEmpty() LinkNode *q; while (first-link != NULL) q = first-link; /保存被删结点 first-link = q-link; /从链上摘下该结点 delete q; /删除 template int List : Length ( ) const LinkNode *p = first-link; int count = 0; while ( p != NULL ) /逐个结点检测 p = p-link; count+; return count;template LinkNode *List:Search(T x) /在表中搜索含数据x的结点, 搜索成功时函数返/该结点地址; 否则返回NULL。 LinkNode *current = first-link; while ( current != NULL ) if(current-data=x) break; else current = current-link; return current;template LinkNode *List:Locate ( int i ) const if (i 0) return NULL;/i不合理 LinkNode *current = first; int k = 0; while ( current != NULL & k link; k+; return current; /返回第 i 号结点地址或NULLtemplate bool List :getData(int i, T& x) /取出链表中第i个元素的值 if ( i = 0 ) return NULL; LinkNode *current = Locate(i); if ( current = NULL ) return false; else x = current-data; return true; template void List :setData(int i, T& x) /给链表中第i个元素的赋值x if ( i = 0 ) return; LinkNode *current = Locate(i); if ( cunent = NULL ) return; else current-data = x; template void List:output() LinkNode *current = first-link; while ( current !=NULL ) coutdatalink; templatevoid List:output1()LinkNode *current = first-link; while ( current != first ) coutdatalink; template bool List:Insert (int i, T& x) /将新元素 x 插入在链表中第 i 个结点之后。 LinkNode *current = Locate(i); if (current = NULL) return false; /无插入位置 LinkNode *newNode = new LinkNode(x); if ( newNode = NULL ) cerr内存分配错误!link = current-link; /链入 current-link = newNode; return true; /插入成功template bool List:Remove (int i, T& x ) /删除链表第i个元素, 通过引用参数x返回元素值 LinkNode *current = Locate(i-1); if ( current = NULL | current-link = NULL) return false; /删除不成功 LinkNode *del = current-link; current-link = del-link; x = del-data;delete del; return true;templatevoid List:inputRear(T endtage)LinkNode *newnode,*last;T val;makeEmpty(); cout请逐个输入单链表结点n并以输入endtage结束val;last=first;while(val!=endtage)newnode=new LinkNode(val);if(newnode=NULL)cerr存储分配错误!link=newnode;last=newnode;cinval;last-link=NULL;templatevoid List:oppo()int i=this-Length();if(i=0)cout空!endl;elseLinkNode*first1=first;LinkNode*current;LinkNode*last;for(int n=i;n1;n-)current=Locate(i);last=Locate(i-1);last-link=NULL;current-link=first1-link;first1-link=current;first1=current;templateList hebing(List&x,List&y)int l1,l2;l1=x.Length();l2=y.Length();if(l1=l2)for(int i=1;i=l2;i+)int b;y.getData(i,b);x.Insert(2*i-1,b);return x;elsefor(int j=1;j=l1;j+)int c;x.getData(j,c);if(j=1)y.Insert(0,c);elsey.Insert(2*j-1,c);return y;templateList jishu(List D)int i=D.Length();int count1=0;List f;for(int j=1;j=i;j+)int q;D.getData(j,q);if(q%2=1)f.Insert(count1,q);count1+;return f;templateList oushu(List E)int i=E.Length();int count2=0;List f;for(int j=1;j=i;j+)int p;E.getData(j,p);if(p%2=0)f.Insert(count2,p);count2+;return f;void main()ListA,B;A.inputRear(0);B.inputRear(0);ListA1(A);ListB1(B); ListC=hebing(A,B);ListF(C);ListD(jishu(C);D.turn(); /D变循环链表ListE(oushu(C);E.turn(); /E变循环链表F.oppo();cout两个单链表经合并后为:endl;C.output();cout合并后的单链表经拆分后的奇数部分为:endl;D.output1(); /输出循环链表Dcout合并后的单链表经拆分后的偶数部分为:endl;E.output1(); /输出循环链表Ecout合并后的单链表经逆转后为:endl;F.output();【实验过程】【实验体会】链表是用链接存储的方式来表达线性表,利用指针来表示链表节点间的逻辑关系,在编程是可以对照课本上的模板类进行类似改变。建立多个模板类,对链表进行重新排序,拆分。每一个模板都有其作用,在编程时要细致认真,不可马虎,而且要有耐心。步步执行程序,步步调试。5 将中缀表达式转换为后缀表达式【问题描述】表达式转换。输入的中缀表达式为字符串,转换得到的后缀表达式存入字符数组中并输出。例如: a*(x+y)/(b-x) 转换后得: a x y + * b x - /【数据结构】l 定义一个暂时存放运算符的转换工作栈opst。l 中缀表达式字符串char *infix;l 后缀表达式字符串char *postfix;【算法提示】转换规则:把运算符移到它的两个操作数后面,删除掉所有的括号。从头到尾扫描中缀表达式,对不同类型的字符按不同情况处理:l 数字或小数点,直接写入字符串postfix,并在每个数值后面写入一个空格;l 左括号,进栈,直到遇见相配的右括号,才出栈;l 右括号,表明已扫描过括号内的中缀表达式,把从栈顶直到对应左括号之间的运算符依次退栈,并把结果推入栈内;l 对于运算符,分两种情况处理:u 该运算符的优先级大于栈顶符号的优先级,则入栈;u 若该运算符的优先级小于栈顶优先级,则先弹出栈顶运算符、写入postfix串;继续将该运算符与栈顶运算符比较,直到能把它推入栈内为止(即优先级大于栈顶运算符)。说明:自行设计运算符优先级的表示。【主要代码】#include#include#include#includeconst int stackIncreament=20;templateclass SeqStackpublic:SeqStack(int sz=50);SeqStack()deleteelements;bool Push(const T&x);bool Pop(T&x);bool getTop(T&x);bool IsEmpty()constreturn(top=-1)?true:false;bool IsFull()constreturn(top=maxSize-1)?true:false;int getSize()constreturn top+1;void MakeEmpty()top=-1;private:T*elements;int top;int maxSize;void overflowProcess();templateSeqStack:SeqStack(int sz):top(-1),maxSize(sz)elements=new TmaxSize;assert(elements!=NULL); templatevoid SeqStack:overflowProcess()T*newArray=new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论