C++课程设计报告.docx
- 文档编号:11433820
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:12
- 大小:20.31KB
C++课程设计报告.docx
《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
C++课程设计报告
C++课程设计报告
一、课程设计目的及要求
21、1设计目的
21、2设计要求
21、2、1封装一个完善的字符串,实现字符串的基本操作
21、2、2、利用C++中的类实现线性链表的常见操作
21、2、3编写一个银行ATM自动取款机模拟程序3
二、课程设计具体实现
32、1封装一个完善的字符串,实现字符串的基本操作
32、1、1总体设计(总的任务画出总体设计图,总体设计方案及主要设计原理;(算法的设计))
32、1、2详细设计(要求详细写出每个模块的功能实现,关键技术,关键代码解释等。
)
42、1、3调试及问题解决
62、2利用C++中的类实现线性链表的常见操作
62、2、1总体设计
62、2、2详细设计
62、2、3调试及问题解决
62、3编写一个银行ATM自动取款机模拟程序
62、2、1总体设计
62、2、2详细设计
62、2、3调试及问题解决6
三、结束语(包括感想、致谢、设计总结)6
四、源代码(代码要加注释)
64、1封装一个完善的字符串,实现字符串的基本操作
64、2利用C++中的类实现线性链表的常见操作
94、3编写一个银行ATM自动取款机模拟程序1
94、3、1面向过程的程序设计1
94、3、2面向对象的程序设计24
一、课程设计目的及要求
1、1设计目的软件工程专业所开设的C++课程设计是教学实践环节中一项重要内容,进行此课程设计的旨在:
1、提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
2、培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3、学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。
1、2设计要求
1、2、1封装一个完善的字符串,实现字符串的基本操作要求如下:
l定义一个串类CMyString,建立适当的构造函数l字符串使用指针保存字符串l必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载[]),完成串的赋值与合并(重载+),得到表示字符串的指针地址l在字符串类的基础上封装彩色字符串类。
(学会使用继承和多态)可选
1、2、2、利用C++中的类实现线性链表的常见操作l带表头结点(存放的是该线性链表的长度),结点存放的是整型数值;l实现以下操作:
n置空MakeEmpty()n求长度Length()n插入Insert(intx,inti):
将x插入到第i个结点(不含头结点)的之后;n删除Delete(intx):
删除链表中值为x的结点,成功返回1,否则返回0;n删除ReMove(inti):
删除链表中第i个结点,成功返回1,否则返回0;n搜索Find(intx):
在链表中查找数值为x的结点,成功返回1,否则返回0;n显示Display():
显示整个链表各结点的数值。
l写出类的构造函数、复制构造函数及析构函数l编写一个函数,使用户通过选择进行相关链表操作。
1、2、3编写一个银行ATM自动取款机模拟程序实现ATM取款机的基本功能,如给用户提供查询余额、取款、修改密码、吃卡、退出系统等服务,可根据实际情况添加(如缴费、转账等服务)。
l对于用户要求输入相应的帐号和密码,如果三次出错则将卡吃掉并打印出相应凭条。
l若输入的取款金额超出账户余额,则提示用户输入有误并提供更正功能
二、课程设计具体实现
2、1封装一个完善的字符串,实现字符串的基本操作
2、1、1总体设计(总的任务画出总体设计图,总体设计方案及主要设计原理;(算法的设计))CMyString-string:
char*-length:
int+CMyString():
+CMyString(s:
char*):
+CMyString(s:
CMyString&):
+getlength():
int+getcontents():
void+setcontents(s:
char*):
void+friendvoidstrpare(str1:
CMyString,str2:
CMyString):
+strjudge():
void+operator[](n:
int)
:
char&+friendCMyStringoperator+(CMyString&st1,CMyString&st2):
+voidoperator=(constCMyString&s):
图1-1-1字符串类的类图通过类来实现字符串的封装,用成员函数和友元函数、运算符的重载来实现字符串的基本操作。
2、1、2详细设计(要求详细写出每个模块的功能实现,关键技术,关键代码解释等。
)操作模式:
功能实现:
用一个主函数,把许多功能融入集中关键代码:
voidmain(){charstr[2][100];for(inti=0;i<2;i++){cout<<"第"<
";cin>>str[i];}CMyStringstr1(str[0]),str2(str[1]);cout<<"第一个字符串的长度:
"< 1、getlength()< "< 2、getlength()< ";strpare(str1,str2);cout<<"判断字符串是否为空,并置空: "< 1、strjudge();cout<<"第二个字符串";str 2、strjudge();str 1、setcontents("liyushan");str 2、setcontents("studieshard、");CMyStringstr3("chengjingui");//字符串的赋值(调用带一个参数的构造函数)cout<<"第三个对象的内容: ";str 3、getcontents();cout<<"输入一个小于等于"< 3、getlength()<<"的正整数: ";intj;cin>>j;cout<<"输出第"< "< "< 3、getlength()< ";str 3、getcontents();str 3、、getaddress();}字符串类: 功能: 实现字符串的封装,安全关键代码: classCMyString//类的定义{char*string;//字符串的内容intlength;//字符串的长度public: CMyString()//不带参数的构造函数{length=0;string=NULL;}CMyString(char*s)//带一个参数的构造函数{length=strlen(s);string=newchar[length+1];strcpy(string,s);}CMyString(CMyString&s)//拷贝构造函数: 来实现对象之间的拷贝{length=s、length;string=s、string;}…………};字符串的比较: 功能: 实现字符串的比较代码: voidstrpare(CMyStrings1,CMyStrings2)//字符串的比较的实现(友元函数){ints;s=strcmp(s 1、string,s 2、string);if(s>0) cout< 1、string<<"大于"< 2、string< cout< 1、string<<"小于"< 2、string< 1、string<<"等于"< 2、string< 1、运用到类的成员函数的类外定义 2、运用到string、h头文件中的strcmp()字符串的长度: 代码: voidgetcontents()//求字符串的内容{cout< 关键代码: friendvoidstrpare(CMyStringstr1,CMyStringstr2);//友元函数实现两个字符串对象的比较的声明voidstrpare(CMyStrings1,CMyStrings2)//字符串的比较的实现(友元函数){ints;s=strcmp(s 1、string,s 2、string);if(s>0) cout< 1、string<<"大于"< 2、string< cout< 1、string<<"小于"< 2、string< 1、string<<"等于"< 2、string< 1、运用友元函数并类外定义: 先声明再定义(不要加限定符) 2、要加关键字: friend函数参数为对象 3、运用函数: strcmp()置空且赋值: 功能的实现: 是先用delete来置空,再分配内存进行赋值代码: voidsetcontents(char*s)//先置空,再重置字符串的内容{length=strlen(s);cout< "< 1、参数为指针 2、指针要先分配内存再运用 3、运用newdelede来分配动态内存 4、要注意内存长度的选择(内存的空间)求字符串中的一个字符: 功能: 要用运算符的重载[]关键代码: char&operator[](intn)//求字符串中的字符用运算符重载[]{staticcharch=0;if(n>length-1){cout<<"整数下标越界"< 下标[]运算符的重载: 返回类型是char&完成串的赋值与合并: 实现: 重载+关键代码: CMyStringoperator+(CMyString&st1,CMyString&st2)//运算符+重载的实现(友元函数): 实现两个字符串的连接{CMyStringt;t、length=st 1、length+st 2、length;//连接时: 先计算长度,t、string=newchar[t、length+1];//再重新分配内存strcpy(t、string,st 1、string);//先拷贝再连接strcat(t、string,st 2、string);returnt;//返回类型是对象t}注意: 先分配再拷贝链接voidoperator=(constCMyString&s)//运算符=的重载{deletestring;string=newchar[strlen(s、string+1)];strcpy(string,s、string);}注意: 参数为类的引用得到表示字符串的指针地址: voidgetaddress()//得到字符串的指针地址{cout<<"字符串的指针地址: "<<&string< 2、1、3调试及问题解决问题1: 出现乱码,内存为空解决: 析构与置空同时运用,使内存出现2次删除,出现错误运用默认构造函数问题2: 拷贝构造函数的深浅拷贝问题解决: 定义拷贝构造函数问题3: 运算符的重载问题解决: 要对=进行重载解决问题 2、2利用C++中的类实现线性链表的常见操作 2、2、1总体设计NodeintData;Node*next;图2-2-1链表结构体list-Node*head;2-2链表类 2、2、2详细设计登录模式: 功能的实现: 用主函数: 开始出现功能代码 1、创建一个链表 2、在第i个结点处插入值为x的结点 3、求链表的长度 4、删除值为x的结点 5、删除第i个结点 6、搜索结点 7、显示所有的结点 8、置空结点 9、退出函数分别在其中调用各自的函数关键代码: voidmain(){inta;listb;cout<<"*******需要先创建一个链表再操作*****"< (1){cout<<"选择你所需要的服务"< 1、创建一个链表"< 2、在第i个结点后插入值为x的结点"< 3、求链表长度"< 4、删除值为x结点"< 5、删除第i个结点"< 6、搜索结点"< 7、显示所有结点"< 8、置空结点"< 9、退出程序"< "< {intx,i;cout<<"分别输入要插入的数、位置i"< "<>c;b、Delete(c);b、Display();}elseif(a==5){cout<<"请键入你所要删除的位置"< 谢谢使用! "< (1);}else{cout<<"你输入有误、"< "< 循环的运用Breakcontinuereturnexit()的不同和运用创建一个链表: 功能的实现: 运用类的成员函数关键代码: voidlist: : create(){Node*p,*tail;intdata,i;cout<<"输入链表的数据和长度"< "< 先确定插入的链表数当是0时: 我运用了递归让其建立一个不为空的链表当不为0时,我先建立一个头文件,再在尾部加入新的结点,从而建立一个链表在第i个结点处插入值为x的结点: 功能的实现: 需要找到第i个节点再插入x,不过要注意i的值llength: 提示错误,用循环重写li<=length: 插入头文件后或插入中间结尾关键代码: voidlist: : Insert(intx,inti)//将x插入到第i个结点(不含头结点)的之后{Node*p,*q,*s,*t=head;s=newNode;//创建新结点: ss->Data=x;while (1){s->Data=x;//新结点的数据是: xif(i>length){cout<<"输入有误,请重新输入: "< ";cin>>x>>i;continue;}else{for(intj=1;jnext)//查找第i个结点j++;p=t;//p指向第i个结点,q指向第i+1个结点q=p->next;if(p==NULL){head=s;s->next=NULL;}else{if(p->next! =NULL){s->next=q;p->next=s;}else{p->next=s;s->next=NULL;}}break;}}}求链表的长度: 功能的实现: 通过遍历链表来得到链表的长度关键代码: intlist: : Length()//求链表的长度(结点数){Node*p=head;if(p==NULL){cout<<"该链表是空的。 "< =NULL;p=p->next){length++;//长度}returnlength;}}注意: 函数类型为int删除值为x的结点功能的实现: 从头往后找值为x的结点,找到后将其删除关键代码: intlist: : Delete(intx)//删除链表中值为x的结点,成功返回1,否则返回0{Node*p=head,*q;//p用于指向结点x,q指向结点x的前一个结点(删除值为x的结点p)if(p==NULL) //若是空表{cout<<"这是个空的链表,删除失败! "< =x&&p->next! =NULL)//查找值为x的结点p;{q=p;p=p->next;}if(p->Data==x)//如果有值为x的结点,返回1{q->next=p->next;deletep;cout<<"删除了值为"< "< "< 找到结点将其删除关键代码: intlist: : ReMove(inti) //删除链表中第i个结点,成功返回1,否则返回0{Node*p,*q,*t=head;for(intj=1;jnext)//查找第i个结点j++;p=t;//p指向第i个结点,q指向第i+1个结点q=p->next;if(i==1){head=p->next;deletep;cout<<"删除第"< "< "< "< 功能的实现: 有循环的方法找到结点关键代码: intlist: : Find(intx)//在链表中查找数值为x的结点,成功返回1,否则返回0{Node*p=head;length=1;while(p! =NULL&&p->Data! =x){length++;p=p->next;}if(p->Data==x){cout<<"找到第"< "< "< 考虑空链表与非空的两种情况关键代码: voidlist: : Display()//显示整个链表各结点的数值并输出链表的长度{Node*p=head;length=0;if(head==NULL)cout<<"这是一个空的链表"< ";while(p! =NULL){cout< "< 功能的实现: 从头往后删除,循环时p=p->next;head=p->next;deletep;p=head;关键代码: voidlist: : MakeEmpty()//置空函数{Node*p=head;if(p==NULL)cout<<"这个链表是空的。 "< =NULL;p=p->next){head=p->next;deletep;p=head;}deletep;head=NULL;return;}}退出函数功能的实现: 用exit()函数关键代码: elseif(a==9){cout<<"BYEBYE! 谢谢使用! "< (1);}注意: 本操作要退出程序: 就需要退出循环,退出主函数,则用exit()或break或return注意他们的区别! exit()重要 2、2、3调试及问题解决问题1: 链表的设计怎么吧? 答: 需要先创建一个非空链表再进行其他的操作。 问题2: 缺少头函数? 答: 在用exit()时缺少头文件。 需要加上头文件#include 问题3: 创建一个链表时,当为空时不能继续进行? 答: 采用直接递归调用,实现创建一个非空的链表。 2、3编写一个银行ATM自动取款机模拟程序 2、2、1总体设计开始登陆界面输入选择代码i判断i的值i=ii=2i=3i=4i=5i=6i=7i为其他 2、2、2详细设计登陆模块: 功能的实现: 通过7个代码实现功能之间的选择 1、开户 2、存款 3、取款 4、查询余额 5、转账 6、更改密码 7、退出关键代码: voidmain(){inti;while (1){cout<<"\t\t*************************************************\n"< \n";cout<<"\t\t\t\t 1、开户\n";cout<<"\t\t\t\t 2、存款\n";cout<<"\t\t\t\t 3、取款\n";cout<<"\t\t\t\t 4、查询余额\n";cout<<"\t\t\t\t 5、转账\n";cout<<"\t\t\t\t 6、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 报告