c++类和对象实验报告_第1页
c++类和对象实验报告_第2页
c++类和对象实验报告_第3页
c++类和对象实验报告_第4页
c++类和对象实验报告_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、 实验一 类和对象实验课程名:面向对象程序设计(c+)专业班级: 学号: 姓名: 实验时间: 实验地点: 指导教师: 一、实验目的和要求(1) 理解类和对象的概念,掌握声明类和定义对象的方法。(2) 掌握构造函数和析构函数的实现方法。(3) 初步掌握使用类和对象编制c+程序。(4) 掌握对象数组、对象指针和string类的使用方法。(5) 掌握使用对象、对象指针和对象引用作为函数参数的方法。(6) 掌握类对象作为成员的使用方法。(7) 掌握静态数据成员和静态成员函数的使用方法。(8) 理解友元的概念和掌握友元的使用方法。二、实验内容1设计一个静态数组存储结构的顺序表类,要求编程实现如下任务:建

2、立一个线性表,首先依次输人数据元素1,2,3,10,然后删除数据元素6,最后依次显示当前线性表中的数据元素。要求采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过50个。实验代码:#includeusing namespace std;const int maxsize=100; /100只是示例性的数据,可根据实际问题具体定义template /定义模板类seqlistclass seqlistpublic: seqlist( ) length=0; /无参构造函数 seqlist(t a , int n); /有参构造函数 seqlist( ) /析构函数为空 int leng

3、th( ) return length; /求线性表的长度 t get(int i); /按位查找,取线性表的第i个元素 int locate(t x ); /按值查找,求线性表中值为x的元素序号 void insert(int i, t x); /在线性表中第i个位置插入值为x的元素 t delete(int i); /删除线性表的第i个元素 void printlist( ); /遍历线性表,按序号依次输出各元素private: t datamaxsize; /存放数据元素的数组 int length; /线性表的长度;template seqlist:seqlist(t a , int

4、n)int i; if (nmaxsize) throw 参数非法; for (i=0; in; i+) datai=ai; length=n;template t seqlist:get(int i) if (ilength) throw 查找位置非法; else return datai-1;template int seqlist:locate(t x)int i; for (i=0; ilength; i+) if (datai=x) return i+1; /下标为i的元素等于x,返回其序号i+1 return 0; /退出循环,说明查找失败template void seqlist

5、:insert(int i, t x)int j; if (length=maxsize) throw 上溢; if (ilength+1) throw 位置;for (j=length; j=i; j-) dataj=dataj-1; /注意第j个元素存在数组下标为j-1处datai-1=x;length+;template t seqlist:delete(int i)t x;int j; if (length=0) throw 下溢; if (ilength) throw 位置; x=datai-1; for (j=i; jlength; j+) dataj-1=dataj; /注意此处

6、j已经是元素所在的数组下标 length-; return x;templatevoid seqlist:printlist()int i;for(i=0;ilength;i+)coutdatai ;coutendl;int main()int m,n,t;int a10=0,1,2,3,4,5,6,7,8,9;seqlist seq(a,10);seqlist *p;p=&seq;cout线性表的长度为:length()printlist();cout请输入要查找元素的位置:n; cout您所要找的元素为:get(n)endl;cout请输入要查找的元素值:n;cout该值所在的位置为:lo

7、cate(n)endl;cout请分别输入插入位置与要插入的元素nt;p-insert(n,t);p-printlist();cout请输入要删除的元素所在的位置:n;p-delete(n);p-printlist(); return 0;运行结果:2设计一个带头结点的单链表类,要求:(1)生成一个整数线性表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。(2)设计一个测试主函数,实际运行验证所设计单链表类的正确性。实验代码:#includeusing namespace std;template struct node t data; node *n

8、ext; /此处也可以省略;template class linklistpublic:linklist( )first=new node; first-next=null; /建立只有头结点的空链表 linklist(t a , int n); /建立有n个元素的单链表linklist( ); /析构函数int length( ); /求单链表的长度t get(int i); /取单链表中第i个结点的元素值int locate(t x); /求单链表中值为x的元素序号void insert(int i, t x); /在单链表中第i个位置插入元素值为x的结点t delete(int i);

9、/在单链表中删除第i个结点void printlist( ); /遍历单链表,按序号依次输出各元素node *first; /单链表的头指针;templatelinklist:linklist(t a , int n)/头查法建立单链表int i;node *s;first=new node; first-next=null; /初始化一个空链表 for (i=n-1; i=0; i-) s=new node; s-data=ai; /为每个数组元素建立一个结点 s-next=first-next; /插入到头结点之后 first-next=s; templatelinklist:linkli

10、st( )/析构函数node *p,*q;p=first;while(p)q=p;p=p-next;delete q;templateint linklist:length( )/求链表的长度int i=0;node *p;p=first;while(p)p=p-next;i+;return i-1;templatet linklist:get(int i)/求单链表中第i个元素的值int n=0; node *p;p=first;while(p&in)p=p-next;n+; return p-data;templateint linklist:locate(t x)/求单链表中值为x的元素

11、序号int i;node *p;p=first;for(i=0;p;i+)if(p-data=x)return i;p=p-next;templatevoid linklist:printlist( )/输出函数node *p;p=first-next;while(p)coutdatanext;coutendl;templatevoid linklist:insert(int i, t x)/在第i个位置插入元素xint n=0;node *p,*q;p=first;while(p&nnext;+n;q=new node;q-data=x;q-next=p-next;p-next=q;temp

12、latet linklist:delete(int i)/删除第i个结点int n=0;node *p,*q;p=first;while(p-next&nnext;+n;q=p-next;p-next=q-next;return q-data;delete q;int main()node *p,*q,*r;int a10=0,1,2,3,4,5,6,7,8,9;linklist l1(a,10),l2,l3;/定义三个链表coutl1.length()next,q=l2.first,r=l3.first;l2.first=new node; l2.first-next=null; l3.fi

13、rst=new node; l3.first-next=null; while(p)/当链表l1中有元素时进行循环if(p-data%2=0)/当l1中的元素为偶数时插入l2 q=new node; q-data=p-data; q-next=l2.first-next; l2.first-next=q;else r=new node;r-data=p-data; r-next=l3.first-next; l3.first-next=r;p=p-next;l1.printlist( ); l2.printlist( );l3.printlist( ); cout链表的长度为:l1.lengt

14、h( )endl;cout链表的第四个元素为:l1.get(4)endl; cout链表中元素5为第l1.locate(5)个元素endl;l1.insert(4, 17);cout插入元素后链表为:; l1.printlist( );l1.delete(8);cout删除第8个元素后链表变为:; l1.printlist( );return 0;实验结果:3设计一个不带头结点的单链表类,要求: (1)不带头结点单链表类的成员函数包括取数据元素个数、插入元素、删除所有值为k的元素、取数据元素。 (提示:要考虑在第一个数据元素结点前插入和删除第一个数据元素结点时与在其他位置插入和删除其他位置结点

15、时的不同情况。)(2)设计一个测试主函数,实际运行验证所设计循环单链表类的正确性。实验代码:#includeusing namespace std;templatestruct nodet data;node *next;templateclass linklistpublic: linklist( )first=new node; first-next=null; /建立只有头结点的空链表linklist(t a,int n); linklist( );int length( ); /求单链表的长度t get(int i); /取单链表中第i个结点的元素值void insert(int i,

16、 t x); /在单链表中第i个位置插入元素值为x的结点 t delete(int i); /在单链表中删除第i个结点 void printlist( ); /遍历单链表,按序号依次输出各元素 private: node *first; /单链表的头指针;templatelinklist:linklist(t a,int n)int i=1;node *p,*q;first=new node;first-data=a0;first-next=null;p=first;for(i=1;in;i+)q=new node;q-data=ai;q-next=null;p-next=q;p=q;temp

17、latelinklist:linklist()node *p;p=first;while(p)p=p-next;delete first;first=p;templateint linklist:length( )int i=0;node *p;p=first;while(p)p=p-next;i+;return i;templatet linklist:get(int i)int j=1; node *p;p=first;while(p&jnext;j+;return p-data;templatevoid linklist:insert(int i, t x)int j=1;node *p

18、,*q;p=first;while(p&jnext;j+;q=new node;q-data=x;q-next=p-next;p-next=q;templatet linklist:delete(int i)int j=1;node *p,*q;p=first;while(p&jnext;j+;q=p-next; p-next=q-next;return q-data;delete q;templatevoid linklist:printlist()node *p;p=first;while(p)coutdatanext;coutendl;int main()int a10=0,1,2,3,

19、4,5,6,7,8,9;linklist l(a,10);cout链表长为:l.length()endl;cout链表的第6个元素为:l.get(6)endl;l.insert(5,17);cout在链表第5个位置插入元素17后链表变为:;l.printlist();l.delete(8);cout0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,并给出出

20、列人的编号序列。 测试数据: n=7,7个人的密码依次为3,1,7,2,4,8,4 初始报数上限值m=20实验代码:#includeusing namespace std;struct node/定义一个接点包含编号,密码,指针变量int num;int code;int data;/标志位,当该人没有被踢出时为1 node *next;class cirlistpublic:void done();/踢人,实现约瑟夫环的功能cirlist();/构造函数,建立一个带头结点的循环链表void inputcode();/输入密码private:node *first;int person;/定义

21、游戏人数;cirlist:cirlist()int i;node *p;first=new node;first-next=null;coutperson;for(i=person;i0;i-)p=new node;p-num=i;p-data=1;p-next=first-next;first-next=p;while(p-next)p=p-next;p-next=first;void cirlist:inputcode()node *p;int i;p=first-next;cout请输入每个人的密码:;for(i=0;ip-code;p=p-next;void cirlist:done(

22、)int m=20,n,i=1;node *p;p=first;p=p-next; for(n=person;n0;n-)while(i!=m)p=p-next;if(p-data=1)i+; coutnumcode;p-data=0;i=0;coutendl;int main()cirlist list;list.inputcode();list.done();return 0;实验结果:*5设计一个带头结点的循环双向链表类,要求:(1)带头结点循环双向链表类的成员函数包括:取数据元素个数、插入、删除、取数据元素。 (2)设计一个测试主函数,实际运行验证所设计循环双向链表类的正确性实验代码:

23、#includeusing namespace std;templatestruct nodet data;node *next,*front;template class linklistpublic:linklist( )first=new node; first-next=null;first-front=null; /建立只有头结点的空链表 linklist(t a , int n); /建立有n个元素的双向链表linklist( ); /析构函数int length( ); /求双向链表的长度t get(int i); /取双向链表中第i个结点的元素值int locate(t x);

24、 /求双向链表中值为x的元素序号void insert(int i, t x); /在双向链表中第i个位置插入元素值为x的结点t delete(int i); /在双向链表中删除第i个结点void printlist( ); /遍历单链表,按序号依次输出各元素private:node *first; /双向链表的头指针;templatelinklist:linklist(t a,int n)int i;node *p,*q;first=new node;first-front=null;first-next=null;p=new node;p-data=a0;first-next=p;p-fr

25、ont=first;p-next=null;for(i=1;in;i+)q=new node;q-front=p;p-next=q;q-next=null;q-data=ai;p=q; p-next=first;first-front=p;templatelinklist:linklist()node *p,*q;p=first;while(p-next=first)q=p;p=p-next;delete q;p-front=null;delete p;templateint linklist:length()node *p;int i=0;p=first;while(p-next!=firs

26、t)p=p-next;i+;return i;templatet linklist:get(int i)node *p;int j=0;p=first;while(jnext!=first)p=p-next;j+; return p-data;templateint linklist:locate(t x)int i=0;node *p;p=first; while(p-data!=x&p-next!=first)p=p-next;i+;return i;templatevoid linklist:insert(int i, t x)node *p,*q;int j=0;p=first; wh

27、ile(jnext!=first)p=p-next;j+;q=new node;q-data=x;q-next=p-next;p-next-front=q;p-next=q;q-front=p;templatet linklist:delete(int i)node *p,*q;int j=0;p=first; while(jnext!=first)p=p-next;j+;q=p-next;p-next=q-next; q-next-front=p;delete q;return q-data;templatevoid linklist:printlist( )/输出函数node *p;p=f

28、irst-next;while(p!=first)coutdatanext;coutendl;int main()int a10=0,1,2,3,4,5,6,7,8,9;linklist l(a,10);l.printlist( ); cout链表的长度为:l.length( )endl;cout链表的第四个元素为:l.get(4)endl; cout链表中元素5为第l.locate(5)个元素endl;l.insert(4, 17);cout在第四个位置插入元素17后链表为:; l.printlist( );l.delete(8);cout删除第8个元素后链表变为:; l.printlist

29、( );return 0;实验结果:*6设计一个单链表实现一元多项式求和问题。要求: (1)设计存储结构表示一元多项式; (2)设计算法实现一元多项式相加。 实验代码:#include using namespace std;struct nodeint e;int x;node *next; ;class linklistpublic:linklist()first=new node;first-next=null;linklist(int a,int b,int n); /建立有n个元素的单链表void printlist(linklist &l); /遍历单链表,按序号依次输出各元素fr

30、iend void function (linklist &la,linklist &lb,linklist &lc);/友元函数,多项式的加减private:node *first; /单链表的头指针;linklist :linklist(int a,int b,int n)/生成多项式first=new node; /生成头结点node *r=first; /尾指针初始化for ( int i=0; ie=ai;s-x=bi;r-next=s; r=s; /插入到终端结点之后r-next=null; /单链表建立完毕,将终端结点的指针域置空void linklist :printlist(linklist &l) /输出多项式coutnext;while(p)if(!p-next)coutxxeendl;else coutxxenext;int main () void function(linklist &la,l

温馨提示

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

评论

0/150

提交评论